在内部循环中使用OpenMP时性能不佳

时间:2018-08-28 20:12:53

标签: c++ parallel-processing openmp

我有以下代码,基本上是下三角矩阵的正向替换。

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 :(得分:1)

如评论中所述,性能不佳是由于内部循环中调用了较小的并行区域所致。重新编写代码以将并行化用于外循环时,性能会随着线程数量的增加而提高。