In C++ con openMP, c'è qualche differenza trapragma omp parallelo vs. pragma omp parallelo
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
e
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Grazie!
In C++ con openMP, c'è qualche differenza trapragma omp parallelo vs. pragma omp parallelo
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
e
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Grazie!
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
Questo codice crea un'area parallela e ogni singolo thread esegue ciò che si trova nel ciclo. In altre parole, si esegue il ciclo N volte completo, invece di N thread che suddividono il loop e completano tutte le iterazioni una sola volta.
Si può fare:
#pragma omp parallel
{
#pragma omp for
for(int i=0; i < N; ++i)
{
}
#pragma omp for
for(int i=0; i < N; ++i)
{
}
}
Questo creerà una regione parallela (aka una forchetta/unirsi, che è costoso e quindi non si vuole farlo per ogni ciclo) ed eseguire cicli multipli in parallelo all'interno di quella regione. Assicurati solo di disporre di un'area parallela in cui usi #pragma omp for
anziché #pragma omp parrallel for
poiché quest'ultimo significherà che ciascuno dei tuoi N thread genera N altri thread per eseguire il ciclo.
Vedo; questo è quello di cui avevo bisogno. Quindi la prima opzione ('#pragma omp parallel') eseguiva le iterazioni Nthreads * N in totale e qualsiasi istruzione della forma' vec [i] = result; 'all'interno del ciclo farebbe confusione. –
@ FranciscoJ.R.Ruiz è corretto. Se questa risposta è la tua domanda, sentiti libera di contrassegnarla come risposta :) – RyanP
Certo! Molte grazie. –
Il secondo caso ha ogni thread per lo stesso lavoro (l'intero ciclo per). Il primo caso condivide il lavoro tra i thread in modo che ogni thread esegua iterazioni 'N/t' dove' t' è il numero di thread. –