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)。
我想知道 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)。