在OPENMP中并行化矩阵向量的添加

时间:2015-05-28 02:48:18

标签: c++ matrix openmp eigen

我有一个STL Vector包含一些矩阵,比如这个

std :: vector foovec;

此向量中有大约3000个条目我想要加起来并形成一个新的Eigen :: Matrix。

执行此操作的天真C ++代码将是:

for(int i = 0; i <foovec.size();i++) {
      result +=  foovec[i];
  }

但是我想使用OPENMP并行化此操作。我知道我不能使用reduction pragma,因为这是一个非标量类型。如果有人能告诉我一个很好的方法来并行化这种减少而没有任何写入冲突,那就太好了。

2 个答案:

答案 0 :(得分:3)

你可以这样做

//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&gt; = 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];

答案 1 :(得分:0)

对我来说,使用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];
}