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!
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!
#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.
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. –
@ FranciscoJ.R.Ruiz to prawda. Jeśli ta odpowiedź to Twoje pytanie, możesz oznaczyć ją jako odpowiedź :) – RyanP
Pewnie! Wielkie dzięki. –
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. –