ホームページ >バックエンド開発 >C++ >OpenMP の並列ループ内で「omp requested」句はどのようにして順次実行を保証するのでしょうか?

OpenMP の並列ループ内で「omp requested」句はどのようにして順次実行を保証するのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 10:42:31250ブラウズ

How does the `omp ordered` clause ensure sequential execution within a parallel loop in OpenMP?

omp 順序句を理解する

OpenMP の omp 順序句は、スレッドの実行を調整して、並列ループ内のコード セクションの順次実行を保証します。複数のスレッドは、順序付けされた領域に到達するまで同時に実行され、シリアル ループの場合と同じ順序で同期して処理が進みます。

次のコードを考えてみましょう:

<code class="cpp">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);
}</code>

このコードは、次のことを保証します。ベクトル v には、n 個の要素を含む順序付きリストが入力されます。

スレッド同期

スレッドが omp 順序付きブロックに遭遇すると、スレッドがそのブロックを実行するのを待つ必要があります。可能な限り最小の反復。この同期は、シリアル ループで指定された実行順序を維持するため、非常に重要です。 OpenMP ランタイム ライブラリは通常、実行準備が整った最初のスレッドに最も低い反復を割り当てます。

スケジューリングの影響

一方、ordered 句は動的両方で使用できます。静的スケジューリングの場合は、動的スケジューリングをお勧めします。静的スケジューリングでは、スレッドの反復が事前に定義されているため、すでに反復を完了しているスレッドに最下位の反復が割り当てられている場合、スレッドのアイドリングが発生する可能性があります。

動的スケジューリングでは、反復は実行時に割り当てられます。スレッドがアイドル状態になる可能性を減らします。ただし、ある程度のオーバーヘッドが発生するため、動的スケジューリングに費やされる時間が、順序付けされた領域の実行時間と比較して無視できる場合にのみ考慮する必要があります。

複数のスレッドによる順序付けされた実行

順序付けられた実行を説明するために、3 つのスレッドと 9 つの反復があり、各スレッドが 3 つの反復を担当するシナリオを考えてみましょう。チャンク サイズが 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

動的スケジューリングでは、各スレッドに割り当てられる反復のリストが決定的ではないため、実行タイムラインはランダム化されます。 .

ordered 句で動的スケジューリングを使用すると、並列ループ内で正しい実行順序を維持しながら同時実行性を実現できます。

以上がOpenMP の並列ループ内で「omp requested」句はどのようにして順次実行を保証するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。