#pragma omp for

説明

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

構文

#pragma omp for [clause[[,] 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 以上の値の整数代入式でなければなりません。

このスケジューリング方針は、ブロック巡回スケジューリング としても知られています。

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

このスケジューリング方針は、巡回スケジューリング としても知られています。

nowait この文節は、for ディレクティブ終了時の暗黙の barrier を回避するために使用します。これは、指定した並列領域内に複数の独立した作業共有セクションまたは反復ループがある場合に有効です。 nowait 文節が、所定の 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 ループの終了時に暗黙の barrier が存在します。

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

関連参照

並列処理を制御するプラグマ
#pragma omp parallel for IBM Copyright 2003