私はatomic
とcritical
なぜOpenMPのアトミックとクリティカルは正しい結果をもたらさないのですか?
program test
implicit none
integer::i
integer::a(10),b(10),atmp(10),btmp(10)
a=[1,2,3,4,5,6,7,8,9,10]
b=[12,32,54,77,32,19,34,1,75,45]
atmp=a
btmp=b
write(*,'(1X,10I4)') a+b
print*,'------------------'
!$omp parallel
!$omp do
do i=1,10
B(I) = B(I)+A(I)
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single
a=atmp
b=btmp
!$omp do
do i=1,10
!$omp critical
B(I) = B(I)+A(I)
!$omp end critical
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single
a=atmp
b=btmp
!$omp do
do i=1,10
!$omp atomic
B(I) = B(I)+A(I)
!$omp end atomic
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single
!$omp end parallel
end program
をテストするには、以下のFortranコードを書かれている出力は
であることはatomic
とcritical
の結果が間違っていることを意味しています。これは奇妙なことですが、私はそれらを追加することでレース状態を避けることができたと思いましたしかし、同期のない最初のループは正解ですが、ここにレースはありませんか?私のコードで何が間違っていますか?
期待される正しい結果は何ですか?それはラインの上ですか?これらをテキストとして含める方が良いでしょう。画像はある時間後にホスティングによって削除される可能性があります。 –
私は競合状態が実際に 'a = atmp;だと思います。 b = btmp 'となる。しかし、私はあまりにも長い間コードを研究していませんでした。 –
@HighPerformanceMarkここでは、92ページのこの種の使用方法を見ました。http://openmp.org/mp-documents/openmp-examples-4.0.2.pdf。これは、原子の典型的な使用法として、これは正しくないのですか? – user15964