#pragma omp for

説明

omp for ディレクティブは、 この作業共有構成を検出するスレッドのチーム内でループ反復を配布するようコンパイラーに命令します。

構文

構文図を読む構文図をスキップする                       .-,--------------------.
                       V                      |
>>-#--pragma--omp for----+------------------+-+----------------><
                         '-clause--for-loop-'
 

ここで、clause は、次のいずれかです。

private (list) list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 list 内のデータ変数は、コンマで区切られています。
firstprivate (list) list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 それぞれの新規の private オブジェクトは、ステートメント・ブロック内に暗黙の宣言がある場合のように初期化されます。 list 内のデータ変数は、コンマで区切られています。
lastprivate (list) list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 list 内の各変数の最終値は、割り当てられる場合、 最後の反復でその変数に割り当てられる値となります。 値が割り当てられていない変数は、不確定値を持っています。 list 内のデータ変数は、コンマで区切られています。
reduction (operator:list) 指定された operator を使用して、 list 内のすべてのスカラー変数の縮約を実行します。 list 内の縮約変数は、コンマで区切られています。

list 内の各変数の private コピーは、スレッドごとに作成されます。 ステートメント・ブロックの最後で、縮約変数のすべての private コピーの最終値は、その演算子に適切な方法で結合され、その結果は、共用の縮約変数の元の値に戻されます。

reduction 節に指定される変数は以下の通りです。

  • 演算子に適切な型でなければならない。
  • 囲んでいるコンテキスト内で共用されていなければならない。
  • const によって修飾された変数であってはならない。
  • ポインター型があってはならない。
ordered ordered 構成が omp for ディレクティブの動的範囲内に存在する場合、 この文節を指定します。
schedule (type) for ループの反復を使用可能なスレッド間で分割する方法を指定します。 type の許容値は、以下のとおりです。
dynamic
ループの反復はサイズ ceiling (number_of_iterations/number_of_threads) のチャンクに分割されます。

チャンクは、スレッドが使用可能になると、 最初に提供されたものから順に処理されるようにスレッドに動的に割り当てられます。 これは、すべての作業が完了するまで続けられます。

dynamic,n
チャンクのサイズが n に設定されることを除いて、上記と同様です。 n は、1 以上の値の整数代入式でなければなりません。
guided
チャンクは、 デフォルトの最小チャンク・サイズに達するまで順次小さくされます。 最初のチャンクのサイズは ceiling (number_of_iterations/number_of_threads) です。 それ以外のチャンクのサイズは、ceiling (number_of_iterations_left/number_of_threads) です。

チャンクの最小サイズは 1 です。

チャンクは、スレッドが使用可能になると、 最初に提供されたものから順に処理されるようにスレッドに割り当てられます。 これは、すべての作業が完了するまで続けられます。

guided,n
最小チャンク・サイズが n に設定されることを除いて、上記と同様です。 n は、1 以上の値の整数代入式でなければなりません。
runtime
スケジューリング方針は実行時に決定されます。 OMP_SCHEDULE 環境変数を使用して、スケジューリング・タイプおよびチャンク・サイズを設定します。
static
ループの反復はサイズ ceiling (number_of_iterations/number_of_threads) のチャンクに分割されます。 スレッドにはそれぞれ別個のチャンクが割り当てられます。

このスケジューリング方針は、ブロック・スケジューリング とも呼ばれます。

static,n
ループの反復がサイズ n のチャンクに分割されます。 チャンクはそれぞれラウンドロビン方式でスレッドに割り当てられます。

n は、1 以上の値の整数代入式でなければなりません。

このスケジューリング方針は、ブロック巡回スケジューリング とも呼ばれます。

注:
n=1 が 1 の場合、ループの反復は 1 のチャンク・サイズに分割されます。そして各チャンクはラウンドロビン方式でスレッドに割り当てられます。このスケジューリング方針は、ブロック巡回スケジューリング とも呼ばれます。
nowait この文節は、for ディレクティブの終わりにある暗黙のバリアを回避するために使用します。これは、指定した並列領域内に複数の独立した作業共有セクションまたは反復ループがある場合に有効です。 nowait 節は、1 つの for ディレクティブに 1 回しか現れることができません。

また、for_loop の個所は、以下の規範的形状を持つ for ループ構成体です。

for (init_expr; exit_cond; incr_expr)
 statement

ここで、

init_expr の形式は
iv = b
integer-type iv = b
exit_cond の形式は
iv <= ub
iv <  ub
iv >= ub
iv >  ub
incr_expr の形式は
++iv
iv++
--iv
iv--
iv += incr 
iv -= incr
iv = iv + incr
iv = incr + iv
iv = iv - incr

また、ここでは以下のとおりです。

iv 反復変数。反復変数は、for ループ内のどこの箇所でも変更されない符号付き整数でなければなりません。 反復変数は、for 演算の間は、暗黙的に private にされます。 lastprivate として指定されていない場合、 反復変数は演算の完了後に不確定値を持つことになります。
b, ub, incr ループ・インバリアント符号付き整数式。 これらの式を評価しているときは同期は実行されず、評価された副次作用が不確定値の結果になる可能性があります。

このプラグマは影響を受けるループまたはループ・ブロック・ディレクティブの直前に現れなければなりません。

omp for プラグマを使用するプログラム・セクションでは、 いずれのスレッドが特定の反復を実行するかにかかわらず、正しい結果を生成できなければなりません。 同様に、プログラムの正確さは、特定のスケジューリング・アルゴリズムの使用に依存するものであってはなりません。

for ループの反復変数は、ループの実行の間、スコープ内で暗黙的に private にされます。 この変数は、for ループの本体内で変更してはなりません。 増分変数の値は、 その変数がデータ・スコープの lastprivate を持つよう指定されていない限り、不確定です。

nowait 節が指定されていない限り、for ループの終わりに暗黙のバリアが存在します。

制限は、以下のとおりです。