OpenMP - Почему firstprivate вызывает ошибку? - PullRequest
2 голосов
/ 17 января 2011

Почему я получаю эту ошибку и что мне делать?

error: firstprivate variable 'j' is private in outer context

void foo() {
    int i;
    int j = 10;
    #pragma omp for firstprivate(j)
    for (i = 0; i < 10; i++)
        printf("%d\n", j);
}

Ответы [ 2 ]

7 голосов
/ 17 января 2011

Работает, если вы используете прагму

#pragma omp parallel for firstprivate(j)

Обратите внимание, что omp for и omp parallel for - это не одно и то же: последнее является сокращением для omp for внутри omp parallel.

1 голос
/ 17 января 2011

Я удалил свой первый ответ, потому что я что-то пропустил, и это было неправильно. Ошибка является правильной из-за ограничения в спецификации OpenMP V3.0 (и предыдущих версиях), раздел 2.9.3.4 firstprivate, Ограничения bullet 2:

• Элемент списка, который является закрытым в параллельной области, не должен появляться в пункт firstprivate для конструкции с разделением рабочих мест, если она существует регионы, возникающие из конструкции совместного использования, когда-либо связываются с любой из параллельных области, вытекающие из параллельной конструкции.

Проблема заключается в том, что он не знает, какое частное значение использовать среди потоков, которые должны выполнять область общего доступа. Если это новая параллельная область, то каждый поток создаст новую область, и firstprivate копируется из личной копии потока, создающего область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...