Вопрос по c++ – OpenMP вложенная параллель для циклов против внутренней параллели для

22

Если я использую вложенную параллель для таких циклов:

<code>#pragma omp parallel for schedule(dynamic,1)
for (int x = 0; x < x_max; ++x) {
    #pragma omp parallel for schedule(dynamic,1)
    for (int y = 0; y < y_max; ++y) { 
    //parallelize this code here
   }
//IMPORTANT: no code in here
}
</code>

это эквивалентно:

<code>for (int x = 0; x < x_max; ++x) {
    #pragma omp parallel for schedule(dynamic,1)
    for (int y = 0; y < y_max; ++y) { 
    //parallelize this code here
   }
//IMPORTANT: no code in here
}
</code>

Является ли внешняя параллель для выполнения чего-либо, кроме создания новой задачи?

Ваш Ответ

2   ответа
38

Если ваш компилятор поддерживает OpenMP 3.0, вы можете использоватьcollapse пункт:

#pragma omp parallel for schedule(dynamic,1) collapse(2)
for (int x = 0; x < x_max; ++x) {
    for (int y = 0; y < y_max; ++y) { 
    //parallelize this code here
    }
//IMPORTANT: no code in here
}

Если это не так (например, поддерживается только OpenMP 2.5), существует простой обходной путь:

#pragma omp parallel for schedule(dynamic,1)
for (int xy = 0; xy < x_max*y_max; ++xy) {
    int x = xy / y_max;
    int y = xy % y_max;
    //parallelize this code here
}

Вы можете включить вложенный параллелизм сomp_set_nested(1); и ваш вложенныйomp parallel for код будет работать, но это может быть не самой лучшей идеей.

Кстати, почему динамическое планирование? Каждая итерация цикла оценивается в непостоянное время?

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Scott Logan
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Scott Logan
Error: User Rate Limit ExceededprivateError: User Rate Limit Exceededprivate(x,y)Error: User Rate Limit Exceeded
10

NO.

Первый#pragma omp parallel создаст команду из параллельных потоков, а второй попытается создать для каждого из исходных потоков другую команду, то есть команду команд. Однако почти во всех существующих реализациях вторая команда имеет только один поток: вторая параллельная область по существу не используется. Таким образом, ваш код больше похож на эквивалент

#pragma omp parallel for schedule(dynamic,1)
for (int x = 0; x < x_max; ++x) {
    // only one x per thread
    for (int y = 0; y < y_max; ++y) { 
        // code here: each thread loops all y
    }
}

Если вы этого не хотите, а только распараллеливаете внутренний цикл, вы можете сделать это:

#pragma omp parallel
for (int x = 0; x < x_max; ++x) {
    // each thread loops over all x
#pragma omp for schedule(dynamic,1)
    for (int y = 0; y < y_max; ++y) { 
        // code here, only one y per thread
    }
}
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededyError: User Rate Limit Exceededx,yError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Scott Logan

Похожие вопросы