REDUCTION 節は、PARALLEL、DO、SECTIONS、PARALLEL DO、PARALLEL SECTIONS 宣言子で使用し、次に示すように演算子または組み込み関数により指定された変数に対してリダクションを実行します。
例 |
---|
REDUCTION (operator or intrinsic: list ) |
説明:
operator は、+、*、-、.AND.、.OR.、.EQV.、または .NEQV. のいずれかです。
Intrinsic は、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 は、組み込み型のスカラー変数です。配列を使用できます。 |
x = expr operator x |
減算は除きます。 |
x = intrinsic (x, expr) |
intrinsic は MAX、MIN、IAND、IOR、または IEOR のいずれかです。 |
x = intrinsic (expr, x) |
operator は、+、*、-、/、.AND.、.OR.、.EQV. または .NEQV. のいずれかです。 |
一部のリダクションは、他の形式で使用できます。例えば、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 |