[英]How to add OpenMp to triple nested for-loop
目标是将尽可能多的 OpenMP 添加到以下 Cholesky 因子 function 以增加并行化。 到目前为止,我只有一个#pragma omp parallel for
正确实现。 vector<vector<double>>
表示一个二维矩阵。 我已经尝试为 for 添加#pragma omp parallel for
for
for (int i = 0; i < n; ++i)
, for (int k = 0; k < i; ++k)
和for (int j = 0; j < k; ++j)
但是并行化出错。 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;
}
我不认为你可以用这个算法进行更多的并行化,因为外部循环的第i
次迭代取决于i - 1
次迭代的结果,而内部循环的第k
次迭代取决于结果k - 1
次迭代。
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];
// reduction(-: value) does the same
// (private instances of value are initialized to zero and
// added to the initial instance of value when the threads are joining
#pragma omp parallel for reduction(+: value)
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 reduction(+: value)
for (int j = 0; j < i; ++j)
{
value -= result[i][j] * result[i][j];
}
result[i][i] = std::sqrt(value);
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.