REDUCTION 節は、PARALLEL、DO、SECTIONS、PARALLEL DO、PARALLEL SECTIONS ディレクティブで使用し、次に示すように演算子または組込み関数により指定された変数に対してリダクションを実行します。
REDUCTION (
演算子
または
組込み関数
:list )
演算子は、次のいずれかを使用できます: +、*、-、.AND.、.OR.、.EQV.、または .NEQV.。
組込み関数は、次のいずれかを使用できます: MAX、MIN、IAND、IOR、または IEOR。
指定される変数は、組込み関数タイプの名前付きスカラ変数で、囲まれたコンテキスト内では SHARED でなければなりません。指定された各変数のプライベート・コピーは、PRIVATE 節を使用したかのように各スレッドに対して作成されます。プライベート・コピーは、次の表で示すように、演算子または組込み関数によって値が初期化されます。実際の初期値は、リダクション変数のデータ型と合致します。
演算子/組込み関数およびリダクション変数の初期値
演算子/組込み関数 |
初期値 |
+ |
0 |
* |
1 |
- |
0 |
.AND. |
.TRUE. |
.OR. |
.FALSE. |
.EQV. |
.TRUE. |
.NEQV. |
.FALSE. |
MAX |
表現可能な最大値 |
MIN |
表現可能な最小値 |
IAND |
全ビットがオン |
IOR |
0 |
IEOR |
0 |
リダクションが適用される構造の最後で共有変数が更新され、指定された演算子を使用して SHARED リダクション変数のオリジナルの値と各プライベート・コピーの最後の値を結合した結果が反映されます。
減算を除くすべてのリダクション演算子は結合可能で、コンパイラは自由に最終値の計算を再結合できます。減算リダクションの部分的な結果は、最終値を作成するために付加されます。
共有変数の値は、最初のスレッドがリダクションを含む節に到達したときに未定義となり、そのリダクション計算が完了するまで未定義の状態になります。通常、この計算は REDUCTION 構造の最後で完了します。ただし、NOWAIT も適用されている構造で REDUCTION 節を使用すると、共有変数はバリア同期化が行われるまで未定義のままになります。これにより、すべてのスレッドが REDUCTION 節を完了したことが保証されます。
REDUCTION 節は、1 つの領域またはワークシェアリング構造で使用されるように意図されており、リダクション変数は次のいずれかの形式を持つリダクション文でのみ使用されます。
x = x operator expr
x = expr operator x (except for subtraction)
x = intrinsic (x,expr)
x = intrinsic (expr, x)
一部のリダクションは、他の形式で使用できます。例えば、MAX リダクションは、次のように表現できます。
IF (x .LT.expr) x = expr
また、リダクションはサブルーチン・コール内に隠すこともできます。REDUCTION 節で指定された演算子はリダクション演算子と一致することに注意してください。
ディレクティブに指定できるリダクション節の数は任意ですが、次の例のように、ディレクティブの REDUCTION 節では、1 つの変数は一度しか使用できません。
!$OMP DO REDUCTION(+: A, Y),REDUCTION(.OR.: AM)
次の例は、REDUCTION 節の使用方法を示します。
!$OMP PARALLEL DO DEFAULT(PRIVATE),SHARED(A,B,REDUCTION(+: A,B)
DO I=1,N
CALL WORK(ALOCAL,BLOCAL)
A = A + ALOCAL
B = B + BLOCAL
END DO
!$OMP END PARALLEL DO