12

ompクリティカルセクションの後に暗黙のompバリアがありますか

たとえば、次のコードバージョン1をバージョン2に変更できますか?

バージョン-1

int min = 100;
#pragma omp parallel
{
   int localmin = min;

   #pragma omp for schedule(static)
   for(int i = 0; i < 1000; i++)
       localmin = std::min(localmin, arr[i]);

   #pragma omp critical
   {
      min = std::min(localmin, min)
   }
}

バージョン-2

int min = 100;
#pragma omp parallel
{
   int localmin = min;

   #pragma omp for schedule(static) nowait
   for(int i = 0; i < 1000; i++)
       localmin = std::min(localmin, arr[i]);

   #pragma omp critical
   {
      min = std::min(localmin, min)
   }
} // will I get the right "min" after this (because I have included nowait)

バージョン1とバージョン2の両方で同じ結果が得られますか?

ompクリティカル領域の後に暗黙のバリアがありますか?

編集: 例が非常に貧弱な場合は申し訳ありません..また、バージョン1とバージョン2の間にパフォーマンスの違いがあるかどうかを知りたいです

4

2 に答える 2

14

クリティカルセクションには、最初にも最後にも障壁がありません。クリティカルセクションは、複数のスレッドが同じデータに同時にアクセスするのを防ぐ、それ自体の同期構成です。並列領域を終了する前に正しいグローバル最小値を取得したい場合は、クリティカルセクションの後に追加のバリアが必要です。すでに述べたように、並列領域には最後に暗黙のバリアがあります。

于 2012-05-04T10:46:00.893 に答える
0

反復回数が多い場合は、nowaitを使用すると、パフォーマンスが向上します。

于 2012-05-07T08:08:56.073 に答える