Данные OpenMP и C99 - PullRequest
       5

Данные OpenMP и C99

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

Как OpenMP работает с данными, объявленными в параллельном разделе? До C99 я использовал предложение private () для указания локальных данных потока, например,

int i, x;
#pragma omp parallel for private(x)
for (i=0; i<n; i++) {
   x=i;
}

Теперь, когда C99 позволяет смешивать данные и код, я предпочитаю объявлять переменные непосредственно перед их использованием. Гарантирует ли объявление данных в рамках цикла, что оно является частным потоком? Например, является ли следующее действительным?

#pragma omp parallel for
for (int i=0; i<n; i++) {
   int x=i;
}

Я пытался добавить private (x) на всякий случай, но мой объект компилятора (возможно, поскольку x еще не объявлен).

Ответы [ 2 ]

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

Некоторые переменные, в том числе объявленные в параллельной конструкции, имеют заранее определенные атрибуты совместного использования данных (например, вы не можете объявить их shared или private).Они определены в разделе 2.9.1.1 в стандарте OMP3.

В этом случае OpenMP Standard 3.0 , 2.9.1.1: (p78, строка 12) «Переменные с автоматическим сроком хранения, объявленные в области видимости внутри конструкции, являются частными».Я уверен, что так было всегда в OpenMP.Так что да, в вашем примере C99 i и x являются частными;с другой стороны, я понимаю тот же раздел, чтобы сказать, что если бы x было объявлено статическим, оно было бы передано.Я думаю, что в этом отношении он более или менее делает то, что вы ожидаете.

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

C всегда разрешено для объявления x внутри блока for. так что нет никакой разницы, и вы должны были сделать это раньше.

Разница фактически заключается в объявлении i. Это в C89, вы должны были бы объявить до цикла for. Затем OMP сам «знает», что переменная цикла должна быть локальной для каждого потока.

int i;
#pragma omp parallel for
for (i=0; i<n; i++) {
   int x=i;
}

Здесь C99 действительно облегчает вашу жизнь и разъясняет ваш код.

...