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

时间:2013-04-10 18:39:20

标签: multithreading openmp

我正在尝试使用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,但这并没有解决问题。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

您可以指示ps通过Hm选项在每个流程中显示各个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值不相加的原因。