在 OPENMP 中并行添加矩阵向量

Parallelize the addition of a vector of matrices in OPENMP

我有一个包含一些矩阵的 STL 向量,例如

std::vector foovec;

这个向量中大约有 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];

对我来说,使用 reduction(merge : ...) 没有用。它有未初始化矩阵的问题(我认为)。

以下是:

#pragma omp declare reduction( \
                +: \
                Eigen::Matrix3d: \
                omp_out= omp_out + omp_in) \
                initializer(omp_priv=Eigen::Matrix3d::Zero())

Eigen::Matrix3d sum = Eigen::Matrix3d::Zero();
std::vector<Eigen::Matrix3d> elems;

#pragma omp parallel for reduction(+: sum)
for (size_t i = 0; i < elems.size(); ++i) {
    sum += elems[i];
}