首先,我对OpenMP不太熟悉。我想减少我的C ++代码的执行时间,这涉及使用OpenMP进行几百次矩阵对角化迭代。我不试图平行每个对角化(根据Armadillo的文档,可以通过强制Armadillo使用OpenBLAS库来实现);相反,我想在8核机器上的线程之间分配负载。
当我得到"分段错误"时,访问内存似乎有问题。我想知道这是不是我做得不好或问题是由于Armadillo创建和操纵矩阵的方式。
这是一个最小的代码,它捕捉了我一直存在的问题的本质。这个想法是对1000个100x100矩阵进行对角化,并将它们的特征值存储在一个文件中。
#include<iostream>
#include<armadillo>
#include <fstream>
#include<omp.h>
int main()
{
std::ofstream File;
File.open("./RESULTS.dat");
arma::mat M; //THE MATRIX TO BE DIAGONALIZED
arma::mat Eigenvecs; //EIGENVECTORS
arma::vec Eigenval; //EIGENVALUES
arma::mat RESULTS; //STORING EIGENVALUES TEMPORARILY
//DISTRIBUTING THE ITTERATIONS AMONG CORES USING OpenMP
#pragma omp parallel shared(RESULTS) private(M,Eigenvecs,Eigenval)
{
#pragma omp parallel for ordered schedule(guided)
for( int i = 0 ; i < 1000; i++ )
{
M = arma::randu<arma::mat>(200,200); //CREATING A RANDOM MATRIX
M = 0.5*(M + M.t() ); //TO GUARANTEE THAT THE M IS NORMAL
arma::eig_sym( Eigenval , Eigenvecs , M ); //DIAGONALIZING "M"
RESULTS = arma::join_vert(RESULTS,Eigenval.t()); //CONCATENATING EIGENVALUES TO THE MATRIX "RESULTS"
}
}
File << RESULTS; //WRITING "RESULTS" TO THE FILE
File.close();
return 0;
}
当我运行此代码时,似乎负载正确分布(我使用htop监视机器上的核心),但最后我得到了#34;分段错误&#34;。
答案 0 :(得分:0)
我想我已经明白了,虽然我不知道为什么这可以解决这个问题。这是修改后的代码:
#include<iostream>
#include<ctime>
#include<armadillo>
#include <fstream>
#include<omp.h>
int main()
{
std::ofstream File;
File.open("./RESULTS.dat");
arma::mat M;
arma::mat RESULTS;
arma::mat Eigenvecs;
arma::vec Eigenval;
int i,tid=0;
//DISTRIBUTING THE ITTERATIONS AMONG CORES USING OpenMP
#pragma omp parallel for ordered schedule(guided) shared(RESULTS) private(M,Eigenvecs,Eigenval,tid)
for(i = 0 ; i < 10; i++ )
{
tid = omp_get_thread_num();
M = arma::randu<arma::mat>(400,400);
M = 0.5*(M + M.t() );
//std::cout << M << std::endl;
arma::eig_sym( Eigenval , Eigenvecs , M );
#pragma omp ordered
RESULTS = arma::join_vert(RESULTS,Eigenval.t());
std::cout << i << " , " << tid << " --- " << Eigenval(0) << std::endl;
}
File << RESULTS;
File.close();
return 0;
}