2017-08-10 7 views
0

私はいくつかのシミュレーションにEigenを使用しています。たとえ最小の過負荷Eigen演算が含まれていても(同じサイズのx=yがあっても、、y)、セグメンテーションフォールトエラー(より正確にはSegmentation fault (core dumped))が得られます。これを非常に奇妙なものにするのは、特定の関数で行列演算を行う場合にのみ起こるということです。固有ライブラリ(3.3.4)によるセグメント化エラー

私がお見せしましょう:

//main.cu 
#include <Eigen/Dense> 
#include "def.h" 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    params p; 
    int ns; 
    //some code here 
    MatrixXR A(ns,ns); 
    VectorXR u(ns); 
    VectorXR v(ns); 
    VectorXR unew(ns); 
    VectorXR aux(ns); 
    VectorXR vnew(ns); 
    VectorXR vcouple(ns); 
    VectorXR q(ns); 
    Real* output; 
    output=new Real[output_size]; 
    //output_size is a number depending on the system I am simulating, usually about 1000000. 
    CPUsim(output,p,u,v,A,unew,vnew,q,aux,vcouple); 
delete [] &(output[0]); 
return 0; 
} 

//def.h 
#ifndef DEF_H_ 
#include <Eigen/Dense> 
#define DEF_H_ 
#ifdef DOUBLE 
    typedef double Real; 
    typedef Eigen::MatrixXd MatrixXR; 
    typedef Eigen::VectorXd VectorXR; 
#else 
    typedef float Real; 
    typedef Eigen::MatrixXf MatrixXR; 
    typedef Eigen::VectorXf VectorXR; 
#endif 
struct params 
    { 
    //some parameters 
    }; 
#endif 

//sim.h 
#ifndef SIM_H_ 
#define SIM_H_ 
#include "def.h" 
#include <Eigen/Dense> 
void CPUsim(Real* output,params &p, VectorXR& u,VectorXR& v,MatrixXR& A,VectorXR& unew,VectorXR& vnew,VectorXR& q,VectorXR& aux,VectorXR& vcouple); 
//other functions 
#endif 

//sim.cu 
#include "sim.h" 
#include "coupling.h" 
//some functions 
void CPUsim(Real* output,params &p, VectorXR& u,VectorXR& v,MatrixXR& A,VectorXR& unew,VectorXR& vnew,VectorXR& q,VectorXR& aux,VectorXR& vcouple) 
{ 
    //some code 
    coupling(u,unew,v,vnew,p,A,vcouple,aux,no); 
} 

//coupling.h 
#ifndef COUPLING_H_ 
#define COUPLING_H_ 

#include <Eigen/Dense> 
#include "def.h" 
//some declarations 
void coupling(VectorXR& u,VectorXR& unew,VectorXR& v,VectorXR& vnew,params& p,MatrixXR& A,VectorXR& vcouple,VectorXR& aux,noise& no); 

//coupling.cpp 
void coupling(VectorXR& u,VectorXR& unew,VectorXR& v,VectorXR& vnew,params& p,MatrixXR& A,VectorXR& vcouple,VectorXR& aux,noise& no) 
{ 
    vcouple=A*v; 
//some other stuff 
} 

、いくつかの説明:

私はcouplingvcouple=vcoupleを持っている場合、私はvcouple=vを持っている場合、私は、エラーを取得していないが、私はエラーを取得しません。 mainまたはCPUsimvcouple=A*vがあるとエラーは発生しません。誰かが 'EIGEN_DONT_ALIGN'を定義することをお勧めしましたが、一部のケースでのみ動作します(つまり、同じnsですが、行列とベクトルの要素が異なる場合はエラーが表示される場合もあります)。このエラーの原因を知っていますか?

私はシミュレーションのいくつかの部分でCUDAを使用しているので、私はnvccコンパイラを使用しています。ただし、Eigenは、CPU上で完全に実行されるコードの部分に対してのみ使用されます。ホストコンパイラの場合、私はGCC 5.4.1を使用し、私はubuntu 16.04を持っています。

編集: 私は結果を格納しない場合は、エラーが消えた(すなわち、ちょうどA*v;の代わりvcouple=A*v;

+0

はSOへようこそ。過剰な言語タグでスパムしないでください。あなたのコードは有効なCコードではなく、C++です。 – Gerhardh

+0

[mcve]の提供方法を​​お読みください。例えば、 'main'の' output'はどこにも決して宣言されません。 – chtz

答えて

0

私は最終的に答えを見つけました。明らかにnvccgccは、異なる固有配列を整列させます。これは、.cuファイルの行列積を計算し(割り当てた)ときに問題がなかった理由を説明しており、.cppのものでエラーが発生しています。 coupling.cppファイルの拡張子を.cuに変更するだけで問題は解決しました。

詳細はここで見つけることができます: https://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2016/06/msg00003.html

関連する問題