【发布时间】:2021-06-21 20:09:08
【问题描述】:
目标是将尽可能多的 OpenMP 添加到以下 Cholesky 因子函数中以提高并行度。到目前为止,我只有一个 #pragma omp parallel for 正确实施。 vector<vector<double>> 代表一个二维矩阵。我已经尝试为for (int i = 0; i < n; ++i)、for (int k = 0; k < i; ++k) 和for (int j = 0; j < k; ++j) 添加#pragma omp parallel for,但并行化出错了。 makeMatrix(n, n) 初始化大小为 nxn 的全零的 vector<vector<double>>。
vector<vector<double>> cholesky_factor(vector<vector<double>> input)
{
int n = input.size();
vector<vector<double>> result = makeMatrix(n, n);
for (int i = 0; i < n; ++i)
{
for (int k = 0; k < i; ++k)
{
double value = input[i][k];
for (int j = 0; j < k; ++j)
{
value -= result[i][j] * result[k][j];
}
result[i][k] = value / result[k][k];
}
double value = input[i][i];
#pragma omp parallel for
for (int j = 0; j < i; ++j)
{
value -= result[i][j] * result[i][j];
}
result[i][i] = std::sqrt(value);
}
return result;
}
【问题讨论】:
-
“但并行化出错了” - 你需要更具体。
-
“向嵌套循环添加更多 OpenMP”只会在外部循环本身不能提供足够的并行度时提供更好的性能。在这种情况下,可以使用
collapse子句,但在这里我不认为有一种简单的方法可以做到这一点,因为(i,j,k)的不同组合在读写时矩阵的区域重叠。要使第二个j-loop 的当前并行化正确,您必须添加reduction(-: value)。 -
您的内循环边界也取决于外循环索引。因此你不能使用
collapse
标签: c++ multithreading performance parallel-processing openmp