Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

3.1 OpenMP 実行モデル

OpenMP は並行実行の fork-join モデルを使用します。スレッドは並列構文を検出すると、それ自体とほかのヘルパースレッドで構成されるチームを構成します (ほかのスレッドがまったくないこともあります)。並列構文を検出したスレッドは、このチームのマスタースレッドとなり、すべてのスレッドは、並列領域内のコードを実行します。各スレッドは並列領域内での処理を終了すると、その並列領域の最後にある暗黙バリアで待ち状態となります。チーム内のすべてのスレッドがバリアで待ち状態に入れば、スレッドは解放されます。マスタースレッドだけは並列構文の処理が終了したあとも続けてプログラム内のユーザーコードを実行しますが、ヘルパースレッドは今度は別のチームを構成するための呼び出しの待ち状態に入ります。

OpenMP での並列領域は、互いに入れ子にすることができます。入れ子並列処理を無効にすると、入れ子並列領域を実行するチームは 1 つのスレッド (入れ子になった parallel 構文を検出したスレッド) のみで構成されます。入れ子並列処理が有効になっていれば、複数のスレッドでチームが作成されます。

OpenMP 実行時ライブラリにはヘルパースレッドがプールされていて、並列領域内での処理に使用されます。あるスレッドが並列構文の検出時に複数のスレッドで構成されるチームを要求する場合は、そのスレッドは、最初にプールを調べてアイドル状態のスレッドを選択し、自身のチームの一部にします。プールに十分な数のアイドルスレッドが含まれていない場合は、検出されたスレッドが要求より少ないヘルパースレッドを取得することがあります。チームが並列領域での処理を完了すると、ヘルパースレッドはプールに返されます。