2.4.1 for のコンストラクト
For のディレクティブはループの反復処理は並列実行されるように指定する反復作業共有の構造体を指定します。For のループ反復にバインドする parallel コンストラクトを実行中のチームにあるスレッドに分散されています。For 構造の構文は次のとおりです。:
#pragma omp for [clause[[,] clause] ... ] new-line
for-loop
句は次のいずれかです :
(プライベート 変数 の リスト )
(firstprivate 変数 の リスト )
(lastprivate 変数 の リスト )
(縮小 の 演算子の : 変数 の リスト )
順序あり
スケジュール ( の 種類 chunk_size**)**[入力]
nowait
対応する For の構造体の For のディレクティブの場所の制限はループ。具体的にはFor の対応するループは標準の図形が必要です :
For ( の init-expr**;var 論理的操作 b; increxpr)**
init-expr
次のいずれかになります。var = lb
整数型 lbvar =
increxpr
次のいずれかになります。++var
var C++
-- var
var --
var += incr
var - = 増加します。
var " var + = 追加する
var " var+ = 追加する
var = var - incr
var
符号付き整数の変数。この変数が他で共有すると暗黙的に For 中はプライベートになります。この変数は For のステートメントの本体で変更しないでください。変数で指定 lastprivate 場合はループが呼び出されるした後の値。論理的操作
次のいずれかになります。<
<=
>
>=
lbbincr
ループ不変式の整数式。同期はこれらの式の評価中にありません。したがって重要な副作用が中間結果を生成します。
正規化形式がループ反復が数をループのエントリに計算できることに注意してください。この計算では整数の上位変換後に var の種類の値と発生します。特にb の値の場合 -lb は その型で表す + 乗算した 結果が不確定ことはできません。さらに 論理的操作 < 場合 はを <=varincr により ループの各反復処理で大きくする必要があります。 論理的操作 > 場合 はを >=varincr により ループの各反復処理になります。
スケジュール の句は For のループ反復がチームのスレッドでどのように分割するかを指定します。プログラムの正確さはどのスレッドが決まっては特定のイテレーションを実行する必要があります。値は指定されている場合正の値でループ不変式の整数式である必要があります chunk_size。同期はこの式の評価中にありません。したがって重要な副作用が中間結果を生成します。スケジュールを次のいずれかです :
表 2-1 の スケジュール の句の 種類の 値
static |
スケジュール (静的関数 が chunk_size と ) は指定したサイズのチャンクに分割しイテレーション chunk_size 指定します。チャンクはスレッド番号の順序でラウンド ロビン方式のスレッドに静的に割り当てます。 で chunk_size とイテレーションの領域に分割し各スレッドに割り当てられる約 1 のチャンクはチャンクに指定されます。 |
dynamic |
スケジュール (動的 が chunk_size と ) は一連のイテレーションチャンクに分割し各含まれていること chunk_size イテレーションを指定します。各チャンクはを待機しているスレッドに割り当てられます。スレッドはチャンクが残らない割り当てるまでイテレーションのチャンクを実行し次の割り当てを待機します。代入する最後のチャンクはイテレーションの数を減らしますが発生する可能性があることに注意してください。chunk_size されていない 場合は既定値 1. に指定されます。 |
されました |
スケジュールされました ( が chunk_size と ) はのサイズのチャンクのスレッドに割り当てられるイテレーション指定します。スレッドはイテレーションに割り当てるチャンクを終了するといずれも維持するまで動的に別のチャンクを割り当てます。1 の chunk_size では各チャンクのサイズは約スレッドの数で未使用のイテレーションの数です。これらのサイズは約 1. に指数関数的に減少します。k 大きい値を持つ chunk_size には 1 種類の サポート にサイズは約指数関数的になっていますが最後のチャンクはk の イテレーションでより少なくなる場合があります。chunk_size されていない 場合は既定値 1. に指定されます。 |
ランタイム |
スケジュール ランタイム () を指定するとスケジュールに関する決定が実行時まで延期されます。Kind スケジュールチャンクのサイズは実行時に環境変数 OMP_SCHEDULE の設定で選択できます。この環境変数が設定されていない場合生成されるスケジュールは実装定義されます。 スケジュール ランタイム () を指定すると指定しないでください chunk_size。 |
スケジュール を明示的に定義された句がない場合既定 スケジュール は実装定義されます。
OpenMP 対応プログラムが正しい特定の適用に依存しないようにしてください。プログラムは前に説明した説明にスケジュール複数の種類の準拠に異なるコンパイラにわたって同じスケジュールの 種類 の実装のバリエーションができるので依存させないでください。説明が特定の状況に適したスケジュールを選択するために使用できます。
順序あり の句は 順序あり のディレクティブが For の構造体にバインドします。
nowait の句の指定がない場合 For 構造体の最後に暗黙的なバリアがあります。
For のディレクティブに制限 : は次のとおりです。
For のループでは構造化ブロックであるまた 中断 の実行はステートメントで終了する必要があります。
For のディレクティブに関連付けられている For のループのループの制御式の値がチームのすべてのスレッドで同じである必要があります。
For のループの反復変数は符号付き整数型である必要があります。
スケジュール の一つの句だけ For のディレクティブで指定できます。
順序あり の一つの句だけ For のディレクティブで指定できます。
nowait の一つの句だけ For のディレクティブで指定できます。
これはどのくらいの頻度で chunk_sizelbbまたは incr の 式内の任意の副作用が発生するかまたは未指定です。
chunk_size の 式の値がチームのすべてのスレッドで同じである必要があります。
cref:
プライベート firstprivatelastprivate と リダクション の句はページの 25 セクション 2.7.2 が表示されます。
OMP_SCHEDULE の環境変数はページの 48 セクション 4.1 が表示されます。
順序あり の構造はページの 22 セクション 2.6.6 が表示されます。
付録 C 17 の 93 ページはスケジュールの句を使用する方法について説明します。