私はいくつかのシミュレーションに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
}
、いくつかの説明:
私はcoupling
でvcouple=vcouple
を持っている場合、私はvcouple=v
を持っている場合、私は、エラーを取得していないが、私はエラーを取得しません。 main
またはCPUsim
にvcouple=A*v
があるとエラーは発生しません。誰かが 'EIGEN_DONT_ALIGN'を定義することをお勧めしましたが、一部のケースでのみ動作します(つまり、同じns
ですが、行列とベクトルの要素が異なる場合はエラーが表示される場合もあります)。このエラーの原因を知っていますか?
私はシミュレーションのいくつかの部分でCUDAを使用しているので、私はnvccコンパイラを使用しています。ただし、Eigenは、CPU上で完全に実行されるコードの部分に対してのみ使用されます。ホストコンパイラの場合、私はGCC 5.4.1を使用し、私はubuntu 16.04を持っています。
編集: 私は結果を格納しない場合は、エラーが消えた(すなわち、ちょうどA*v;
の代わりvcouple=A*v;
)
はSOへようこそ。過剰な言語タグでスパムしないでください。あなたのコードは有効なCコードではなく、C++です。 – Gerhardh
[mcve]の提供方法をお読みください。例えば、 'main'の' output'はどこにも決して宣言されません。 – chtz