OpenMP在使用Armadillo的代码中生成段错误

时间:2014-11-18 18:13:10

标签: c++ openmp armadillo

首先,我对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;。

1 个答案:

答案 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;
}