Являются ли указатели закрытыми в параллельных секциях OpenMP? - PullRequest
9 голосов
/ 12 октября 2011

Я добавил OpenMP в существующую кодовую базу для распараллеливания цикла for.В области действия parallel for создается несколько переменных, включая указатель:

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

В полученных выходных файлах я заметил несоответствия, предположительно вызванные состоянием гонки.В итоге я решил проблему с расой, используя omp critical.Однако мой вопрос остается открытым: lm является приватным для каждого потока или является общим?

1 Ответ

10 голосов
/ 12 октября 2011

Да, все переменные, объявленные в регионе OpenMP, являются закрытыми. Это включает в себя указатели.

Каждый поток будет иметь свою собственную копию указателя.

Это позволяет вам делать такие вещи:

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".
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...