2.3 parallel コンストラクト

次のディレクティブを複数のスレッドで同時に実行されるプログラムの一部である並列領域を定義します。これは並列実行を開始する基本的な構造です。

#pragma omp parallel [clause[ [, ]clause] ...] new-line
   structured-block

句は 次のいずれかです :

(スカラー式 )

(プライベート 変数リスト )

(firstprivate 変数リスト )

既定値 (共有 | なし)

(共有 変数リスト )

(copyin 変数リスト )

(縮小演算子の : 変数リスト )

(num_threads整数式 )

スレッドが parallel コンストラクトを検出するとスレッドのチームでは次の条件の 1 つが当てはまる場合は作成されます :

  • If の句はありません。

  • If の式はゼロ以外の値に評価されます。

このスレッドは 0 のスレッド番号を持つチームのマスター スレッドはしチームのすべてのスレッドはマスター スレッドが領域を並列実行します。If の式の値がの場合領域がシリアル化されます。

要求されるスレッドの数を確認するには次の規則が順番に見なされます。条件を満たす最初の規則が適用されます :

  1. num_threads の句がの場合整数式の値が要求するスレッドの数です。

  2. omp_set_num_threads ライブラリ関数を呼び出した場合は最後に実行した呼び出しの引数の値は要求したスレッドの数です。

  3. 環境変数 OMP_NUM_THREADS が定義されている場合この環境変数の値は要求されたスレッドの数です。

  4. 上記のメソッドでも使用されていない場合は要求されたスレッドの数は実装定義されます。

num_threads の句がある場合に適用されている並列領域に対してのみ omp_set_num_threads ライブラリ関数または OMP_NUM_THREADS 環境変数で要求するスレッドの数よりも優先されます。後続の並列領域は影響を受けません。

並列領域を実装するスレッドの数はスレッドの数の動的な変更が有効かどうかによって決まります。動的調整を無効にするとスレッドの要求された数は並列領域を実行します。動的変更が有効になっているスレッドの要求された数は並列領域を実行できるスレッドの最大数です。

スレッドの数の動的な変更が無効になり並列領域に要求するスレッドの数が提供ランタイム システムができる数を超えると並列領域が発生した場合プログラムの動作は実装定義されます。実装はたとえばプログラムの実行が中断される場合もありますが並列領域をシリアル化する場合があります。

omp_set_dynamic ライブラリ関数と OMP_DYNAMIC の環境変数がスレッド数を動的に調整を有効または無効にすることができます。

実際にスレッドをホストする物理プロセッサの数は必ず実装定義されます。作成するとチーム内のスレッドの数は並列領域の期間にわたって一定です。これはユーザーが自動的に 1 個の並列領域間でランタイム システムによって明示的に変更できます。

並列領域の動的範囲に含まれるステートメントは各スレッドによって実行され各スレッドが他のスレッドとは異なるパスのステートメントを実行できます。並列領域の構文の範囲外にあるディレクティブはデタッチされたディレクティブと呼ばれます。

並列領域の端に暗黙的なバリアがあります。チームのマスター スレッドが並列領域に実行が継続されます。

並列領域を実行しているチームのスレッドが別の parallel コンストラクトが発生した場合は新しいチームを作成しその新しいチームのマスターになります。入れ子になった並列領域が既定でシリアル化されます。したがって既定では入れ子になった並列領域は1 種類のスレッドで構成されたチームによって実装されます。既定の動作はランタイム ライブラリ関数 omp_set_nested または環境変数 OMP_NESTED を使用して変更できます。ただし入れ子になった並列領域を担当するチーム内のスレッドの数は実装定義されます。

並列 のディレクティブに制限 : は次のとおりです。

  • 最大で 1 If の二つの句ではディレクティブで使用できます。

  • この場合は式または num_threads の式が実行されていないかどうかの内側の副作用。

  • 並列領域内で実行される throw によっては構造化ブロックの動的スコープ内で再開する例外をスローした同じスレッドでキャッチされない場合があります。

  • num_threads の一つの句だけがディレクティブに表示できます。num_threads の式は並列領域のコンテキストの外側に評価され正の整数値に評価される必要があります。

  • Ifnum_threads の句の評価の順序が指定されていません。

cref: