Странное поведение директивы коллапса openmp - PullRequest
0 голосов
/ 02 августа 2020

У меня следующая проблема:

В приведенном ниже коде я жду такое же количество итераций, но это не так. Часто у меня 45 итераций (ожидаемое количество), иногда 67, иногда 23 итерации. Как работает #pragma omp parallel for collapse(2), а может я неправильно использовал #pragma omp critical?

#include <iostream>
#include <omp.h>
#include <vector>

int main() {
    std::vector<int> vec(45);
    int k = 0;
    #pragma omp parallel for collapse(2)
     for (int i = 0; i < 10; ++i) {
        for (int j = i + 1; j < 10; ++j) {
            auto tmp = big_calc();
            #pragma omp critical
                vec[k++] = tmp;
        }
    }

    return 0;
}

1 Ответ

1 голос
/ 03 августа 2020

Ваш код не соответствует стандарту OpenMP . Действительно, инициализатор int j = i + 1 внутреннего l oop не должен зависеть от значения итератора внешнего l oop. Вам следует свернуть l oop самостоятельно (или вы можете использовать задачи OpenMP с более высокими накладными расходами).

PS: #pragma omp critical больше не нужен, если вы сверните l oop самостоятельно (что приводит к лучшей масштабируемости).

...