c++ - 在 OPENMP 中并行添加矩阵 vector

标签 c++ matrix openmp eigen

我有一个包含一些矩阵的 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/

相关文章:

c++ - 继承 - C++

c++ - std::vector<A> error C2582: 'operator =' 函数在

c - 如何使用数据结构通过以下代码对这些矩阵进行加、乘和减?

python - 使用 pandas DataFrame 行的组合填充 “count matrix”

c++ - 并行嵌套 For 循环但按顺序输出结果

openmp - 为什么 OpenMP 不能在 for 循环内有部分?

gcc - 如何以编程方式找到 OpenMP 共享库的路径?

c++ - 如何在消费者线程中组织等待来自主线程的数据

c++ - 如何处理构造函数中的错误值?

Python 和 scikit 学习 : replace matrix vector product during training with custom call