Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Cuda 使用新指针和双指针在全局内核中创建类对象_Cuda - Fatal编程技术网

Cuda 使用新指针和双指针在全局内核中创建类对象

Cuda 使用新指针和双指针在全局内核中创建类对象,cuda,Cuda,我有以下全局内核: __global__ void pdegpu(PDE_ParabolicD1_Num_GPU **pdes) { PDE_ParabolicD1_Num_GPU *loc; loc = new PDE_ParabolicD1_Num_GPU(); loc->Setup(); delete loc; //above code was just an example to show that new and delete wo

我有以下全局内核:

__global__ void pdegpu(PDE_ParabolicD1_Num_GPU **pdes)
{    
    PDE_ParabolicD1_Num_GPU *loc;
    loc = new PDE_ParabolicD1_Num_GPU();
    loc->Setup();
    delete loc;
    //above code was just an example to show that new and delete work fine

    *pdes = new PDE_ParabolicD1_Num_GPU();   //error occurs here
    (*pdes)->Setup();
}
我调用它来创建PDE_ParabolicD1_Num_GPU类型的对象并进行设置。在main()中,我将使用相同的对象,这就是为什么我在函数参数中使用双指针。 在main()中,我执行以下操作:

PDE_ParabolicD1_Num_GPU pdes_host;
PDE_ParabolicD1_Num_GPU *pdes_dev=0;
pdegpu<<<1,1>>>(&pdes_dev);
cudaStatus = cudaMemcpy(&pdes_host, pdes_dev, sizeof(PDE_ParabolicD1_Num_GPU), cudaMemcpyDeviceToHost);
...
delete [] pdes_dev;
据我所知,该错误是由于地址无效造成的。
有人能帮我解决这个问题吗?
谢谢

您应该先通过Cudamaloc分配内存。当前您的设备代码正在尝试写入主机内存。

pdes\u dev
是主机指针。设备代码无法访问主机指针。如果要在设备上创建可修改的指针,请执行以下操作:

PDE_ParabolicD1_Num_GPU **pdes_dev=0;
cudaMalloc((void ***) &(pdes_dev), sizeof(PDE_ParabolicD1_Num_GPU *));
pdegpu<<<1,1>>>(pdes_dev);
您的内核代码必须相应地进行更改:

__global__ void pdegpu(PDE_ParabolicD1_Num_GPU *pdes)
{    

    pdes->Setup();
}

请注意,我没有编译和测试这段代码,因此可能会有错误,但这概述了我认为可行的方法。您可能还对我对

的回答感兴趣,这可能有助于查看内核调用以及在**pdes中传递给内核的指针的定义。我假设你用了这个指针,我想看看你是怎么做到的。我也有点困惑,你到底想完成什么。如果您想将*PDE与分配的存储一起传递回主机,我认为它不会按您的预期方式工作。最好在主机上为对象存储分配空间,然后在设备上初始化它。看起来pdes是一个主机内存。。。如果不删除并分配*pdes=loc,结果会不会相同?@Eugene:我尝试了*pdes=loc,但得到了相同的访问冲突错误。@RobertCrovella:我发布了内核调用。我不需要cudamaloc指针,因为我想在内核中分配空间并调用构造函数,还想调用其他成员函数,这在代码中没有显示。我只想把偏微分方程复制回去,以便在对偏微分方程进行一些计算后得到结果。
PDE_ParabolicD1_Num_GPU *pdes_dev=0;
cudaMalloc((void **) &(pdes_dev), sizeof(PDE_ParabolicD1_Num_GPU));
pdegpu<<<1,1>>>(pdes_dev);
__global__ void pdegpu(PDE_ParabolicD1_Num_GPU *pdes)
{    

    pdes->Setup();
}