並列指示文節:指定された変数に対して,可換的なリダクション演算を実行します。
形式
REDUCTION ( operator | intrinsic : list )
operator
次のいずれか:+,*,-,.AND.,.OR.,.EQV.,または .NEQV.。
intrinsic
次のいずれか:MAX,MIN,IAND,IOR,または IEOR。
list
有効域から参照できる 1 つまたは複数の組込み型スカラ変数または共通ブロックの名前。部分オブジェクトを指定することはできません。個々の名前はコンマで区切られなくてはならず,名前付き共通ブロックは斜線の間に置かれなくてはなりません (/ /)。
REDUCTION 節に現れる変数は,外側の文脈で SHARED になっていなくてはなりません。各スレッドに対して,list 中の個々の変数の非公開コピーが,PRIVATE 節が使用された場合と同じように作成されます。非公開コピーは演算子に従って初期化されます (次表 を参照)。
REDUCTION の終了時に,共有変数は,共有リダクション変数の元の値を,指定された演算子を使って個々の非公開コピーの最終的な値と結合した結果を反映させて更新されます。リダクション演算子は (減算を除いて) すべて結合的なので,コンパイラは最終的な値の計算を自由に再結合することができます。減算リダクションについては,その部分的な結果が加えられることで最終的な値が得られます。
共有変数の値は,最初のスレッドがリダクションを含んでいる節に達した時点で不定の状態となり,リダクションの計算が完了するまでその状態のままになります。通常,計算は REDUCTION 構文の終わりで完了します。
ただし,REDUCTION 節が,NOWAIT も適用されている構文中で使用された場合,共有変数はバリア同期が実行されるまで不定の状態となっています。これにより,すべてのスレッドが REDUCTION 節を完了することが保証されます。
REDUCTION 節は,リダクション変数が以下のいずれかの形式を持つリダクション文の中でしか使われていない領域またはワークシェアリング構文でしか使用できません。
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 演算子と組込み関数の初期化値 (TU*X のみ)
演算子 | 初期化値 |
---|---|
+ | 0 |
* | 1 |
- | 0 |
.AND. | .TRUE. |
.OR. | .FALSE. |
.EQV. | .TRUE. |
.NEQV. | .FALSE. |
組込み関数 | 初期化値 |
MAX | 最も小さい表現可能な数値 |
MIN | 最も大きい表現可能な数値 |
IAND | すべてのビットがオン |
IOR | 0 |
IEOR | 0 |
指示文がリダクション節を許容している場合,指定できるリダクション節の数には制限はありません。ただし,個々の変数名は,いずれか 1 つの節の中でしか指定できません。