我正在使用Eigen进行一些模拟。每当我包括甚至最小的重载特征操作时(即使我Segmentation fault (core dumped)
x=y
,x
是y
大小相同的)。让这很奇怪的是,只有在某些函数中有矩阵运算时才会发生这种情况。
让我告诉你:
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=v
或vcouple=A*v
中有main
,我就不会收到任何错误。有人建议定义&#39; EIGEN_DONT_ALIGN&#39;,但这仅适用于某些情况(即对于相同的CPUsim
,但对于矩阵和向量的元素有不同的值,它可能会显示错误或它可能不)。你碰巧知道可能导致这个错误的原因吗?
BTW,我使用的是nvcc编译器,因为我在模拟的某些部分使用CUDA。但是,Eigen仅用于完全在CPU上运行的部分代码。对于主机编译器,我使用GCC 5.4.1,我有ubuntu 16.04。
修改:
如果我不存储结果(即仅ns
而不是A*v;
),则错误消失
答案 0 :(得分:0)
我终于找到了答案。显然nvcc
和gcc
对特征数组进行了不同的对齐。这解释了为什么在.cu
文件中计算(和分配)矩阵产品时遇到.cpp
错误时没有问题。只需将coupling.cpp
文件的扩展名更改为.cu
即可解决问题。
更多细节可以在这里找到: https://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2016/06/msg00003.html