特征库的分段错误 (3.3.4)



我正在使用Eigen进行一些模拟。每当我包含最小的过载特征操作时,我都会得到分段错误(更准确地说是没有其他细节的Segmentation fault (core dumped)((即使我有x=ywherexyEigen::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
}

现在,一些解释:

如果我在coupling中有vcouple=vcouple,我不会得到错误,如果我有vcouple=v,我确实得到错误。如果我在mainCPUsim中有vcouple=A*v,我不会出错。有人建议定义"EIGEN_DONT_ALIGN",但这仅适用于某些情况(即对于相同的ns,但矩阵和向量的元素值不同,它可能会显示错误,也可能不会(。您是否碰巧知道可能导致此错误的原因?

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

编辑: 如果我不存储结果,错误就会消失(即只是A*v;而不是vcouple=A*v;(

我终于找到了答案。显然nvccgcc以不同的方式对齐特征数组。这就解释了为什么在计算(和分配(.cu文件中的矩阵乘积时没有问题,而在.cpp文件中出现错误。只需将coupling.cpp文件的扩展名更改为.cu就可以解决问题。

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

相关内容

  • 没有找到相关文章

最新更新