我正在尝试使用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,但这并没有解决问题。
谢谢!
答案 0 :(得分:2)
没有;这只是线程和进程之间的区别。
Threads都存在于process之内;所以只有一个PID。大%CPU就是这些数字的报告方式; >这里100%表示肯定使用了多个CPU。 top
命令在这里很有用;如果你运行top -H
,你应该能够单独看到每个线程,如果你在运行时按 1 ,你将能够看到CPU使用每个CPU,这也将帮助分解所有正在运行的线程。
答案 1 :(得分:2)
请注意,OpenMP将所有环境变量定义为全部大写,而在Unix上,环境区分大小写,例如: OMP_NUM_THREADS
与omp_num_threads
不同。在我看来,您的程序可能以超过12个线程的方式运行,我会说80个线程给出了7771%的CPU使用率(您是否运行在具有8个10核CPU的系统上?)。默认情况下,libgomp
(GNU OpenMP运行时)使用的线程数与可用逻辑CPU数一样多。
您可以指示ps
通过H
或m
选项在每个流程中显示各个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
值不相加的原因。