我正在使用Eigen进行一些仿真。无论何时我甚至包括最小的过载特征运算(即使我有x=y
其中x
,y
是Eigen::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=vcouple
在coupling
,我没有错误,如果我有vcouple=v
,我得到的错误。如果我在main
或CPUsim
中有vcouple=A*v
,我不会收到任何错误。有人建议定义'EIGEN_DONT_ALIGN',但只适用于某些情况(即对于相同的ns
,但对于矩阵和向量的元素值不同,它可能会显示错误或可能不会)。你碰巧知道什么可能导致这个错误?
顺便说一句,我使用的nvcc编译器,因为我使用CUDA模拟的一些部分。但是,Eigen仅用于完全在CPU上运行的部分代码。对于主机编译器,我使用GCC 5.4.1,我有Ubuntu 16.04。
编辑: 如果我不把结果存储错误消失(即刚A*v;
代替vcouple=A*v;
)
欢迎SO。请勿使用多余的语言标签发送垃圾邮件。你的代码不是有效的C代码,而是C++。 – Gerhardh
请阅读如何提供[mcve]。例如'main'中的'output'永远不会在任何地方声明。 – chtz