我正在用本征做一些模拟。每当我包含最小的过载特征操作(即使我有x=y,其中x,y是相同大小的Eigen::VectorXd )时,我就会得到分割错误错误(更准确地说,是x,而没有其他细节)。奇怪的是,只有在某些函数中有矩阵运算时,才会发生这种情况。
让我告诉你:
//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或CPUsim中有,我就不会出错。有人建议定义‘EIGEN_not_ some’,但这只在某些情况下有效(即对于相同的ns,但矩阵和向量的元素的值不同,它可能会显示错误,也可能不会)。你知道是什么导致了这个错误吗?
顺便说一句,我使用nvcc编译器,因为我正在使用CUDA进行一些部分的模拟。但是,特征只用于完全在CPU上运行的部分代码。对于主机编译器,我使用GCC 5.4.1和ubuntu 16.04。
编辑:如果我不存储结果(即只存储A*v;而不是vcouple=A*v;),错误就会消失。
发布于 2017-08-10 20:54:01
我终于找到了答案。显然,nvcc和gcc对本征数组的排列方式不同。这解释了为什么在计算(和分配) .cu文件中的矩阵乘积时没有问题,而在.cpp文件中得到一个错误。简单地将coupling.cpp文件的扩展名更改为.cu就解决了这个问题。
更多细节可以在这里找到:https://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2016/06/msg00003.html
https://stackoverflow.com/questions/45618425
复制相似问题