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_THREADS
与 omp_num_threads
不同。在我看来,您的程序可能运行超过 12 个线程,考虑到 7771% 的 CPU 使用率,我会说 80 个线程(您是否在具有 8 个 10 核 CPU 的系统上运行?)。默认情况下,libgomp
(GNU OpenMP 运行时)使用与可用逻辑 CPU 数量一样多的线程。
您可以通过H
或m
选项指示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 创建了许多线程,但似乎只使用一个内核的主要内容,如果未能解决你的问题,请参考以下文章