2

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

谢谢!!

4

2 回答 2

2

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

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

于 2013-04-10T20:11:22.067 回答
2

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

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

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整个过程的值的原因。

于 2013-04-11T13:33:16.137 回答