Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将类对象传递给_全局__内核_C++_Cuda - Fatal编程技术网

C++ 将类对象传递给_全局__内核

C++ 将类对象传递给_全局__内核,c++,cuda,C++,Cuda,我想将一个类对象传递给一个全局内核,并在其中执行其成员函数。到目前为止,我所有的努力都没有成功。下面我将详细描述我正在尝试做的事情 我的类PDE_抛物线_Num_GPU实现如下: class PDE_Parabolic_Num_GPU: public PDE_Parabolic_GPU { public: __host__ __device__ PDE_Parabolic_Num_GPU(); __host__ __device__ ~PDE_Parabolic_Num_GPU

我想将一个类对象传递给一个全局内核,并在其中执行其成员函数。到目前为止,我所有的努力都没有成功。下面我将详细描述我正在尝试做的事情

我的类PDE_抛物线_Num_GPU实现如下:

class PDE_Parabolic_Num_GPU: public PDE_Parabolic_GPU
 {
  public:
   __host__ __device__ PDE_Parabolic_Num_GPU();
   __host__ __device__ ~PDE_Parabolic_Num_GPU();
   __host__ __device__ Solve();
   __host__ __device__ Setup();
   ...

  //data
  gdd_real*   an;
  gdd_real*   bn;
  gdd_real*   cn;
}
gdd_real在哪里

struct gdd_real 
{
    double2 val;
        __host__  __device__ gdd_real(double hi, double lo) {val.x = hi; val.y = lo;}
    __host__  __device__ gdd_real(double h){val.x = h; val.y = 0.;}
    __host__  __device__ gdd_real(){};
};
在我的main()中,我正在执行通常的cudamaloc和cudaMemcpy,以便将我的类对象传递给全局内核:

PDE_Parabolic_Num_GPU pdes_host;
PDE_Parabolic_Num_GPU *pdes_dev;
cudaError_t cudaStatus;
cudaStatus = cudaMalloc((void**)&pdes_dev, 1 * sizeof(PDE_Parabolic_Num_GPU));
cudaStatus = cudaMemcpy(pdes_dev, &pdes_host, sizeof(PDE_Parabolic_Num_GPU), cudaMemcpyHostToDevice);
pdegpu<<<1,1>>>(pdes_dev);
cudaStatus = cudaThreadSynchronize();
cudaStatus = cudaMemcpy(&pdes_host, pdes_dev, sizeof(PDE_Parabolic_Num_GPU), cudaMemcpyDeviceToHost);
cudaStatus = cudaThreadExit();
system("pause");
我的第一个问题:程序在调试期间在pdes->Setup()处崩溃

第二个问题是:如果我将内核更改为使用如下所示的本地对象,那么在调试过程中,在main()中的system(“pause”)语句之后,程序就会崩溃

__global__ void pdegpu()
{
      PDE_Parabolic_Num_GPU pdes;  //using local object
      pdes.Setup(); 
      pdes.Solve(); 
}
在使用Nsight进行调试期间,程序崩溃的情况有两种。但是当我在没有调试的情况下运行程序时,第二个版本的pdegpu(使用本地对象)在pdes.Solve()上崩溃。 有人能帮我解决这些问题吗?
谢谢,

为什么要存储指向
gdd_real
的指针?您可以直接在类中放置这种类型的对象。这样,您将避免与内存相关的问题

那么,为什么不直接使用:

    //...
    gdd_real   an;
    gdd_real   bn;
    gdd_real   cn;
}

您不能在GPU代码中使用
new
。您必须通过
cudamaloc
在主机上分配它,并传入指针。@guit。。。谁告诉你的?检查@致命吉他:这已经有三年没有发生了。好吧。。。我很确定
malloc
仍然是不可能的,所以我假设这也适用于
new/delete
。好吧,事实证明我也错了。。嗯,很高兴知道..因为an,bn,cn是gdd_real的数组。例如,我在Setup函数中将其初始化为an=new gdd_real[200]。
    //...
    gdd_real   an;
    gdd_real   bn;
    gdd_real   cn;
}