2016-03-23 16 views
3
Ben atomic sınamak için aşağıdaki Fortran kod yazdım

ve criticalNeden 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

enter image description here

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?

+0

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. –

+0

Bence yarış durumu aslında a = atmp; Paralel bölgede b = btmp'. Ama kodu çok uzun süre çalışmadım. –

+0

@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

cevap

6

Kodunuzdaki sorun yarış durumu

!$omp parallel 

... 
    a=atmp 
    b=btmp 
... 
    !$omp end parallel 

bütün konuları bu işlemi yapmak ve onlar çatışma olduğunu. Bu satırların etrafında omp single olmasını istiyorsunuz. Her iş parçacığı farklı bir dizi öğesi çalışır çünkü

Sen

!$omp do 
do i=1,10 
    B(I) = B(I)+A(I) 
end do 
!$omp end do 

herhangi atomic veya critical gerekmez. OpenMP şartname adresinin örnekte

konu

!$OMP PARALLEL DO SHARED(X, Y, INDEX, N) 
DO I=1,N 
    !$OMP  ATOMIC UPDATE 
    X(INDEX(I)) = X(INDEX(I)) + WORK1(I) 

yılında dizi veya işlev INDEX(I) farklı I ile iki farklı diş için aynı değeri döndürebilir ve bu potansiyel yarış durumu korumak gerektiğidir.

+0

Güzel cevabınız için çok teşekkür ederim! – user15964