0

他のスレッドが続行する前に最初の反復を完了させたい OpenMP ループがあります。「false」に初期化されたグローバル変数を使用してみましたが、最初の反復が終了すると「true」に設定されますが、これは期待どおりに機能しないようです (無限ループに陥ります)。

例えば:

    bool FirstDone = false; // This is a global variable
    ...
    #pragma omp parallel for
    for(int i=0;i<max;i++)
    {
        while(!FirstDone && i>0){}

        if(i==0)
        {
            // Do something
            FirstDone = true;
        }
    }

これが機能しない理由を誰かが明らかにすることはできますか?

4

6 に答える 6

2

ここでは、@HighPerformanceMark の回答をより明確な方法 (つまり、ステートメントをサポートするためのコード スケッチ) に言い換えてみます。アイデアを修正するために、ループのシリアルバージョンが次のようになっているとしましょう。

for(int ii = 0; ii < max; ii++)
{   
    // Do a lot of work based on ii
    if(ii==0)
    {
        //////////////////////////////////////////////////
        // Do something special for the first iteration //
        //////////////////////////////////////////////////
    }
}

以前の回答で簡単に提案されたのは、この単純なロジックで並列化することでした

// Move the loop body into a function
void loopIteration(const size_t ii) {
    // Do a lot of work based on ii
}

#pragma omp parallel
{
// Single directive: the first one enters, the other wait at the implicit barrier
#pragma omp single
    {
        loopIteration(0);
        //////////////////////////////////////////////////
        // Do something special for the first iteration //
        //////////////////////////////////////////////////
    } // single: implicit barrier
// Loop work-sharing construct on the remaining iterations
#pragma omp for
    for(int ii = 1; ii < max; ii++)
    {   
       loopIteration(ii);         
    } // for: implicit barrier
} // parallel

主なアイデアは、ループ本体を関数に移動してコードの重複を回避し、ループから最初の反復を明示的に展開することです。

于 2013-10-15T19:28:57.170 に答える
2

最初の反復を OpenMPsingleコンストラクト内にラップできます。これにより、コンストラクトに遭遇した最初のスレッドがそれを実行し、他のすべてのスレッドはコンストラクトが終了するまで待機してから残りの計算を続行することが保証されます。

于 2013-10-14T10:08:23.423 に答える
1

ordered句とリージョンを使用することでこれを達成できると思います。

#pragma omp parallel for ordered
for(int i=0;i<max;i++)
{
    #pragma omp ordered
    if (i == 0)
    {
        // Do stuff in the first iteration, others wait.
    }

}

これにより、パフォーマンスのオーバーヘッドが発生する場合があります。

于 2013-10-14T11:10:38.970 に答える