我正在尝试使用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矩阵的示例。在我的案例中,为犰狳矩阵定义减少的最佳方法是什么?
答案 0 :(得分:3)
这些缩减仅适用于内置类型(double
,int
等)。因此,你必须自己做减少,这很简单。只需在线程局部变量中累积每个线程的结果,并将其添加到临界区内的全局结果中。
#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 shared(A)
{
arma::mat X_local = arma::zeros(700,700);
#pragma omp for
for(unsigned int i = 0; i < A.n_rows; i++)
{
arma::rowvec diff = point - A.row(i);
X_local += diff.t() * diff; // Adding the matrices to X here
}
#pragma omp critical
X += X_local;
}
}
使用更新的OpenMP(我认为4.5)?您还可以为您的类型声明用户定义的缩减。
#include <armadillo>
#include <omp.h>
#pragma omp declare reduction( + : arma::mat : omp_out += omp_in ) \
initializer( omp_priv = omp_orig )
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 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
}
}