2011-10-12 9 views
9

He agregado OpenMP a una base de código existente para paralelizar un ciclo for. Varias variables se crean dentro del ámbito de la región parallel for, incluyendo un puntero:¿Los punteros son privados en las secciones paralelas de OpenMP?

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

En los archivos de salida resultantes he notado inconsistencias, presumiblemente causadas por una condición de carrera. Finalmente resolví la condición de carrera usando un omp critical. Mi pregunta sigue siendo: ¿es lm privado para cada hilo, o se comparte?

Respuesta

10

Sí, todas las variables declaradas dentro de la región OpenMP son privadas. Esto incluye punteros.

Cada hilo tendrá su propia copia del puntero.

Te permite hacer cosas como esta:

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

Gracias por la respuesta. Al leer la especificación, parece _ como si ese fuera el caso, pero no estaba claro. – argoneus

Cuestiones relacionadas