所以我之前问过一个关于如何直接在设备上分配对象而不是“正常”的问题:
- 在主机上分配
- 复制到设备
- 将动态分配的字段一一复制到设备
我希望它直接在设备上分配的主要原因是我不想手动一个一个地复制每个动态分配的字段。
无论如何,所以我认为我实际上已经找到了一种方法来做到这一点,并且我希望看到更有经验的 CUDA 程序员(如 Robert Crovella)的一些意见。
我们先看代码:
class Particle
{
public:
int *data;
__device__ Particle()
{
data = new int[10];
for (int i=0; i<10; i++)
{
data[i] = i*2;
}
}
};
__global__ void test(Particle **result)
{
Particle *p = new Particle();
result[0] = p; // store memory location
}
__global__ void test2(Particle *p)
{
for (int i=0; i<10; i++)
printf("%d\n", p->data[i]);
}
int main() {
// initialise and allocate an object on device
Particle **d_p_addr;
cudaMalloc((void**)&d_p_addr, sizeof(Particle*));
test<<<1,1>>>(d_p_addr);
// copy pointer to host memory
Particle **p_addr = new Particle*[1];
cudaMemcpy(p_addr, d_p_addr, sizeof(Particle*), cudaMemcpyDeviceToHost);
// test:
test2<<<1,1>>>(p_addr[0]);
cudaDeviceSynchronize();
printf("Done!\n");
}
如您所见,我所做的是:
- 调用内核初始化设备上的对象并将其指针存储为输出参数
- 将指向分配对象的指针从设备内存复制到主机内存
- 现在您可以将该指针传递给另一个内核就好了!
这段代码确实有效,但我不确定是否有缺点。
干杯
编辑:正如罗伯特所指出的,首先在主机上创建一个指针是没有意义的,所以我从代码中删除了这部分。