OpenMP* NOWAIT 節の後での REDUCTION 変数の使用

NOWAIT ワークシェアリング構造にセットされている REDUCTION 変数が BARRIER の前で使用されているため、競合状態が発生しています。

NOWAIT 節では、ほかのすべてのスレッドが構造を完了するのを待つことなく、ワークシェアリング構造の終了地点を超えて実行を続けることができます。つまり、構造の終わりの暗黙的なバリアが省略されます。REDUCTION 節では、ループの反復を実行するスレッドのプライベート・コピーからの値を使用して出口で外部変数が更新されます。

REDUCTION 節を通じて代入された変数が次の BARRIER の前に使用されるとデータ競合が発生します。ループの最後の反復を実行するスレッドが、参照が発生する前にその変数への代入を実行する保証はありません。

ID

問題箇所

説明

1

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

変数が参照された場所


    integer, parameter :: N=10
    integer sum
    sum = 0
!$OMP PARALLEL SHARED(a, b, c, sum) NUM_THREADS(4)
!$OMP DO REDUCTION(+:sum)
    do i = 1, N
        sum = sum + i
    end do
!$OMP END DO NOWAIT
!$OMP SINGLE
    print *, sum
!$OMP END SINGLE
!$OMP END PARALLEL
    end
        

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