首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用特征库分割故障(3.3.4)

用特征库分割故障(3.3.4)
EN

Stack Overflow用户
提问于 2017-08-10 15:58:42
回答 1查看 2.9K关注 0票数 0

我正在用本征做一些模拟。每当我包含最小的过载特征操作(即使我有x=y,其中xy是相同大小的Eigen::VectorXd )时,我就会得到分割错误错误(更准确地说,是x,而没有其他细节)。奇怪的是,只有在某些函数中有矩阵运算时,才会发生这种情况。

让我告诉你:

代码语言:javascript
复制
//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*vmainCPUsim中有,我就不会出错。有人建议定义‘EIGEN_not_ some’,但这只在某些情况下有效(即对于相同的ns,但矩阵和向量的元素的值不同,它可能会显示错误,也可能不会)。你知道是什么导致了这个错误吗?

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-08-10 20:54:01

我终于找到了答案。显然,nvccgcc对本征数组的排列方式不同。这解释了为什么在计算(和分配) .cu文件中的矩阵乘积时没有问题,而在.cpp文件中得到一个错误。简单地将coupling.cpp文件的扩展名更改为.cu就解决了这个问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45618425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档