2011-03-19 73 views
1

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

__constant__ int deviceTempVariable = 1; 

现在我试图用两种方法得到的deviceTempVariable的地址,我得到不同的结果。首先是从一CUDA内核直接存储器存取如下:

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

另一种是通过主机的代码如下:

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

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

回答

4

在内核创建的指针显然是在设备上可用的。这可能是一个物理地址,尽管一些GPU可能开始添加虚拟化(MMU和TLB)。

它看起来像cudaGetSymbolAddress正在给你一个从主处理器可用的地址。这是不同的,因为设备内存已经被映射到主机的虚拟地址空间并且有一个偏移量。

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

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

0

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

您必须通过一个

void * address; 

cudaGetSymbolAddress(&address, "deviceTempVariable");