Низкая производительность при использовании OpenMP во внутреннем цикле - PullRequest
0 голосов
/ 28 августа 2018

У меня есть следующий код, который в основном является прямой заменой нижней треугольной матрицы.

for (int i = 0; i < matrix.get_rowptr()->size() - 1; ++i)
{
    double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
    for (int j = matrix.get_rowptr()->operator[](i); j < matrix.get_diagonal_index()->operator[](i); ++j)
    {
        sum += matrix.get_value()->operator[](j) * result[matrix.get_columnindex()->operator[](j)];
    }
    result[i] = sum;
    result[i] = vector1[i] - result[i];
}

Первый цикл проходит по строкам, а второй - по столбцам. Среднее количество операций во внутреннем цикле составляет минимум 100. Я попытался использовать OpenMP, чтобы парализовать внутренний цикл, просто добавив #pragma omp parallel for Но время стены увеличилось. Есть ли способ парализовать этот мир кода хорошим способом?

Спасибо заранее. С наилучшими пожеланиями.

1 Ответ

0 голосов
/ 28 января 2019

Как объяснено в комментариях, низкая производительность вызвана вызовом небольших параллельных областей во внутреннем цикле. При переписывании кода для использования распараллеливания для внешнего цикла производительность увеличивается с увеличением количества потоков.

...