#pragma omp parallel

目的

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 演算子を指定した場合、変数は、longshortsigned、または unsigned の有無を問わず、以下の型のいずれかでなければなりません。
    • _Bool
    • char
    • int
    • float
    • double
  • 囲んでいるコンテキスト内で共有されていなければならない。
  • const によって修飾された変数であってはならない。
  • ポインター型があってはならない。

使用法

並列領域が検出されると、スレッドの論理チームが形成されます。 チーム内の各スレッドは、作業共有構成を除いて、並列領域内のすべてのステートメントを実行します。 作業共有構成内の作業は、チーム内のスレッド間で配布されます。

ループの繰り返しが独立していなければ、ループを並列化することはできません。 暗黙のバリアが、並列化されたステートメント・ブロックの終了地点にあります。

デフォルトで、ネストされた並列領域は直列化されています。