首页 文章

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

提问于
浏览
3

我有一个STL Vector包含一些像这样的矩阵

std :: vector foovec;

此向量中有大约3000个条目,我想要将它们相加并形成一个新的Eigen :: Matrix .

这样做的天真C代码是:

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

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

2 回答

  • 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> = 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];
    
  • 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];
    }
    

相关问题