openMp 和核心数与 cpus

openMp and the number of cores vs cpus

我想知道 openmp 如何通过 omp_get_max_threads() 库调用计算出它可以 运行 多少个线程。我 运行 在 centOS linux 机器上使用 gcc -fopenmp。我的机器有 16 个 AMD Opteron(tm) 处理器 6136 CPUs,每个有 8 个内核,全部根据 /proc/cpuinfo。如果我 运行 omp_get_num_procs() 它 returns 16. 但是 omp_get_max_threads() 也 returns 16. 为什么最大线程数不是 16*8?

当我 运行 一个使用 16 个线程的程序时,我在 top 运行 中看到该程序在 CPU 的 ~1600%,如果我切换 'Last used cpu (SMP)' 这个数字有点移动。所以 1600% 是有道理的,但是有什么方法可以知道线程在 CPU 的哪个核心 运行 上?

我是 openmp 的新手,如果这些问题看起来很幼稚,我很抱歉。

您可以使用 hwloc 工具集了解任何应用程序的线程与硬件的绑定 threads/cores。您只需要目标 运行 进程的名称或 PID。这是一个例子:

$ hwloc-ps --pid 2038168 --threads --get-last-cpu-location
2038168 Machine:0       ./a.out
 2038168    Core:5      a.out
 2038169    Core:3      a.out
 2038170    Core:1      a.out
 2038171    Core:4      a.out
 2038172    Core:0      a.out
 2038173    Core:2      a.out

在这里我们可以看到进程 a.out(PID 为 2038168)使用 6 个线程,每个线程映射在不同的内核上。 但是,如果您没有正确配置 OpenMP,线程在内核上的映射会随着时间的推移而改变(起点是设置环境变量 OMP_PROC_BIND and OMP_PLACES)。

此外,您可以使用 hwloc-ps 来了解您机器的拓扑结构(有多少个内核、多少个线程、它们是如何连接的等等)。 我很惊讶你可以有 16 "AMD Opteron(tm) Processor 6136 CPUs"。实际上,this processor use the G34 socket 最多可用于 4 插槽排列(和 8 个管芯)。所以,请用 hwloc-ps!

检查一下

另一种方法是使用分析工具(例如 Intel VTune)。