Linux openMp和内核与CPU的数量

Linux openMp和内核与CPU的数量,linux,multithreading,openmp,cpu-cores,Linux,Multithreading,Openmp,Cpu Cores,我想知道openmp是如何通过omp_get_max_threads库调用计算出它可以运行多少线程的。我使用gcc-fopenmp在centOS linux机器上运行。我的机器有16个AMD Opterontm处理器6136个CPU,每个CPU有8个内核,所有这些都符合/proc/cpuinfo。如果我运行omp\u get\u num\u程序,它将返回16。但是omp_get_max_线程也返回16。为什么最大线程数不是16*8 当我运行一个使用16个线程的程序时,我看到该程序在运行时占用大约

我想知道openmp是如何通过omp_get_max_threads库调用计算出它可以运行多少线程的。我使用gcc-fopenmp在centOS linux机器上运行。我的机器有16个AMD Opterontm处理器6136个CPU,每个CPU有8个内核,所有这些都符合/proc/cpuinfo。如果我运行omp\u get\u num\u程序,它将返回16。但是omp_get_max_线程也返回16。为什么最大线程数不是16*8

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

我对openmp非常陌生,如果这些问题看起来很幼稚,那么很抱歉。

您可以使用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
在这里,我们可以看到PID 2038168的进程a.out在不同的内核上使用了6个线程,每个线程映射一个线程。 但是,如果您没有正确配置OpenMP,则内核上线程的映射随着时间的推移可能会发生变化。起点是设置环境变量和

此外,您可以使用hwloc ps了解机器的拓扑结构有多少核、有多少线程、它们是如何连接的等等。。 我很惊讶你能有16个AMD Opterontm处理器6136个CPU。事实上,可以使用多达4个插座布置和8个模具中提供的。因此,请与hwloc ps核对


另一种方法是使用分析工具,如“英特尔VTune”。

您的线程可能会从一个cpu迁移到另一个cpu,因此这不是一个常量。多亏了这些信息。非常有帮助!是的,我误解了/proc/cpuinfo中的信息。它列出了16个处理器条目,每个处理器块都有条目cpu cores:8。我没有意识到处理器是逻辑条目。cpu cores条目在每个块中重复的事实有点令人困惑,但这是我从文件信息计算物理cpu数量的唯一方法:16个处理器/8个内核/cpu=2个AMD 6136 cpu。