#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 コピーの最終値は、その演算子に適切な方法で結合され、その結果は、共用の縮約変数の元の値に戻されます。

reduction 節に指定される変数は以下の通りです。

  • 演算子に適切な型でなければならない。
  • 囲んでいるコンテキスト内で共用されていなければならない。
  • const によって修飾された変数であってはならない。
  • ポインター型があってはならない。

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

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

ネストされた並列領域は、常に直列化されています。