将对象复制到设备?

Spa*_*key 11 cuda

我可以将C++对象复制到设备吗?

说我有:

class CudaClass
{
public:
int* data;
CudaClass(int x) {
    data = new int[1]; data[0] = x;
}
};

__global__ void useClass(CudaClass cudaClass)
{
    printf("%d" cudaClass.data[0]);
};


int main()
{
    CudaClass c(1);
}
Run Code Online (Sandbox Code Playgroud)

现在如何将"c"复制到设备内存并启动内核"useClass"?

Rob*_*lla 18

是的,您可以将对象复制到设备以便在设备上使用.当对象嵌入了指向动态分配区域的指针时,该过程需要一些额外的步骤.

请参阅我的答案,讨论所涉及的内容.该答案还有一些与之相关的示例代码答案.

此外,在您的类定义中,如果您希望某些功能在设备上可用,您应该适当地修饰这些功能(即可能__device__ __host__);

编辑:回答一个问题(现已删除)这里是我可以根据提供的代码提出的最简单的示例代码:

#include <stdio.h>

class CudaClass
{
public:
int* data;
CudaClass(int x) {
    data = new int[1]; data[0] = x;
}
};

__global__ void useClass(CudaClass *cudaClass)
{
    printf("%d\n", cudaClass->data[0]);
};




int main()
{
    CudaClass c(1);
    // create class storage on device and copy top level class
    CudaClass *d_c;
    cudaMalloc((void **)&d_c, sizeof(CudaClass));
    cudaMemcpy(d_c, &c, sizeof(CudaClass), cudaMemcpyHostToDevice);
    // make an allocated region on device for use by pointer in class
    int *hostdata;
    cudaMalloc((void **)&hostdata, sizeof(int));
    cudaMemcpy(hostdata, c.data, sizeof(int), cudaMemcpyHostToDevice);
    // copy pointer to allocated device storage to device class
    cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice);
    useClass<<<1,1>>>(d_c);
    cudaDeviceSynchronize();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了简洁/清晰起见,我放弃了通常的cuda错误检查.

回答这个问题,您无法使用基于设备的类中的指针直接从主机分配存储.这是因为cudaMalloc期望一个普通的基于主机的指针存储,例如你得到的:

int *hostdata;
Run Code Online (Sandbox Code Playgroud)

cudaMalloc无法使用其存储已在设备上的指针.这不起作用:

cudaMalloc(&(d_c->data), sizeof(int));
Run Code Online (Sandbox Code Playgroud)

因为它需要在主机代码中取消引用设备指针(d_c),这是不允许的.

  • `hostdata`包含指向设备内存的指针.但是`&hostdata`是指向主机内存中某个位置的指针.所以不,该指针不在"设备上"并且它不指向"在设备上"的位置.`&hostdata`指向主机内存中的某个位置.`hostdata`指向设备内存中的某个位置. (4认同)