2012-05-14 99 views
1

我該如何讓線程塊中的每個線程都擁有自己的共享內存指針?我發現一些這樣的指針聲明的例子:本地指針指向CUDA中的共享內存

int __shared__ *p; 
__shared__ int array[256]; 

p = &array[threadId]; 

這是正確的還是有另一種方式?

回答

4

不,這不是正確的方法。在該示例代碼中,共享p,這意味着該塊中的每個線程都將試圖訪問同一塊內存。你可以不喜歡這樣,如果threadId是與塊獨特的螺紋指數:

int *p; 
__shared__ int array[256]; 

p = &array[threadId]; 

在這種情況下,編譯器將使用一個寄存器或線程本地內存來存儲元素的唯一地址靜態共享內存爲塊中的每個線程分配array

+0

謝謝,我以爲我看到了它在[http://forums.nvidia.com/index.php?showtopic=35294]但聲明像'INT * __ shared__ p ;'應該將指針存儲在線程本地內存中並指向共享內存。這是對的嗎? – stuhlo

+0

不,這是不正確的。您可以放心地忽視該線程中的所有內容 - 從2008年開始,CUDA是新的,編譯器是原始的,並且很多人都不瞭解語言擴展的細節以及它們如何映射到硬件。 – talonmies

+0

如何強制p被存入寄存器? – spurra

-1

你說得對。更好的方法是動態分配共享內存。一個例子是老鄉:

void __global__ test(){ 
extern __shared__ int s[]; 
int *p = &s[xx]; 

} 

... 
test<<<x,y, shared memory length>>>(); 
... 
+0

但問題中的發佈代碼_isn't_沒錯。 '* p'不能被聲明爲'__shared__',這是一個共享內存競賽。 – talonmies