在 CUDA 中使用指针复制 类

Copying classes with pointers in CUDA

我正在尝试在 CUDA 上实现一些涉及 类 的东西,其中有指向另一个 类 的指针。我发现我需要分别为所有这些指针复制内存,这是我的方法

__host__ Production * Production::allocateToDevice() {
   Production * productionOnDevice;
   size_t productionSize = sizeof(Production);
   cudaMalloc((void **) &productionOnDevice, productionSize);
   cudaMemcpy(productionOnDevice, this, productionSize, cudaMemcpyHostToDevice);

   Vertex * boundRootOnDevice;
   cudaMalloc((void **) &boundRootOnDevice, boundRoot->getMemsize());
   cudaMemcpy(boundRootOnDevice, boundRoot, boundRoot->getMemsize(), cudaMemcpyHostToDevice);

   size_t boundRootPointerSize = sizeof(Vertex *);
   cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice, boundRootPointerSize, cudaMemcpyHostToDevice);

   return productionOnDevice;
}

哪里

class Production {

    Vertex * boundRoot;

    public:

    Production(Vertex * root);
    __host__ Production * allocateToDevice();
    __host__ __device__ Vertex * getBoundNode();
    __host__ __device__ void execute();
    __host__ __device__ size_t getSize();

};

如您所见,我首先复制了 Production 对象本身,然后它只是成员 Vector,最后我复制了指针。但是我在倒数第二行遇到访问冲突。我做错了什么?

这个:

   cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice, 
              boundRootPointerSize, cudaMemcpyHostToDevice);

是非法的,因为您已将 boundRootOnDevice(设备指针)作为 host-to-device 传输中的源指针。这会导致主机尝试在设备地址上执行指针间接寻址,从而导致段错误。

在这种情况下,您可能想执行设备到设备的复制。