CUDA共享数组没有得到值?

时间:2012-02-12 00:50:05

标签: memory cuda shared

我正在尝试实现简单的并行缩减。我正在使用CUDA sdk的代码。不知怎的,我的内核中存在一个问题,因为共享数组没有获取全局数组的值及其全部为零。

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];

EDIT ::

好吧我通过删除extern关键字并使共享数组像512这样的常量大小来实现它。我现在状态良好。也许有人可以解释为什么它不能使用extern关键字

1 个答案:

答案 0 :(得分:2)

我想我知道为什么会发生这种情况,因为我之前遇到过这种情况。你是怎么称呼内核的?

请记住,在kernel<<<blocks,threads,sharedMemory>>>调用中,sharedMemory应该是共享内存的大小(以字节为单位)。因此,如果要声明512个元素,则第三个参数应为512 * sizeof(float4)。我认为你只是在调用如下,这是错误的

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

希望有所帮助