Pertanyaan Apakah variabel dalam lingkaran paralel memastikan untuk diperbarui?


Saya telah membaca artikel ini: Pemrograman Paralel di Fortran 95 menggunakan OpenMP Di mana ia membaca di halaman 11 dan 12 bahwa:

real(8) :: A(1000), B(1000) 
! $OMP PARALLEL DO
do i = 1, 1000 
   B(i) = 10 * i 
   A(i) = A(i) + B(i) 
enddo
! $OMP END PARALLEL DO

Mungkin tidak berfungsi sejak matriks BNilai-nilai tidak dijamin sampai ! $OMP END (PARALLEL) DO. Bagi saya ini sangat penting. Saya memiliki beberapa loop dengan banyak pernyataan yang bergantung pada pernyataan sebelumnya dalam lingkaran do dan saya pikir ini akan menjadi alami. Saya mengerti itu B(j) tidak dapat dipastikan dalam iterasi i mengingat bahwa i/=j tetapi dalam iterasi yang sama saya pikir itu seperti yang diberikan. Apakah saya benar atau saya salah mengerti? Jika cara ini, apakah ada perintah untuk memastikan bahwa setidaknya dalam iterasi nilai variabel diperbarui untuk setiap pernyataan sebelum berikutnya?

Saya telah mencoba beberapa loop sederhana yang tampaknya berfungsi, seperti halnya kode serial, tetapi saya memiliki beberapa kode lain yang tampaknya lebih acak: bekerja dengan / O3 tetapi tidak / O0, kode ini cukup besar dan agak sulit dibaca jadi saya tidak akan mempostingnya di sini ...)


4
2017-07-03 20:21


asal


Jawaban:


Itu terlihat sangat aneh. Jika itu seperti itu sebagian besar kode yang akan Anda lihat yang menggunakan OpenMP akan menjadi tidak sesuai. Anda akan melihat hal-hal seperti ini di seluruh basis kode saya dan saya percaya bahwa klaim itu palsu. Sayangnya tidak ada kutipan langsung dari bagian spesifikasi yang relevan di sana dan sulit untuk mencari apa yang ada dalam pikiran.

Saya bahkan akan mengatakan bahwa fitur seperti atomic dan critical bagian-bagian akan kehilangan arti jika itu seperti yang diklaim oleh penulis.

Tanpa melihat kode yang acak untuk Anda, kami tidak bisa mengatakan apa pun, lebih baik mungkin tidak menyebutkannya sama sekali jika Anda tidak berencana untuk menunjukkannya.


4
2017-07-03 20:36



Pernyataan dalam artikel yang direferensikan adalah salah.

Silahkan lihat di kertas "Model Memori OpenMP", yang menjelaskan model memori OpenMP dengan cukup baik.

Setiap utas diizinkan memiliki "tampilan sementara" sendiri di bagian bersama memori dan aliran di kedua arah antara "tampilan" dan "memori" itu mungkin tertunda (meskipun pembaruan dapat dipaksakan oleh flush panggilan dll.). Tetapi tidak ada batasan dalam pandangan yang sama. Dan karena setiap iterasi dijamin dieksekusi hanya dengan satu utas, Anda dapat mengharapkan perilaku normal dalam satu iterasi. Jadi contoh yang diberikan dijamin bekerja seperti yang diharapkan.


2
2017-07-08 20:30