Вложенный цикл OpenMP Распараллеливание, приватный или публичный индекс?

Представьте, что у вас есть вложенный цикл для параллельной области, что-то вроде:

#pragma omp parallel
{
     for (int i = 0, ...) {
          for (int j = 0, ...) { }}}

или же

#pragma omp parallel
{
     for (int i = 0, ...) {
          for (int j = i, ...) { }}}

Если мы используем #pragma omp для автоматически, индекс i становится закрытым. Но... мы должны установить индекс j на частный или публичный? Каков эффект?

#pragma omp parallel
{
     #pragma omp for shared(j)
     for (int i = 0, ...) {
           for (int j = 0, ...) { }}}

или же

#pragma omp parallel
{
     #pragma omp for private(j)
     for (int i = 0, ...) {
          for (int j = 0, ...) { }}}

Заранее спасибо!

2 ответа

Решение

Приватный j не имеет никакого эффекта, так как по умолчанию j является приватным (поскольку он находится в пределах цикла i for, поэтому при создании нового потока j относится именно к этому потоку.

#pragma omp parallel for private(j)
for (int i = 0, ...) {
     for (int j = 0, ...) { }}

Если вы используете shared j это не должно иметь никакого эффекта, как указано выше, так как область действия j является локальной для каждого экземпляра i, если вы расширите область действия j до глобальной, вы столкнетесь с расой кодирования

Все, что объявлено внутри параллельной области, автоматически становится приватным. Это (по-видимому) поведение, которое вы хотите: каждая итерация i должен пройти через все j, j все циклы независимы (таким образом, частные, а не публичные). Тем не менее, вам на самом деле не хватает важного parallel часть: если не пишешь

#pragma omp parallel for

но только

#pragma omp for

тогда ничего не случится параллельно (если вы сначала не создали параллельную область с #pragma omp parallel в огороженном объеме)!

Другие вопросы по тегам