2012-05-04 16 views
8

後の暗黙のバリアは、例えばOMPクリティカルセクションOMPクリティカルセクション

後の暗黙のOMPバリアがそこにあると、私はバージョン2にバージョン-1、この次のコードを変更することができます。

VERSION-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) 
    } 
} 

VERSION-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クリティカル領域の後に暗黙バリアがありますか?

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

+0

これはおそらく最良の例ではありません。なぜなら、平行領域を離れるときに障壁が存在するからです。それにもかかわらず、良い質問。 +1 – Mysticial

+0

あなたが掲示した人為的な例でv2 over v1でパフォーマンス上の利点はありませんが、現実の世界では可能性があります。 –

答えて

11

クリティカルセクションが持っていない障壁彼らの始まりでも終わりでもない。クリティカルセクションは、複数のスレッドが同じデータに同時にアクセスするのを防ぐ、それ自体のシンクロナイゼーション構造です。並列領域を終了する前に、大域的な最小値を確保したい場合は、クリティカルセクションの後に追加のバリアが必要です。すでに述べたように、平行領域には暗黙のバリアが最後にあります。

0

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

関連する問題