Pointers CUDA/C++;:在C+中传递uu设备uu指针+;代码

Pointers CUDA/C++;:在C+中传递uu设备uu指针+;代码,pointers,cuda,Pointers,Cuda,我正在开发一个Windows 64位应用程序,它将在多个GPU上管理不同CUDA算法的并发执行 我的设计需要一种将指针传递到设备内存的方法 围绕C++代码。(例如,将它们作为C++对象中的成员记住)。 我知道用\uu设备\uu限定符声明类成员是不可能的 然而,我找不到一个明确的答案,是否将\uuu设备\uuuu指针分配给一个普通的C指针,然后使用后者工作。换句话说:以下代码有效吗 __device__ float *ptr; cudaMalloc(&ptr, size); float *

我正在开发一个Windows 64位应用程序,它将在多个GPU上管理不同CUDA算法的并发执行

我的设计需要一种将指针传递到设备内存的方法 围绕C++代码。(例如,将它们作为C++对象中的成员记住)。 我知道用
\uu设备\uu
限定符声明类成员是不可能的

然而,我找不到一个明确的答案,是否将
\uuu设备\uuuu
指针分配给一个普通的C指针,然后使用后者工作。换句话说:以下代码有效吗

__device__ float *ptr;
cudaMalloc(&ptr, size);
float *ptr2 = ptr
some_kernel<<<1,1>>>(ptr2);
\uuuuu设备\uuuuuuuuu浮动*ptr;
Cudamaloc(和ptr,尺寸);
浮动*ptr2=ptr
一些内核(ptr2);

对我来说,它的编译和行为是正确的,但我想知道它是否保证是正确的。

不,该代码不是严格有效的。虽然它可能在主机端工作(或多或少是偶然的),但如果您试图直接从设备代码中取消引用
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>>>();
float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);
如果静态设备符号
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>>>();
float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);
float*ptr2;
Cudamaloc(和ptr2,尺寸);
一些内核(ptr2);

但我怀疑您可能正在寻找的是类似的东西,它是一个很好的抽象,包装了裸设备指针,并在代码中完全清楚设备内存中的内容和主机内存中的内容。

不,该代码不是严格有效的。虽然它可能在主机端工作(或多或少是偶然的),但如果您试图直接从设备代码中取消引用
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>>>();
float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);
如果静态设备符号
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>>>();
float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);
float*ptr2;
Cudamaloc(和ptr2,尺寸);
一些内核(ptr2);
但我怀疑您可能正在寻找的是类似的东西,它是一个很好的抽象,包装了裸设备指针,并在代码中明确了设备内存中的内容和主机内存中的内容