【发布时间】:2018-05-29 21:00:36
【问题描述】:
我有一个纯 GPU 类 T,我想在 GPU 上创建它,但在 CPU 上有一个对它的引用,因此我可以将链接作为参数发送到不同的 CUDA 内核。
class T
{
public:
int v;
public:
__device__ T() { v = 10; }
__device__ ~T() {}
__device__ int compute() { return v; }
};
这是我用来创建类实例和调用compute() 函数的内核。
__global__ void kernel(T* obj, int* out)
{
if(blockIdx.x * blockDim.x + threadIdx.x == 0) {
out[0] = obj->compute(); // no kernel error, but it returns garbage
}
}
__global__ void cudaAllocateGPUObj(T* obj)
{
if(blockIdx.x * blockDim.x + threadIdx.x == 0) {
obj = new T;
// if I call `out[0] = obj->compute();` here, everything works fine
}
}
主函数只是为T* 类型的指针分配内存,该指针稍后用作cudaAllocateGPUObj 的参数。
int main()
{
int cpu, *gpu;
cudaMalloc((void**)&gpu, sizeof(int));
T* obj;
cudaMalloc((void**)&obj, sizeof(T*));
cudaAllocateGPUObj<<<1,1>>>(obj);
kernel<<<1,1>>>(obj, gpu);
cudaMemcpy(&cpu, gpu, sizeof(int), cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
printf("cudaMemcpy\nresult: %d\n", cpu);
return 0;
}
这段代码的问题(在代码中的cmets中指定)是,当我在cudaAllocateGPUObj内核中调用out[0] = obj->compute();并将获得的值传输到CPU时,一切都是正确的。但是如果我想在另一个内核中获取成员值,它就会变成垃圾,但是如果我将返回值从v 变量更改为常量,一切正常。
你能告诉我这段代码有什么问题吗?
【问题讨论】: