2011-10-12 19 views
9

Ho aggiunto OpenMP a un codice esistente per parallelizzare un ciclo for. Diverse variabili sono create all'interno del campo di applicazione della regione parallel for, tra cui un puntatore:I puntatori sono privati ​​nelle sezioni parallele di OpenMP?

#pragma omp parallel for 
for (int i = 0; i < n; i++){ 
    [....] 
    Model *lm; 
    lm->myfunc(); 
    lm->anotherfunc(); 
    [....] 
} 

nei file di output risultanti ho notato incongruenze, presumibilmente causate da una condizione di competizione. Alla fine ho risolto le condizioni della gara usando un omp critical. La mia domanda rimane, però: è lm privata per ogni thread, o è condivisa?

risposta

10

Sì, tutte le variabili dichiarate all'interno della regione OpenMP sono private. Questo include i puntatori.

Ogni thread avrà una propria copia del puntatore.

Ti permette di fare cose come questa:

int threads = 8; 
int size_per_thread = 10000000; 

int *ptr = new int[size_per_thread * threads]; 

#pragma omp parallel num_threads(threads) 
    { 
     int id = omp_get_thread_num(); 
     int *my_ptr = ptr + size_per_thread * id; 

     // Do work on "my_ptr". 
    } 
+0

Grazie per la risposta. Leggendo le specifiche, sembrava ... come se fosse il caso, ma era un po 'oscuro. – argoneus

Problemi correlati