2012-02-12 89 views
0

我想實現簡單的並行減少。我正在使用來自CUDA sdk的代碼。但不知何故,有我在內核中的問題,因爲共享陣列沒有得到全球陣列及其全零的值。CUDA共享數組沒有獲取值?

extern __ shared __ float4 sdata[]; 

// each thread loadsone element from global to shared mem 

unsigned int tid = threadIdx.x; 

unsigned int i= blockIdx.x*blockDim.x+ threadIdx.x; 

sdata[tid] = dev_src[i]; 

__syncthreads(); 

// do reduction in shared mem 

for(unsigned int s=1; s < blockDim.x; s *= 2) { 

if(tid % (2*s) == 0){ 

sdata[tid] += sdata[tid + s]; 

} 

__syncthreads(); 

} 
// write result for this block to global mem 

if(tid == 0) 

out[blockIdx.x] = sdata[0]; 

編輯::

確定我得到它通過刪除extern關鍵字,使共享數組常量大小像512我在良好的狀態,現在的工作。也許有人可以解釋爲什麼它不是使用extern關鍵字

+0

所以dev_src有正確的價值觀,但不知何故SDATA沒有得到dev_src值 – elasolova 2012-02-12 00:51:17

+0

不要添加更新的意見。更新你的問題。 – Bart 2012-02-12 01:14:45

回答

2

我想我知道爲什麼,因爲我以前遇到這種這種情況正在發生的工作。你怎麼調用內核?

記得在調用kernel<<<blocks,threads,sharedMemory>>>sharedMemory應該是共享內存的大小,以字節爲單位。所以,如果你正在申報爲512元,第三個參數應爲512 *的sizeof(float4變量)。我想,你只是調用下面,這是不對的

kernel<<<blocks,threads,512>>> // this is wrong 

希望幫助

+0

爲了闡明此答案,因爲它主要是正確的:如果指定了__shared__變量作爲'的extern __shared__」則必須指定共享存儲器(以字節計)的量使用的執行配置的第三個參數在內核啓動分配(正如編程人員所描述的那樣,「<<<> >>」)。 – harrism 2012-02-13 04:12:11