目的
omp parallel ディレクティブは、選択したコードのブロックを並列化するようコンパイラーに明示的に指示します。
構文

.-,------.
V |
>>-#--pragma--omp parallel----clause-+-------------------------><
パラメーター
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 コピーの最終値は、その演算子に適切な方法で結合され、その結果は、共有の縮約変数の元の値に再格納されます。
例えば、
max 演算子を指定した場合は、以下の式を使用して、元の縮約変数値が、private コピーの最終値に結合されます。original_reduction_variable = original_reduction_variable < private_copy ?
private_copy : original_reduction_variable;
reduction 節で指定される変数は、以下の条件を満たす必要があります。- 演算子に適切な型でなければならない。
max 演算子または min 演算子を指定した場合、変数は、long、short、signed、または unsigned の有無を問わず、以下の型のいずれかでなければなりません。
- _Bool
- char
- int
- float
- double
- 囲んでいるコンテキスト内で共有されていなければならない。
- const によって修飾された変数であってはならない。
- ポインター型があってはならない。
使用法
並列領域が検出されると、スレッドの論理チームが形成されます。
チーム内の各スレッドは、作業共有構成を除いて、並列領域内のすべてのステートメントを実行します。
作業共有構成内の作業は、チーム内のスレッド間で配布されます。
ループの繰り返しが独立していなければ、ループを並列化することはできません。
暗黙のバリアが、並列化されたステートメント・ブロックの終了地点にあります。
デフォルトで、ネストされた並列領域は直列化されています。