特征库分割错误(3.3.4)

时间:2017-08-10 15:58:43

标签: c++ segmentation-fault eigen nvcc

我正在使用Eigen进行一些模拟。每当我包括甚至最小的重载特征操作时(即使我Segmentation fault (core dumped) x=yxy大小相同的)。让这很奇怪的是,只有在某些函数中有矩阵运算时才会发生这种情况。

让我告诉你:

Eigen::VectorXd

现在,一些解释:

如果//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=vvcouple=A*v中有main,我就不会收到任何错误。有人建议定义&#39; EIGEN_DONT_ALIGN&#39;,但这仅适用于某些情况(即对于相同的CPUsim,但对于矩阵和向量的元素有不同的值,它可能会显示错误或它可能不)。你碰巧知道可能导致这个错误的原因吗?

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

修改: 如果我不存储结果(即仅ns而不是A*v;),则错误消失

1 个答案:

答案 0 :(得分:0)

我终于找到了答案。显然nvccgcc对特征数组进行了不同的对齐。这解释了为什么在.cu文件中计算(和分配)矩阵产品时遇到.cpp错误时没有问题。只需将coupling.cpp文件的扩展名更改为.cu即可解决问题。

更多细节可以在这里找到: https://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2016/06/msg00003.html