atomic
sınamak için aşağıdaki Fortran kod yazdım
ve critical
Neden OpenMP atomik ve kritik doğru sonucu vermiyor?
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
çıktı O atomic
ve critical
yanlıştır o sonucunu demektir
olduğunu. Bu garip, onlara yarış koşullarını engelleyebileceklerini düşündüm. Ancak, senkronizasyon olmadan ilk döngü doğru cevap verir, burada yarış yok mu? Kodumdaki sorun nedir?
Beklenen sonuç nedir? çizginin üstünde mi? Bunları metin olarak eklemek daha iyi olurdu. Resim, bir süre sonra barındırma tarafından silinebilir. –
Bence yarış durumu aslında a = atmp; Paralel bölgede b = btmp'. Ama kodu çok uzun süre çalışmadım. –
@HighPerformanceMark Bu tür kullanımları sayfa 92'de gördüm http://openmp.org/mp-documents/openmp-examples-4.0.2.pdf. Doktor bunu tipik bir atomik kullanım olarak gösteriyor, doğru değil mi? – user15964