omp parallel ディレクティブは、選択したコードのセグメントを並列化するようにコンパイラーに明示的に指示します。
#pragma omp parallel [clause[[,] clause] ...] <statement_block>
ここで、clause は、次のいずれかです。
if (exp) if 引き数を指定したときは、 exp が表したスカラー式が実行時に非ゼロ値と評価された場合に限り、プログラム・コードが並列に実行されます。 if 文節は 1 つのみ指定することができます。 private (list) list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 list 内のデータ変数は、コンマで区切られています。 firstprivate (list) list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。それぞれの新規の private オブジェクトは、あたかもステートメント・ブロック内に暗黙の宣言があるように、元の変数の値を使用して初期化されます。 list 内のデータ変数は、コンマで区切られています。 num_threads (int_exp) int_exp の値は、並列領域用に使用するスレッドの数を指定する整数式です。スレッドの数の動的調整も使用可能である場合、 int_exp は使用されるスレッドの最大数を指定します。 shared (list) list 内のデータ変数のスコープがすべてのスレッドに渡って共用されることを宣言します。 default (shared | none) 各スレッド内の変数のデフォルトのデータ・スコープを定義します。 default 文節は、 1 つの omp parallel ディレクティブ上に 1 つのみ指定することができます。
default(shared) の指定は、 shared(list) 文節内の各変数を指定するのと同じです。
default(none) の指定には、並列化されたステートメント・ブロックに対して可視である各データ変数が、データ・スコープ文節に明示的にリストされていることが必要です。ただし、次のような変数の例外があります。
- const によって限定されている
- 囲まれたデータ・スコープ属性の文節内に指定されている
- 対応する omp for または omp parallel for ディレクティブによってのみ参照されるループ制御変数として使用されている
copyin (list) list 内に指定されているデータ変数ごとに、マスター・スレッド内のデータ変数の値は、並列領域の開始地点のスレッド private コピーにコピーされます。 list 内のデータ変数は、コンマで区切られています。
copyin 文節内で指定するデータ変数は、それぞれ、 threadprivate 変数でなければなりません。
reduction (operator: list) 指定された operator を使用して、 list 内のすべてのスカラー変数の縮約を実行します。 list 内の縮約変数は、コンマで区切られています。
list 内の各変数の private コピーは、スレッドごとに作成されます。ステートメント・ブロックの最後で、縮約変数のすべての private コピーの最終値は、その演算子に適切な方法で結合され、その結果は、共用の縮約変数の元の値に戻されます。
reduction 文節で指定する変数は、以下のとおりでなければなりません。
- 演算子に適切な型でなければならない。
- 囲んでいるコンテキスト内で共用されていなければならない。
- const によって修飾された変数であってはならない。
- ポインター型があってはならない。
並列領域が検出されると、スレッドの論理チームが形成されます。チーム内の各スレッドは、作業共有構成を除いて、並列領域内のすべてのステートメントを実行します。作業共有構成内の作業は、チーム内のスレッド間で配布されます。
ループの反復が独立していなければ、ループを並列化することはできません。暗黙のバリアが、並列化されたステートメント・ブロックの終了地点にあります。
ネストされた並列領域は、常に直列化されています。
並列処理を制御するプラグマ
#pragma omp for
#pragma omp parallel for
#pragma omp parallel sections