gpt4 book ai didi

cuda - 将对象复制到设备?

转载 作者:行者123 更新时间:2023-12-04 01:49:27 31 4
gpt4 key购买 nike

我可以将 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);
}

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

最佳答案

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

my answer here讨论所涉及的内容。该答案还有一些与之相关的示例代码答案。

此外,在您的类定义中,如果您希望某些功能在设备上可用,您应该适本地装饰这些功能(即可能使用 __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;
}

为了简洁/清晰起见,我省去了通常的 cuda 错误检查。

回答这个问题,您不能使用基于设备的类中的指针直接从主机分配存储。这是因为 cudaMalloc 需要一个普通的基于主机的指针存储,比如你得到的:
int *hostdata;

cudaMalloc 不能使用存储已经在设备上的指针。这将不起作用:
cudaMalloc(&(d_c->data), sizeof(int));

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

关于cuda - 将对象复制到设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024087/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com