Неожиданное замедление с внутренним для параллелизации цикла с использованием OpenMP на компиляторе Intel

Я пишу программу для физического моделирования. Я получаю неожиданное замедление при распараллеливании внутреннего цикла for при компиляции с помощью компилятора Intel C++ (icpc). Суть кода заключается в следующем:

for(int i = 0; i < steps; i++){
    calculate m here
    #pragma omp parallel for
    for(int j = 0; j < 3*npos; j++) {
        pos[j] += 2*m[j];
    }
}

куда m[j] является случайным числом в пределах указанного интервала и pos это массив положений частиц. Сначала я думал, что замедление связано с созданием и уничтожением потоков во время каждой из итераций внешнего цикла. Если бы это было так, замедление было бы менее значительным, если бы работа внутреннего цикла была более обширной. Тем не менее, я нашел масштаб замедления постоянным, когда npos увеличено с 1000 до 10000, добавив к моему замешательству.
Чтобы поставить это в перспективе, я бегу около 12 секунд в последовательном, а 18 секунд параллельно, когда npos =1000 и около 120 с в последовательном и 180 с параллельно, когда npos=10000. Если бы кто-нибудь мог подсказать мне, что может быть причиной этого замедления, это будет оценено.

Я компилирую с помощью: icpc -qopenmp -03

- Обновление--: возвращая код для совместимости и компилируя с g++, код распараллеливается и ускорения получаются, как и ожидалось. Замедление происходит только при использовании того же кода, скомпилированного с Intel ICPC. Поэтому я должен что-то упустить при использовании OMP с компиляторами Intel.

0 ответов

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