PARALLEL 宣言子および END PARALLEL 宣言子は、次のように並列領域を定義します。
例 |
---|
!$OMP PARALLEL ! parallel region !$OMP END PARALLEL |
スレッドが並列領域を検出すると、スレッドのチームを形成して、そのスレッドがチームのマスターになります。チーム内のスレッド数は環境変数、ランタイム・ライブラリー・コール、NUM_THREADS 節のいずれか、またはこれらを組み合わせて制御することができます。
PARALLEL 宣言子には、オプションで次のように指定した節をカンマ区切りのリストで指定できます。
IF: 並列領域の文をスレッドのチームによって並列に実行するか、単一のスレッドによって順次に実行するかどうか
NUM_THREADS: チーム内のスレッド数
PRIVATE、FIRSTPRIVATE、SHARED、REDUCTION: 変数型
DEFAULT: 変数データスコープ属性
COPYIN: マスタースレッドの共通ブロックの値は、THREADPRIVATE 共通ブロックのコピーに格納される
一旦チームを形成すると、チーム内のスレッド数は並列領域では一定です。次の並列領域で使用されるスレッド数を明示的に変更するには、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 |
DO、SECTIONS、および 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 つのスレッドで構成されるチームによって実行されます。
順次実行よりもパフォーマンスを向上させるには、並列領域に 1 つまたは複数のワークシェアリング構造を含めて、スレッドチームが並列で作業を実行できるようにする必要があります。ワークシェアリング構造を並列領域に含めることで、並列処理によるパフォーマンスの向上を得ることができます。
この宣言子についての詳細は、「OpenMP* Fortran Compiler Directives」(英語) を参照してください。