2009-11-10 12 views
6

Ho due funzioni, do_step_one(i) e do_step_two(i), per i da 0 a N-1.Come creare un `omp parallelo for` con sincronizzazione (` barrier`) di tutte le filettature nel mezzo con OpenMP

Attualmente, ho questo codice (sequenziale):

for(unsigned int i=0; i<N; i++) { 
    do_step_one(i); 
} 

for(unsigned int i=0; i<N; i++) { 
    do_step_two(i); 
} 

Ogni chiamata di do_step_one() e do_step2() può essere fatto in qualsiasi ordine e in parallelo, ma qualsiasi do_step_two() ha bisogno alla fine di tutto il do_step_one() per iniziare (usa i risultati do_step_one()).

ho provato la seguente:

#omp parallel for 
for(unsigned int i=0; i<N; i++) { 
    do_step_one(i); 

#omp barrier 

    do_step_two(i); 
} 

Ma gcc si lamenta

convolve_slices.c: 21: avvertimento: regione di barriera può non essere strettamente nidificato all'interno di work-sharing, critico, ordinato, area di attività principale o esplicita.

Cosa fraintendere? Come risolvere questo problema?

+0

la sintassi openMP sembra sbagliato - sia per le chiamate ti sembra di essere manca il '# pragma' - lo hai omesso o non c'è? –

+1

Lo ometto, mi dispiace, ma nel codice vero sono qui. –

risposta

4

Un problema che vedo con questo codice, è che il codice non è conforme con le specifiche :)

Se avete bisogno di tutto do_step_one() s 'alla fine, avrete bisogno di qualcosa come il seguente:

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

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

Il risultato di questo sarebbe un parallelismo del primo per, e quindi un parallelismo del secondo per.

+0

Ho dimenticato la maggior parte del mio lavoro OMP - questo metodo mantiene ancora i thread o ha bisogno di ricrearli per il secondo 'parallelo for'? –

+1

Non ne sono sicuro. È una questione di implementazione interiore. Formalmente, può creare nuovamente i thread per il secondo ciclo, ma penso che potrebbero avere delle ottimizzazioni evitandole. – Anna

+0

Oh, penso di capire ora dove stai andando - il primo per dovrà finire per iniziare il secondo, dal momento che il parallelismo è fatto per blocco. Per essere più sicuro (probabilmente non avrà alcun effetto), è possibile posizionare una barriera tra i due anelli. – Anna

11

Solo una nota a margine, se si vuole fare in modo i fili non vengono ricreati, separare la dichiarazione di parallelo e dichiarazione di per:

#pragma omp parallel 
{ 
    #pragma omp for 
    for(unsigned int i=0; i<N; i++){ 
    do_step_one(i); 
    } 
    //implicit barrier here 
    #pragma omp for 
    for(unsigned int i=0; i<N; i++){ 
    do_step_two(i); 
    } 
} 
Problemi correlati