CUDA指向设备常量的指针

时间:2011-03-19 17:02:54

标签: c++ memory pointers cuda

我在CUDA设备上定义了以下常量:

__constant__ int deviceTempVariable = 1;

现在我尝试使用两种方法获取deviceTempVariable的地址,并且我得到了不同的结果。第一种是来自CUDA内核的直接内存访问,如下所示:

__global__ void cudaPointers(pointerStruct* devicePointer)
{
    devicePointer->itsPointer = &deviceTempVariable;
}

另一个是通过主机代码,如下所示:

cudaGetSymbolAddress((void**) &pointerCuda, "deviceTempVariable");

我好奇并检查了地址值;第一个是00000008,第二个是00110008。在所有情况下(数字8),偏移量似乎相同,但其余部分则不同。这里发生了什么,我必须使用哪个地址?

2 个答案:

答案 0 :(得分:4)

在内核中创建的指针显然可以在设备上使用。它可能是一个物理地址,虽然有些GPU可能会开始添加虚拟化(MMU和TLB)。

看起来cudaGetSymbolAddress正在为您提供可从主处理器使用的地址。这是不同的,因为设备内存已经映射到主机的虚拟地址空间并带有偏移量。

主机代码应使用cudaGetSymbolAddress返回的地址,内核代码应使用地址运算符&

嵌入在共享数据结构中的指针需要使用基于寻址的方法(基本上与数组索引相同,您可以存储主机和内核都可以找到的已知位置的偏移量。)

答案 1 :(得分:0)

这很有趣。你怎么打印这两个地址?你确定你没有打印指针的地址吗?

你需要传递一个

void * address;

cudaGetSymbolAddress( &address, "deviceTempVariable");