2012-05-04 13 views
8

C'è una barriera OMP implicita dopo OMP sezione criticaC'è una barriera implicita dopo OMP sezione critica

Per esempio, posso modificare questo codice seguente versione-1 in versione-2.

VERSIONE-1

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} 

VERSION-2

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) nowait 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} // will I get the right "min" after this (because I have included nowait) 

Avrò ottenere lo stesso risultato sia per la versione 1 e la versione-2?

Esiste una barriera implicita dopo la regione omp-critical?

EDIT: Scusate se l'esempio è molto povera .. Inoltre, vorrei sapere se ci sarebbe alcuna differenza di prestazioni tra la versione-1 e la versione 2-

+0

Probabilmente non è il migliore esempio dato che ci sarà una barriera quando si lascia la regione parallela. Ma buona domanda comunque. +1 – Mysticial

+0

Non c'è alcun vantaggio in termini di prestazioni in v2 rispetto a v1 nell'esempio inventato che hai pubblicato, ma nel mondo reale, ci potrebbe essere. –

risposta

11

sezioni critiche non hanno barriere , né ai loro inizi né alle loro estremità. Una sezione critica è un costrutto synchornisation a sé stante che impedisce a più thread di accedere contemporaneamente agli stessi dati. È necessaria una barriera aggiuntiva dopo la sezione critica se si desidera avere il minimo globale corretto prima di uscire dalla regione parallela. Come già detto, la regione parallela ha una barriera implicita alla fine.

0

Otterrete un vantaggio in termini di prestazioni utilizzando nowait se sono presenti un numero elevato di iterazioni.

Problemi correlati