並列領域宣言子

PARALLEL 宣言子および END PARALLEL 宣言子は、次のように並列領域を定義します。

!$OMP PARALLEL

  ! parallel region

!$OMP END PARALLEL

スレッドが並列領域を検出すると、スレッドのチームを形成して、そのスレッドがチームのマスターになります。チーム内のスレッド数は環境変数ランタイム・ライブラリー・コールNUM_THREADS 節のいずれか、またはこれらを組み合わせて制御することができます。

使用される節

PARALLEL 宣言子には、オプションで次のように指定した節をカンマ区切りのリストで指定できます。

スレッド数の変更

一旦チームを形成すると、チーム内のスレッド数は並列領域では一定です。次の並列領域で使用されるスレッド数を明示的に変更するには、NUM_THREADS 節を呼び出し、OMP_SET_NUM_THREADS ランタイム・ライブラリー・ルーチンをプログラムのシリアルな部分から呼び出すか、または OMP_NUM_THREADS 環境変数を使用します。実行順、つまり優先順位は、NUM_THREADS 節、OMP_SET_NUM_THREADS ランタイム・ライブラリー・ルーチンで、次に OMP_NUM_THREADS 環境変数です。例えば、NUM_THREADS 節を呼び出すと OMP_SET_NUM_THREADS ルーチンよりも優先されます。

例えば、OMP_NUM_THREADS 環境変数を使用してスレッド数を 6 に設定した場合、並列領域間のスレッド数は次のように変更できます。

!$OMP PARALLEL

... ! This region is executed by 6 threads.

!$OMP END PARALLEL

CALL OMP_SET_NUM_THREADS(3)

!$OMP PARALLEL

... ! This region is executed by 3 threads.

!$OMP PARALLEL

!$OMP PARALLEL NUM_THREADS(4)

... ! This region is executed by 4 threads.

!$OMP END PARALLEL

作業単位の設定

DOSECTIONS、および SINGLE のようなワークシェアリング宣言子を使用して、並列領域の文を作業単位に分割し、各単位が 1 つのスレッドにより実行されるように分配できます。

次の例では、!$OMP DO および !$OMP END DO 宣言子と、これらの宣言子に囲まれた文はすべて、並列領域の静的範囲を構成します。

!$OMP PARALLEL

  !$OMP DO

    DO I=1,N

      B(I) = (A(I) + A(I-1))/ 2.0

    END DO

  !$OMP END DO

!$OMP END PARALLEL

次の例では、DO および END DO 宣言子と、これらの宣言子で囲まれた文 (WORK サブルーチンに含まれるすべての文を含む) はすべて、並列領域の動的範囲を構成します。

!$OMP PARALLEL DEFAULT(SHARED)

  !$OMP DO

    DO I=1,N

      CALL WORK(I,N)

    END DO

  !$OMP END DO

!$OMP END PARALLEL

条件付き並列領域実行の設定

IF 節が PARALLEL 宣言子に指定されていると、囲まれたコード領域は、スカラー論理式が .TRUE. に評価される場合にのみ並列で実行されます。それ以外の場合は、並列領域は順次実行されます。IF 節がない場合は、その領域はデフォルトで並列に実行されます。

次の例では、DO および END DO 宣言子内で囲まれた文は、4 つ以上のプロセッサーが利用できる場合にのみ、並列で実行されます。それ以外の場合は、文は順次実行されます。

!$OMP PARALLEL IF (OMP_GET_NUM_PROCS() .GT. 3)

  !$OMP DO

    DO I=1,N

      Y(I) = SQRT(Z(I))

    END DO

  !$OMP END DO

!$OMP END PARALLEL

並列領域を実行中のスレッドが別の並列領域を検出すると、新しいチームを形成してそのチームのマスターになります。デフォルトでは、入れ子された並列領域は常に 1 つのスレッドで構成されるチームによって実行されます。

Note icon

順次実行よりもパフォーマンスを向上させるには、並列領域に 1 つまたは複数のワークシェアリング構造を含めて、スレッドチームが並列で作業を実行できるようにする必要があります。ワークシェアリング構造を並列領域に含めることで、並列処理によるパフォーマンスの向上を得ることができます。

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