23
vector<int> v;

#pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1)
    for (int i = 0; i < n; ++i){
            ...
            ...
            ...
#pragma omp ordered
            v.push_back(i);
    }

vこれは、nサイズ設定された順序付きリストでいっぱいになります。

ブロックに到達すると、omp orderedすべてのスレッドは可能な限り低い反復のスレッドが終了するのを待つ必要がありますが、その特定の反復が指定されたスレッドがない場合はどうなりますか?または、OpenMPランタイムライブラリは常に、最も低い反復が何らかのスレッドによって処理されることを確認しますか?

orderedまた、なぜ節を?と一緒に使用することが提案されているのdynamic scheduleですか?static scheduleパフォーマンスに影響しますか ?

4

1 に答える 1

54

句は次のorderedように機能します。異なるスレッドは、リージョンに遭遇するまで同時にordered実行されます。リージョンは、シリアルループで実行されるのと同じ順序で順番に実行されます。orderedこれにより、特にリージョン外のコードセクションの実行時間がかなり長い場合は、ある程度の同時実行が可能になります。

チャンクサイズが小さいdynamicスケジュールの代わりにスケジュールを使用する特別な理由はありません。staticそれはすべてコードの構造に依存します。orderedスレッド間に依存関係が導入されるため、デフォルトのチャンクサイズで使用するとschedule(static)、2番目のスレッドは最初のスレッドがすべての反復を完了するのを待つ必要があり、3番目のスレッドは2番目のスレッドが反復を完了するのを待つ必要があります(したがって最初のものについても)など。3つのスレッドと9つの反復(スレッドごとに3つ)で簡単に視覚化できます。

tid  List of     Timeline
     iterations
0    0,1,2       ==o==o==o
1    3,4,5       ==.......o==o==o
2    6,7,8       ==..............o==o==o

=スレッドがコードを並行して実行していることを示しています。oスレッドがorderedリージョンを実行しているときです。.スレッドはアイドル状態で、その順番がorderedリージョンを実行するのを待っています。schedule(static,1)次のようになります。

tid  List of     Timeline
     iterations
0    0,3,6       ==o==o==o
1    1,4,7       ==.o==o==o
2    2,5,8       ==..o==o==o

どちらの場合も違いは明らかだと思います。上記の図でschedule(dynamic)は、各スレッドに割り当てられた反復のリストが非決定論的であるため、多かれ少なかれランダムになります。また、追加のオーバーヘッドが追加されます。計算の量が反復ごとに異なり、動的スケジューリングを使用する場合の追加のオーバーヘッドよりも計算に時間がかかる場合にのみ役立ちます。

最小の反復回数について心配する必要はありません。通常、コードを実行する準備ができるようになるために、チームの最初のスレッドに処理されます。

于 2012-11-05T11:06:48.333 に答える