我正在开发一个Windows 64位应用程序,它将管理多个GPU上不同CUDA算法的并发执行。
我的设计需要一种将指针传递给设备内存的方法
围绕c ++代码。 (例如,记住它们是我的c ++对象中的成员)。
我知道用__device__
限定符来声明类成员是不可能的。
然而,我无法找到一个明确的答案,是否将__device__
指针指向普通的C指针然后使用后者的工作。换句话说:以下代码是否有效?
__device__ float *ptr;
cudaMalloc(&ptr, size);
float *ptr2 = ptr
some_kernel<<<1,1>>>(ptr2);
对我来说,它编译和行为正确,但我想知道它是否保证是正确的。
答案 0 :(得分:4)
不,该代码并非严格有效。虽然它可能在主机端(或多或少意外)起作用,但如果您尝试直接从设备代码中取消引用ptr
,您会发现它将具有无效值。
执行代码所暗示的正确方法是这样的:
__device__ float *ptr;
__global__ void some_kernel()
{
float val = ptr[threadIdx.x];
....
}
float *ptr2;
cudaMalloc(&ptr2, size);
cudaMemcpyToSymbol("ptr", ptr2, sizeof(float *));
some_kernel<<<1,1>>>();
对于CUDA 4.x或更高版本,请将cudaMemcpyToSymbol
更改为:
cudaMemcpyToSymbol(ptr, ptr2, sizeof(float *));
如果静态设备符号ptr
真的是多余的,你可以这样:
float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);
但是我怀疑你可能正在寻找的东西就像thrust library device_ptr
class,这是一个很好的抽象包装裸设备指针并使其在代码中绝对清楚设备内存中的内容以及主机中的内容存储器中。