omp parallel vs. omp parallel untuk

105

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)
{
   ...
}
Hyunjik Bae
sumber

Jawaban:

65

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:

https://openmp.org/specifications/

Ade Miller
sumber
66

Ini setara.

#pragma omp parallelmemunculkan sekelompok utas, sementara #pragma omp formembagi iterasi perulangan antara utas yang muncul. Anda dapat melakukan kedua hal tersebut sekaligus dengan #pragma omp parallel forarahan gabungan .

Krzysztof Kosiński
sumber
Dalam kode saya, saya menggunakan struktur ini. Namun ketika saya menggunakan 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 parallelarahan. 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.
Rohit Banga
Hal yang sama berfungsi dengan baik saat saya menggunakan #pragma omp parallel fordirektif. Harus ada perbedaan.
Rohit Banga
1
Pembaruan: Ternyata, saya mengamati masalah ini hanya ketika saya menggunakan klausa jadwal jadi saya kira itu tidak tergantung pada apakah saya menggunakan paralel gabungan untuk atau dua arahan yang berbeda.
Rohit Banga
28

Berikut adalah contoh penggunaan terpisah paralleldan di for sini . Singkatnya, ini dapat digunakan untuk alokasi dinamis array thread-private OpenMP sebelum menjalankan forsiklus di beberapa thread. Tidak mungkin melakukan inisialisasi yang sama dalam parallel forkasus.

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:

#pragma omp parallel
{ 
    double *data = (double*)malloc(...); // this data is thread private

    #pragma omp for
    for(1...100) // first parallelized cycle
    {
    }

    #pragma omp single 
    {} // make some single thread processing

    #pragma omp for // second parallelized cycle
    for(1...100)
    {
    }

    #pragma omp single 
    {} // make some single thread processing again

    free(data); // free thread private data
}
NtsDK
sumber
9

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.

phadjido
sumber
7

Saya melihat runtime yang sangat berbeda ketika saya mengambil for loop di g ++ 4.7.0 dan menggunakan

std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;

for (int i = 0; i < 5000000; i++)
{
   double r1 = ((double)rand() / double(RAND_MAX)) * 5;
   double r2 = ((double)rand() / double(RAND_MAX)) * 5;
   x.push_back(r1);
   y.push_back(r2);
}

int sz = x.size();

#pragma omp parallel for

for (int i = 0; i< sz; i++)
   prod[i] = x[i] * y[i];

kode serial (tidak openmp) berjalan dalam 79 ms. kode "paralel untuk" berjalan dalam 29 ms. Jika saya menghilangkan fordan menggunakan #pragma omp parallel, runtime akan menembak hingga 179ms, yang lebih lambat dari kode serial. (mesin memiliki hw konkurensi 8)

kode tertaut ke libgomp

parcompute
sumber
2
saya pikir itu karena omp parallel mengeksekusi loop di utas terpisah tanpa membaginya menjadi utas, jadi utas utama menunggu utas kedua selesai. dan waktu dihabiskan untuk sinkronisasi.
Antigluk
7
Hal ini karena tanpa #pragma omp foradanya multi-threaded sharing dari loop sama sekali. Tapi itu bukan kasus OP, coba lagi dengan tambahan #pragma omp fordi dalam #pragm omp paralleldan itu akan berjalan serupa (jika tidak sama) seperti #pragma omp parallel forversinya.
Christian Rau
2
Saya melihat jawaban ini sebagai yang terbaik karena menunjukkan bahwa mereka tidak "setara"
Ilmuwan Gagal
6

Jelas ada banyak jawaban, tetapi yang ini menjawabnya dengan sangat baik (dengan sumber)

#pragma omp forhanya mendelegasikan bagian loop untuk utas berbeda dalam tim saat ini. Sebuah tim adalah sekelompok utas yang menjalankan program. Saat program dimulai, tim hanya terdiri dari satu anggota: utas utama yang menjalankan program.

Untuk membuat tim utas baru, Anda perlu menentukan kata kunci paralel. Ini dapat ditentukan dalam konteks sekitarnya:

#pragma omp parallel
{
   #pragma omp for
   for(int n = 0; n < 10; ++n)
   printf(" %d", n);
}

dan:

Apa itu: paralel, untuk dan tim

Perbedaan antara parallel, parallel for dan for adalah sebagai berikut:

Tim adalah kumpulan utas yang saat ini dieksekusi. Pada awal program, tim terdiri dari satu utas. Konstruksi paralel membagi utas saat ini menjadi tim utas baru selama durasi blok / pernyataan berikutnya, setelah itu tim bergabung kembali menjadi satu. untuk membagi pekerjaan for-loop di antara utas tim saat ini.

Itu tidak membuat utas, itu hanya membagi pekerjaan di antara utas tim yang saat ini mengeksekusi. parallel for adalah singkatan dari dua perintah sekaligus: parallel dan for. Parallel membuat tim baru, dan untuk memisahkan tim tersebut untuk menangani bagian loop yang berbeda. Jika program Anda tidak pernah berisi konstruksi paralel, tidak akan pernah ada lebih dari satu thread; utas master yang memulai program dan menjalankannya, seperti pada program non-threading.

https://bisqwit.iki.fi/story/howto/openmp/

fogx
sumber