我正在尝试使用OpenMP并行化一个for循环,该循环对Armadillo矩阵进行求和。我有以下代码:
#include <armadillo>
#include <omp.h>
int main()
{
arma::mat A = arma::randu<arma::mat>(1000,700);
arma::mat X = arma::zeros(700,700);
arma::rowvec point = A.row(0);
# pragma omp parallel for shared(A) reduction(+:X)
for(unsigned int i = 0; i < A.n_rows; i++){
arma::rowvec diff = point - A.row(i);
X += diff.t() * diff; // Adding the matrices to X here
}
}
我遇到了这个错误:
[Legendre@localhost ~]$ g++ test2.cpp -o test2 -O2 -larmadillo -fopenmp
test2.cpp: In function ‘int main()’:
test2.cpp:11:52: error: user defined reduction not found for ‘X’
我研究了有关定义约简的内容,但是没有找到与Armadillo矩阵一起使用的示例。在我的情况下,定义Armadiilo矩阵的约简的最佳方法是什么?
X_local
是每个线程本地的。指令#pragma omp for
将 for 循环分成每个线程的分区,因此没有两个线程会写入相同的X_local
。(2) 是的,那是一个错误。我忘记了初始化程序,矩阵默认初始化为 0x0。请查看更新后的答案。 - Henri Menke