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

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

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

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

ID

問題箇所

説明

1

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

変数が参照された場所


    integer, parameter :: N=10
    integer last, i
    real, dimension(N) :: a, b, c
    b = 10.0
    c = 50.0
$OMP PARALLEL SHARED(a, b, c, last)
$OMP DO LASTPRIVATE(last)
    do i = 1, N
        a(i) = b(i) + c(i)
        last = i
    end do
$OMP END DO NOWAIT
$OMP SINGLE
    call sub(last)
$OMP END SINGLE
$OMP END PARALLEL
    end

    subroutine sub(last)
    integer last
    print *, last
    end subroutine sub
        

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