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)
{
...
}
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:
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:
Bunlar eşdeğerdir.
#pragma omp parallel
bir 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 for
yönerge ile her iki şeyi aynı anda yapabilirsiniz .
#pragma omp parallel for
Yönergeyi kullandığımda da aynı şey iyi çalışıyor . Bir fark olmalı.
Burada ayrılmış parallel
ve for
burada kullanım örneği bulunmaktadır . Kısaca, for
döngüyü birkaç iş parçacığında yürütmeden önce OpenMP iş parçacığı-özel dizilerinin dinamik tahsisi için kullanılabilir . parallel for
Durumda 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
}
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.
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 for
ve kullanımını #pragma omp parallel
seri kodu daha yavaştır 179ms, kadar, çalışma zamanı vuruyor. (makinenin hw eşzamanlılığı 8'dir)
kod bağlanır libgomp
#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 for
içinde ek bir tane ile tekrar deneyin #pragm omp parallel
ve #pragma omp parallel for
sürüm gibi (aynı değilse) benzer şekilde çalışmalıdır .
Açıkçası pek çok cevap var, ama bu cevap çok güzel (kaynakla birlikte)
#pragma omp for
yalnı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ığı.
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.