私は OpenMP を使用するコードを調べていますが、あまり詳しくありません。(コードも OpenMP も。)
それに対してプロファイラーを実行すると、プログラムが「OMP 暗黙のバリア」関数で実時間の約 20% を費やしていることがわかります。
それは OpenMP の典型的なものですか、それとも (おそらく) ワークロードがスレッド間で均等に分散されていないことを意味しますか?
ありがとう
私は OpenMP を使用するコードを調べていますが、あまり詳しくありません。(コードも OpenMP も。)
それに対してプロファイラーを実行すると、プログラムが「OMP 暗黙のバリア」関数で実時間の約 20% を費やしていることがわかります。
それは OpenMP の典型的なものですか、それとも (おそらく) ワークロードがスレッド間で均等に分散されていないことを意味しますか?
ありがとう
for
(C/C++ の場合) またはdo
(Fortran の場合) のように、ほとんどの OpenMP コンストラクトの最後に暗黙のバリアがありsections
、single
(ただし、master
コンストラクトの最後にバリアはありません)。ワークシェアリング ディレクティブの後で異なるスレッドを非同期で実行することがアルゴリズムで許可されている場合、このnowait
句を使用してこれらの暗黙的なバリアを無効にすることができます。別の暗黙的なバリアは、フォーク/ジョイン実行モデルの一部として、各並列領域の最後に配置されます。
暗黙のバリア待機時間のパーセンテージが高いということは、通常、ワークシェアリングが最適とはほど遠いことを意味していると正しく推測しました。(多数の) 大きな構造体が存在するか、反復ごとに実行時間が変化single
する並列ループ ( for
/構造体) が存在する可能性があります。do
不均衡が反復ごとに異なる計算時間を伴うループに起因する場合 (標準的な例はマンデルブロ集合の描画です)、ループ スケジュールを次の節をdynamic
使用するように変更できます。schedule(dynamic,chunk)
chunk
チャンクサイズ (>= 1)。チャンク サイズが小さいほど、ロード バランシングは向上しますが、動的ループ ディスパッチャのオーバーヘッドが高くなります。チャンク サイズが大きいほどオーバーヘッドは低くなりますが、負荷の不均衡が大きくなります。最適な値は、問題の種類やハードウェアに依存することが多いため、コードが実行される特定のシステムで最高のパフォーマンスを得るには、値を微調整する必要があります。