2013-03-08 9 views
48

Ho dato un'occhiata alle definizioni ufficiali, ma sono ancora abbastanza confuso.In che modo FirstPlus e LastPliving differiscono dalle clausole private in OpenMP?

firstprivate: specifica che ciascun filo deve avere una propria istanza di una variabile, e che la variabile deve essere inizializzato con il valore della variabile, poiché esiste prima del costrutto parallelo.

Per me, sembra molto privato. Ho cercato degli esempi, ma non sembra capire come sia speciale o come possa essere usato.

lastprivate: Specifica che la versione del contesto racchiude della variabile è impostata uguale alla versione privata di qualsiasi thread esegue l'iterazione finale (ad anello costrutto) o ultima sezione (sezioni #pragma).

Mi sento come se ho capito questo un po 'meglio a causa del seguente esempio:

#pragma omp parallel 
{ 
    #pragma omp for lastprivate(i) 
     for (i=0; i<n-1; i++) 
     a[i] = b[i] + b[i+1]; 
} 
a[i]=b[i]; 

Quindi, in questo esempio, capisco che lastprivate consente una i da restituire al di fuori del ciclo come l'ultimo valore era.

Ho appena iniziato ad imparare OpenMP oggi.

risposta

103

private le variabili non sono inizializzate, ovvero iniziano con valori casuali come qualsiasi altra variabile automatica locale (e vengono spesso implementate utilizzando variabili automatiche nello stack di ogni thread). Prendere questo semplice programma come esempio:

#include <stdio.h> 
#include <omp.h> 

int main (void) 
{ 
    int i = 10; 

    #pragma omp parallel private(i) 
    { 
     printf("thread %d: i = %d\n", omp_get_thread_num(), i); 
     i = 1000 + omp_get_thread_num(); 
    } 

    printf("i = %d\n", i); 

    return 0; 
} 

Con quattro fili emette qualcosa come:

thread 0: i = 0 
thread 3: i = 32717 
thread 1: i = 32717 
thread 2: i = 1 
i = 10 

(another run of the same program) 

thread 2: i = 1 
thread 1: i = 1 
thread 0: i = 0 
thread 3: i = 32657 
i = 10 

Ciò dimostra chiaramente che il valore di i è casuale (non inizializzato) all'interno della regione parallelo e eventuali modifiche ad esso non sono visibili dopo la regione parallela (cioè la variabile mantiene il suo valore da prima di entrare nella regione).

Se i è costituito firstprivate, allora viene inizializzato con il valore che ha prima regione parallelo:

thread 2: i = 10 
thread 0: i = 10 
thread 3: i = 10 
thread 1: i = 10 
i = 10 

Ancora modifiche al valore i all'interno della regione parallelo non sono visibili dopo.

Si conosce già lastprivate (e non è applicabile al semplice programma di dimostrazione in quanto manca di costrutti di condivisione del lavoro).

Quindi sì, firstprivate e lastprivate sono solo casi speciali di private. Il primo porta a inserire valori dal contesto esterno nella regione parallela mentre il secondo trasferisce valori dalla regione parallela al contesto esterno. La logica alla base di queste classi di condivisione dei dati è che all'interno della regione parallela tutte le variabili private ombreggiano quelle del contesto esterno, cioè non è possibile utilizzare un'operazione di assegnazione per modificare il valore esterno di i dall'interno dell'area parallela.

+1

Questa è un'ottima risposta! Grazie mille! – SaiyanGirl

+0

Beh, direi che "firstprivate" e "lastprivate" sono casi MOLTO speciali di "private". Di solito non è nemmeno necessario usare 'private' (basta definire la variabile all'interno del parallel block), possibilmente oscurando l'ambito esterno. Interessante è l'uso di oggetti C++ come variabili 'firstprivate' automatiche - saranno inizializzate attraverso la costruzione della copia, una volta, e distrutte dopo il blocco, e non è necessario conoscere il numero di thread in anticipo - poiché molte copie essere creato in base alle esigenze. –

+0

Un grande esempio! Piace di più. Apprezzo Hristo. – Fusionmate

1

firstprivate e lastprivate sono solo casi speciali di private.

Il primo porta a inserire valori dal contesto esterno nella regione parallela mentre il secondo trasferisce valori dalla regione parallela al contesto esterno.

+0

potresti fornire qualche riferimento a riguardo? –

Problemi correlati