2016-06-28 34 views
7

paralelPragma OMP paralel OpenMP ile C++ olarak

#pragma omp parallel for 
for(int i=0; i<N; i++) { 
    ... 
} 

ve

#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

arasında herhangi bir fark var mı?

Teşekkürler!

+1

İkinci durumda, her iş parçacığı aynı işe (tüm döngü için) sahiptir. İlk durum, iş parçacıkları arasındaki çalışmayı paylaşır, böylece her bir iş parçacığı, 't' iş parçacığının sayısı olan 'N/t' yineleme yapar. –

cevap

5
#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

Bu kod, paralel bir bölge oluşturur ve her bir iş parçacığı, döngüde olanı yürütür. Diğer bir deyişle, döngüyü ayıran ve tüm yinelemeleri sadece bir kez tamamlayan N iş parçacığı yerine tam döngü N kere yaparsınız.

Sen yapabilirsiniz:

#pragma omp parallel 
{ 
    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 

    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 
} 

Bu yaratacak bir paralel bölgesini (aka bir çatal/pahalı olan katılmak ve bu nedenle her döngü için yapmak istemiyorum) ve çoklu döngüler çalıştırmak bu bölgeye paralel. Paralel bir bölgeniz varsa, #pragma omp parrallel for'un aksine #pragma omp for'u kullandığınızdan emin olun çünkü ikincisi, N iş parçacığınızın her birinin döngü yapmak için N daha fazla iş parçacığı oluşturduğunu gösterir.

+0

Görüyorum; ihtiyacım olan buydu. Böylece ilk seçenek (#pragma omp parallel') toplamda Nthreads * N yinelemelerini yürütecek ve formun herhangi bir ifadesi vec [i] = result; –

+0

@ FranciscoJ.R.Ruiz bu doğru. Eğer bu soruya cevap verirseniz, cevap olarak işaretlemekten çekinmeyin :) – RyanP

+0

Elbette! Çok teşekkürler. –