Apa perbedaan antara keduanya?
[SEBUAH]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Saya tidak berpikir ada perbedaan, yang satu adalah jalan pintas untuk yang lain. Meskipun penerapan tepat Anda mungkin menanganinya secara berbeda.
Konstruksi worksharing paralel gabungan adalah pintasan untuk menentukan konstruksi paralel yang berisi satu konstruksi worksharing dan tidak ada pernyataan lain. Klausa yang diizinkan adalah gabungan dari klausa yang diizinkan untuk konstruksi paralel dan pembagian kerja.
Diambil dari http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
Spesifikasi OpenMP ada di sini:
Ini setara.
#pragma omp parallel
memunculkan sekelompok utas, sementara #pragma omp for
membagi iterasi perulangan antara utas yang muncul. Anda dapat melakukan kedua hal tersebut sekaligus dengan #pragma omp parallel for
arahan gabungan .
schedule(static, chunk)
klausa in untuk direktif, saya mendapatkan masalah. Kode berjalan dengan baik tetapi ketika saya memanggil kode ini dari program MPI maka itu berjalan ke loop tak terbatas. Penghitung pengulangan bernilai nol di semua iterasi pengulangan ini. Saya memiliki penghitung loop yang didefinisikan sebagai privat dalam#pragma omp parallel
arahan. Tidak tahu mengapa itu hanya gagal ketika MPI memanggil kode. Saya agak yakin bahwa setiap proses MPI berjalan pada prosesor cluster yang berbeda jika itu penting. Tidak tahu apakah jadwal yang menyebabkan masalah.#pragma omp parallel for
direktif. Harus ada perbedaan.Berikut adalah contoh penggunaan terpisah
parallel
dan difor
sini . Singkatnya, ini dapat digunakan untuk alokasi dinamis array thread-private OpenMP sebelum menjalankanfor
siklus di beberapa thread. Tidak mungkin melakukan inisialisasi yang sama dalamparallel for
kasus.UPD: Pada contoh pertanyaan tidak ada perbedaan antara pragma tunggal dan dua pragma. Namun dalam praktiknya, Anda dapat membuat lebih banyak perilaku thread sadar dengan paralel terpisah dan untuk arahan. Beberapa kode misalnya:
sumber
Meskipun kedua versi dari contoh spesifik tersebut setara, seperti yang telah disebutkan dalam jawaban lain, masih ada satu perbedaan kecil di antara keduanya. Versi pertama menyertakan penghalang implisit yang tidak perlu, yang ditemukan di akhir "omp for". Penghalang implisit lainnya dapat ditemukan di ujung wilayah paralel. Menambahkan "nowait" ke "omp for" akan membuat kedua kode itu setara, setidaknya dari perspektif OpenMP. Saya menyebutkan ini karena kompiler OpenMP dapat menghasilkan kode yang sedikit berbeda untuk kedua kasus tersebut.
sumber
Saya melihat runtime yang sangat berbeda ketika saya mengambil for loop di g ++ 4.7.0 dan menggunakan
kode serial (tidak
openmp
) berjalan dalam 79 ms. kode "paralel untuk" berjalan dalam 29 ms. Jika saya menghilangkanfor
dan menggunakan#pragma omp parallel
, runtime akan menembak hingga 179ms, yang lebih lambat dari kode serial. (mesin memiliki hw konkurensi 8)kode tertaut ke
libgomp
sumber
#pragma omp for
adanya multi-threaded sharing dari loop sama sekali. Tapi itu bukan kasus OP, coba lagi dengan tambahan#pragma omp for
di dalam#pragm omp parallel
dan itu akan berjalan serupa (jika tidak sama) seperti#pragma omp parallel for
versinya.Jelas ada banyak jawaban, tetapi yang ini menjawabnya dengan sangat baik (dengan sumber)
dan:
https://bisqwit.iki.fi/story/howto/openmp/
sumber