2

OpenMP を使用して Fortran の for ループを並列化しようとしています。

正常に動作しているように見えます。間違いなく適切な数のスレッドが作成され、元のシリアル バージョンよりもはるかに高速に動作します。

ただし、%CPU 使用率が非常に高く、スレッドが 1 つまたは 2 つのコアに集中しているのではないかと心配しています (各スレッドが独自の 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

OpenMP はすべての環境変数をすべて大文字で定義し、Unix では環境で大文字と小文字が区別されることに注意してください。たとえばOMP_NUM_THREADS、 は と同じではありませんomp_num_threads。あなたのプログラムはおそらく 12 を超えるスレッドで実行されているように思われます。CPU 使用率が 7771% であることを考えると、80 スレッドと言えます (8 つの 10 コア CPU を搭載したシステムで実行していますか?)。デフォルトlibgomp(GNU OpenMP ランタイム) は、使用可能な論理 CPU の数と同じ数のスレッドを使用します。

またはオプション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 に答える
2

いいえ; これは、スレッドとプロセスの違いにすぎません。

スレッドはすべて 1 つのプロセス内に存在します。したがって、PID は 1 つだけです。そして、大きな %CPU は、単にこれらの数値が報告される方法です。ここで >100% は、複数の CPU が確実に使用されていることを示します。topコマンドはここで役に立ちます。実行top -Hすると、各スレッドを個別に表示できるはずです。実行1中に を押すと、CPU ごとの CPU 使用率を確認できます。これは、実行中のすべてのスレッドを分解するのにも役立ちます。

于 2013-04-10T20:11:22.067 に答える