Openmp 创建了许多线程,但似乎只使用一个内核

Posted

技术标签:

【中文标题】Openmp 创建了许多线程,但似乎只使用一个内核【英文标题】:Openmp creates many threads but seems to use only one core 【发布时间】:2013-04-10 18:39:20 【问题描述】:

我正在尝试使用 OpenMP 在 Fortran 中并行化 for 循环。

它似乎工作正常,它确实创建了正确数量的线程,并且比原始串行版本快得多。

但是,%CPU 使用率非常高,让我担心线程只集中在一个或两个内核上(与我在网上看到的每个线程都有自己的 PID 的示例相反)。

$ export omp_num_threads=12
$ nohup ./z90nr&
$ ps aurx
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ty       25350 7771  0.0 1564928 26868 pts/9   Rl   14:18 169:40 ./z90nr

这是一个问题吗?如果是,我该如何解决? 我尝试设置 GOMP_CPU_AFFINITY,这并没有解决问题。

谢谢!!

【问题讨论】:

【参考方案1】:

没有;这只是线程和进程的区别。

Threads都存在于一个process中;所以只有一个PID。大的 %CPU 就是这些数字的报告方式; >100% 这里表示肯定有不止一个 CPU 正在使用。 top 命令在这里很有帮助;如果您运行top -H,您应该能够单独查看每个线程,如果您在运行时按 1,您将能够看到每个 CPU 的 CPU 使用情况,这也有助于分解所有正在运行的线程。

【讨论】:

实际上线程是不同的LWP,每个都有一个单独的Task ID,但PID相同。我不记得如何让ps 打印 TID。【参考方案2】:

请注意,OpenMP 将其所有环境变量都定义为大写,在 Unix 上,环境是区分大小写的,例如OMP_NUM_THREADSomp_num_threads 不同。在我看来,您的程序可能运行超过 12 个线程,考虑到 7771% 的 CPU 使用率,我会说 80 个线程(您是否在具有 8 个 10 核 CPU 的系统上运行?)。默认情况下,libgomp(GNU OpenMP 运行时)使用与可用逻辑 CPU 数量一样多的线程。

您可以通过Hm 选项指示ps 在每个进程中显示各个LWP,例如ps auxrm。对于所有 LWP 具有相同值的 m 字段将替换为破折号,例如:

USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hristo   529  188  3.9 3078268 2574692 pts/21 -   15:16   0:03 ./omp_memset2
hristo     - 55.5    -      -     - -        Rl+  15:16   0:01 -
hristo     -  0.0    -      -     - -        Sl+  15:16   0:00 -
hristo     - 39.0    -      -     - -        Rl+  15:16   0:00 -
hristo     - 36.0    -      -     - -        Rl+  15:16   0:00 -
hristo     - 56.5    -      -     - -        Rl+  15:16   0:01 -

对于H,这些字段具有实际值,但由于它们是在不同的时刻采样的,因此值可能不同(并非所有 LWP 共享相同的进程页表,因此不能具有不同的值诸如驻留集大小之类的东西)。这也是为什么单个 %CPU 值加起来不等于整个过程的 %CPU 值的原因。

【讨论】:

以上是关于Openmp 创建了许多线程,但似乎只使用一个内核的主要内容,如果未能解决你的问题,请参考以下文章

使用 openMP 进行多核处理与多线程

确保混合 MPI / OpenMP 在不同的内核上运行每个 OpenMP 线程

如何确认多核系统中的openmp是不是使用了所有内核?

Pthreads 与 OpenMP

Visual C++ 只有一个线程工作 (OpenMP)

使用 openmp 时运行的线程数不一致