#pragma omp parallel

説明

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 IBM Copyright 2003