2011-03-19 74 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");