我有一个包含一些矩阵的 STL vector ,例如这个
std::vector foovec;
我想将此 vector 中的大约 3000 个条目加起来形成一个新的 Eigen::Matrix。
执行此操作的原始 C++ 代码是:
for(int i = 0; i <foovec.size();i++) {
result += foovec[i];
}
但是我想使用 OPENMP 并行化这个操作。我知道我不能使用 reduction pragma,因为这是一种非标量类型。如果有人能告诉我一种在没有任何写冲突的情况下并行化这种减少的好方法,那就太好了。
最佳答案
你可以这样做
//std::vector<Eigen::Matrix<double, n, m>> foovec;
#pragma omp parallel
{
Eigen::Matrix<double, n, m> result_private;
#pragma omp for nowait //fill result_private in parallel
for(int i=0; i<foovec.size(); i++) result_private += foovec[i];
#pragma omp critical
result += result_private;
}
对于 OpenMP >=4.0 你也可以这样做
#pragma omp declare reduction (merge : Eigen::Matrix<double, n, m> : omp_out += omp_in)
#pragma omp parallel for reduction(merge: result)
for(int i=0; i<foovec.size(); i++) result += foovec[i];
关于c++ - 在 OPENMP 中并行添加矩阵 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30496365/