omp paralel ve omp paralel


105

Bu ikisi arasındaki fark nedir?

[A]

#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)
{
   ...
}

Yanıtlar:


65

Bir fark olduğunu sanmıyorum, biri diğeri için kısayol. Tam uygulamanız onlarla farklı şekilde ilgilense de.

Birleşik paralel iş paylaşımı yapıları, bir iş paylaşımı yapısını içeren ve başka bir ifade içermeyen bir paralel yapıyı belirtmek için bir kısayoldur. İzin verilen hükümler, paralel ve iş paylaşım sözleşmeleri için izin verilen hükümlerin birleşimidir.

Alındığı http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf

OpenMP için teknik özellikler burada:

https://openmp.org/specifications/


66

Bunlar eşdeğerdir.

#pragma omp parallelbir grup iş parçacığı üretirken #pragma omp for, döngü yinelemelerini ortaya çıkan iş parçacıkları arasında böler. Kaynaşmış #pragma omp parallel foryönerge ile her iki şeyi aynı anda yapabilirsiniz .


Kodumda bu yapıyı kullanıyorum. Ancak schedule(static, chunk)yönerge için in cümlesini kullandığımda bir sorunla karşılaşıyorum. Kod iyi çalışıyor ancak bu kodu bir MPI programından çağırdığımda sonsuz bir döngüye giriyor. Döngü sayacı, bu döngünün tüm yinelemelerinde sıfırdır. Yönergede özel olarak tanımlanan döngü sayacına sahibim #pragma omp parallel. MPI kodu çağırdığında neden başarısız olduğu hakkında hiçbir fikrim yok. Her bir MPI işleminin, önemliyse, kümenin farklı bir işlemcisi üzerinde çalıştığından biraz eminim. Soruna programın neden olup olmadığı hakkında hiçbir fikrim yok.
Rohit Banga

#pragma omp parallel forYönergeyi kullandığımda da aynı şey iyi çalışıyor . Bir fark olmalı.
Rohit Banga

1
Güncelleme: Görünüşe göre, bu problemi sadece zamanlama cümlesini kullandığımda gözlemliyorum, bu yüzden sanırım bu birleşik paralel komutunu veya iki farklı direktif için kullanıp kullanmadığıma bağlı değil.
Rohit Banga

28

Burada ayrılmış parallelve for burada kullanım örneği bulunmaktadır . Kısaca, fordöngüyü birkaç iş parçacığında yürütmeden önce OpenMP iş parçacığı-özel dizilerinin dinamik tahsisi için kullanılabilir . parallel forDurumda aynı başlatmayı yapmak imkansızdır .

UPD: Soru örneğinde tek pragma ile iki pragma arasında hiçbir fark yoktur. Ancak pratikte, ayrılmış paralel ve yönergeler için daha fazla iş parçacığı duyarlı davranış yapabilirsiniz. Örneğin bazı kodlar:

#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
}

9

Spesifik örneğin her iki versiyonu da eşdeğer olsa da, diğer cevaplarda da belirtildiği gibi, aralarında hala küçük bir fark vardır. İlk versiyon, "omp for" ifadesinin sonunda karşılaşılan gereksiz örtük bir engel içerir. Diğer örtük bariyer, paralel bölgenin sonunda bulunabilir. "Nowait" in "omp for" öğesine eklenmesi, iki kodu en azından bir OpenMP açısından eşdeğer kılar. Bundan bahsediyorum çünkü bir OpenMP derleyicisi iki durum için biraz farklı kod üretebilir.


7

G ++ 4.7.0'da bir for döngüsü aldığımda ve kullandığımda oldukça farklı çalışma süreleri görüyorum

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];

seri kodu (no openmp) 79 ms'de çalışır. "paralel" kodu 29 ms'de çalışır. Ben atlarsanız forve kullanımını #pragma omp parallelseri kodu daha yavaştır 179ms, kadar, çalışma zamanı vuruyor. (makinenin hw eşzamanlılığı 8'dir)

kod bağlanır libgomp


2
bence omp paralel döngüyü ayrı bir iş parçacığında döngüyü iş parçacıklarına bölmeden yürüttüğü için, ana iş parçacığı ikinci iş parçacığının bitmesini bekliyor. ve senkronizasyon için zaman harcanır.
Antigluk

7
Bunun nedeni #pragma omp for, döngüde çok iş parçacıklı paylaşımın olmamasıdır. Ancak yine de OP'lerin durumu bu değildi, #pragma omp foriçinde ek bir tane ile tekrar deneyin #pragm omp parallelve #pragma omp parallel forsürüm gibi (aynı değilse) benzer şekilde çalışmalıdır .
Christian Rau

2
Bu yanıtı, "eşdeğer" olmadıklarını gösterdiği için en iyisi olarak görüyorum
Failed Scientist

6

Açıkçası pek çok cevap var, ama bu cevap çok güzel (kaynakla birlikte)

#pragma omp foryalnızca mevcut takımdaki farklı iş parçacıkları için döngünün bölümlerini temsil eder . Takım, programı yürüten iş parçacığı grubudur. Program başlangıcında, ekip yalnızca tek bir üyeden oluşur : programı çalıştıran ana iş parçacığı .

Yeni bir iş parçacığı ekibi oluşturmak için, paralel anahtar kelimeyi belirtmeniz gerekir. Çevreleyen bağlamda belirtilebilir:

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

ve:

Nedir: paralel, bir takım için

Paralel, paralel ve for arasındaki fark aşağıdaki gibidir:

Bir takım, şu anda yürütülen iş parçacığı grubudur. Program başlangıcında ekip tek bir iş parçacığından oluşur. Paralel bir yapı, mevcut iş parçacığını bir sonraki blok / ifade süresi boyunca yeni bir iş parçacığı takımına böler ve ardından takım tek bir iş parçacığına geri döner. for döngüsünün çalışmasını mevcut takımın konuları arasında böler.

Konu oluşturmaz, yalnızca işi halihazırda yürütmekte olan ekibin konuları arasında böler. paralel için aynı anda iki komutun kısaltmasıdır: paralel ve için. Paralel, yeni bir takım oluşturur ve bu takımın döngünün farklı bölümlerini ele alması için. Programınız hiçbir zaman paralel bir yapı içermiyorsa, hiçbir zaman birden fazla iş parçacığı yoktur; iş parçacığı olmayan programlarda olduğu gibi programı başlatan ve çalıştıran ana iş parçacığı.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.