2016-06-28 15 views
7

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!

+1

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. –

risposta

5
#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.

+0

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. –

+0

@ FranciscoJ.R.Ruiz è corretto. Se questa risposta è la tua domanda, sentiti libera di contrassegnarla come risposta :) – RyanP

+0

Certo! Molte grazie. –

Problemi correlati