ワークシェアリング構造宣言子

ワークシェアリング宣言子を並列で実行する場合、並列領域内でワークシェアリング構造を動的に囲む必要があります。新規のスレッドは起動されません。また、ワークシェアリング構造に入る時点で暗黙的なバリアはありません。

ワークシェアリング構造は、次のとおりです。

これらの宣言子についての詳細は、「OpenMP* Fortran Compiler Directives」(英語) を参照してください。

DO および END DO

DO 宣言子は、DO ループ直後の繰り返しがスレッドのチームに振り分けられるようにし、それぞれの繰り返しが 1 つのスレッドにより実行されるようにします。DO 宣言子に続くループには、ループ制御が実行されない DO WHILE または DO ループは使用できません。DO ループの繰り返しは、既存のスレッドチーム間で振り分けられます。

DO 宣言子は、オプションで次のことが可能です。

使用される節

DO 宣言子の節では、次を指定します。

使用規則

SECTIONS、SECTION および END SECTIONS

非反復的なワークシェアリング SECTIONS 宣言子を使用して、囲まれたコードのセクションをチーム内で分割します。各セクションは、1 つのスレッドによって 1 回だけ実行されます。

SECTION 宣言子がオプションである最初のセクションを除き、各セクションは、SECTION 宣言子から開始されます。SECTION 宣言子は、SECTIONS 宣言子と END SECTIONS 宣言子の記述範囲内になければなりません。

最後のセクションは、END SECTIONS 宣言子で終わります。NOWAIT を指定しない限り、スレッドがセクションを終了し、振り分けられていないセクションがなければ、スレッドは END SECTION 宣言子で待機します。

SECTIONS 宣言子には、変数に PRIVATEFIRSTPRIVATELASTPRIVATE、または REDUCTION を指定した節をカンマ区切りのリストで指定できます。

次の例では、SECTIONS 宣言子と SECTION 宣言子を使用して、X_AXISY_AXISZ_AXIS サブルーチンを並列に実行する方法を示します。最初の SECTIONS 宣言子はオプションです。

!$OMP PARALLEL

  !$OMP SECTIONS

    !$OMP SECTION

      CALL X_AXIS

    !$OMP SECTION

      CALL Y_AXIS

    !$OMP SECTION

      CALL Z_AXIS

  !$OMP END SECTIONS

!$OMP END PARALLEL

SINGLE および END SINGLE

囲まれたコードのブロックを、チームの 1 つのスレッドにのみ実行させる場合は、SINGLE 宣言子と END SINGLE 宣言子を使用します。

SINGLE 構造を実行していないスレッドは、NOWAIT を指定しない限り、END SINGLE 宣言子で待機します。

SINGLE 宣言子には、変数に PRIVATE または FIRSTPRIVATE を指定した節をカンマ区切りのリストで指定できます。

END SINGLE 宣言子が検出されると、暗黙的なバリアができ、スレッドはすべてのスレッドが完了するまで待機します。これは、NOWAIT オプションを使用して無効にできます。

次の例では、SINGLE 宣言子を最初に検出したスレッドが、OUTPUTINPUT サブルーチンを実行します。

!$OMP PARALLEL DEFAULT(SHARED)

  CALL WORK(X)

  !$OMP BARRIER

  !$OMP SINGLE

    CALL OUTPUT(X)

    CALL INPUT(Y)

  !$OMP END SINGLE

  CALL WORK(Y)

!$OMP END PARALLEL