0

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

当我运行一个使用 16 个线程的程序时,我看到该程序top以大约 1600% 的 CPU 运行,如果我切换“上次使用的 cpu (SMP)”,该数字会移动一点。所以 1600% 是有道理的,但是有没有办法知道线程在哪个 CPU 的哪些内核上运行?

如果这些问题看起来很幼稚,我对 openmp 还是很陌生。

4

1 回答 1

1

您可以使用hwloc工具集了解任何应用程序的线程与硬件线程/内核的绑定。您只需要目标运行进程的名称或 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_BINDOMP_PLACES)。

此外,您可以使用它  hwloc-ps来了解机器的拓扑结构(有多少核心、多少线程、它们如何连接等)。我很惊讶您可以拥有 16 个“AMD Opteron(tm) 处理器 6136 CPU”。实际上,该处理器使用G34 插槽,最多可提供 4 个插槽(和 8 个芯片)。所以,请检查这个hwloc-ps

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

于 2020-03-14T15:27:15.940 回答