2016-06-28 13 views
7

C++ z OpenMP, nie ma żadnych różnic pomiędzypragmy OMP równolegle do porównaniu pragmy OMP równolegle

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

i

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

?

Dzięki!

+1

Drugi przypadek ma każdy wątek do tego samego zadania (cała pętla for). Pierwszy przypadek dzieli pracę między wątkami, więc każdy wątek wykonuje iteracje 'N/t', gdzie' t' jest liczbą wątków. –

Odpowiedz

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

Ten kod tworzy równoległy region, a każdy wątek wykonuje to, co zawiera pętla. Innymi słowy, wykonujesz pełną pętlę N razy, zamiast N wątków, rozdzielając pętlę i kończąc wszystkie iteracje tylko raz.

można zrobić:

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

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

stworzy jeden region równoległy (aka jeden widelec/join, co jest kosztowne i dlatego nie chcesz to zrobić dla każdej pętli) i uruchomić wiele pętle równolegle w tym regionie. Tylko upewnij się, że masz już region równoległy, którego używasz #pragma omp for w przeciwieństwie do #pragma omp parrallel for, ponieważ ten drugi będzie oznaczał, że każdy z twoich wątków spawnuje N więcej wątków do wykonania pętli.

+0

Widzę; tego właśnie potrzebowałem. Tak więc pierwsza opcja ('#pragma omp parallel') wykonałaby w sumie Nthreads * N iteracje i dowolną instrukcję w postaci' vec [i] = result; 'wewnątrz pętli wszystko zepsułoby. –

+0

@ FranciscoJ.R.Ruiz to prawda. Jeśli ta odpowiedź to Twoje pytanie, możesz oznaczyć ją jako odpowiedź :) – RyanP

+0

Pewnie! Wielkie dzięki. –

Powiązane problemy