OpenMP* REDUCTION 変数は PRIVATE であってはならない

REDUCTION 変数は、REDUCTION 節を持つ構造から派生したワークシェアリング構造にバインドされている並列領域で共有される必要があります。

REDUCTION 節は、リストの各項目の PRIVATE コピーを作成し、指定された演算子に対して適切に初期化します。そして、REDUCTION 節がある領域の最後で、指定された演算子を使用して、オリジナルの値と各 PRIVATE コピーの最終値を結合した結果でオリジナルの項目を更新します (減算演算子が指定された場合、部分的な結果を加算したものが最終値となります)。

OpenMP* 仕様では、REDUCTION 変数は、構造範囲外で名前が解釈されるため、共有変数でなければなりません。これにより、スレッドが構造の最後に到達したときに、そのプライベート・コピーを外部変数に結合させることができます。外部変数が最初に領域に入るスレッドに対してプライベートである場合は、リダクションを行うことができないため、REDUCTION 変数を共有にすることは必須となります。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

REDUCTION 節の場所

2

定義

外部変数の定義


    integer i, j
    real a
    a = 0.0
!$OMP PARALLEL REDUCTION(+: a)
!Bad: can't make reduction variable private
!$OMP DO PRIVATE(a)
    do j = 1, 10
        a = a + j
    end do
!$OMP END PARALLEL
    print *, a
    end
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。