2017-08-10 50 views
0

我正在使用Eigen进行一些仿真。无论何时我甚至包括最小的过载特征运算(即使我有x=y其中x,yEigen::VectorXd具有相同尺寸),我都会得到分段错误错误(更准确地说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 
} 

现在,一些解释:

如果我有vcouple=vcouplecoupling,我没有错误,如果我有vcouple=v,我得到的错误。如果我在mainCPUsim中有vcouple=A*v,我不会收到任何错误。有人建议定义'EIGEN_DONT_ALIGN',但只适用于某些情况(即对于相同的ns,但对于矩阵和向量的元素值不同,它可能会显示错误或可能不会)。你碰巧知道什么可能导致这个错误?

顺便说一句,我使用的nvcc编译器,因为我使用CUDA模拟的一些部分。但是,Eigen仅用于完全在CPU上运行的部分代码。对于主机编译器,我使用GCC 5.4.1,我有Ubuntu 16.04。

编辑: 如果我不把结果存储错误消失(即刚A*v;代替vcouple=A*v;

+0

欢迎SO。请勿使用多余的语言标签发送垃圾邮件。你的代码不是有效的C代码,而是C++。 – Gerhardh

+0

请阅读如何提供[mcve]。例如'main'中的'output'永远不会在任何地方声明。 – chtz

回答