3
我已經寫下面Fortran代碼測試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
輸出是
它意味着atomic
和critical
是錯誤的這一結果。這很奇怪,我認爲增加他們可以避免賽車狀況。然而,沒有同步的第一個循環給出了正確的答案,這裏沒有比賽嗎?我的代碼有什麼問題?
預期的正確結果是什麼?在線以上嗎?將這些文字包含進去會更好。一段時間後,圖片可能會被主機刪除。 –
我認爲比賽條件實際上是'a = atmp; b = btmp'在平行區域。但是我沒有太久研究代碼。 –
@HighPerformanceMark我在這裏看到了這種用法,在這裏http://openmp.org/mp-documents/openmp-examples-4.0.2.pdf。文檔顯示這是原子的典型用法,是不是正確? – user15964