2011-10-12 11 views
9

Dodałem OpenMP do istniejącej bazy kodu, aby zrównoleglić pętlę for. Kilka zmienne są tworzone wewnątrz zakresu regionie parallel for, w tym wskaźnik:Czy wskaźniki są prywatne w sekcjach równoległych OpenMP?

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

w wynikowym pliku wyjściowego zauważyłem niespójności, przypuszczalnie spowodowane przez wyścigu. Ostatecznie rozwiązałem warunki wyścigu, używając omp critical. Pozostaje jednak moje pytanie: czy lm jest prywatne dla każdego wątku, czy też jest udostępniane?

Odpowiedz

10

Tak, wszystkie zmienne zadeklarowane w regionie OpenMP są prywatne. Obejmuje to wskaźniki.

Każdy wątek będzie miał własną kopię wskaźnika.

To pozwala robić rzeczy tak:

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

Dzięki za odpowiedź. Odczytując specyfikację, wyglądało to tak, jakby tak było, ale było to trochę niejasne. – argoneus

Powiązane problemy