Memory CUDA共享阵列未获取值?

Memory CUDA共享阵列未获取值?,memory,cuda,shared,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

我试图实现简单的并行归约。我正在使用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];
extern共享浮动4数据[];
//每个线程将一个元素从全局加载到共享mem
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*blockDim.x+threadIdx.x;
sdata[tid]=dev_src[i];
__同步线程();
//是否减少共享内存
for(无符号整数s=1;s
编辑::


好的,我通过删除extern关键字并使共享数组的大小保持恒定(如512),使其正常工作。我现在身体很好。也许有人能解释为什么它不使用extern关键字

我想我知道为什么会发生这种情况,因为我以前遇到过这种情况。如何调用内核

请记住,在调用
kernel
时,
sharedMemory
应该是共享内存的大小(以字节为单位)。因此,如果要声明512个元素,第三个参数应该是512*sizeof(float4)。我想你打电话的方式如下,这是错误的

kernel<<<blocks,threads,512>>>   // this is wrong
kernel//这是错误的

希望这有帮助

使dev_src具有正确的值,但sdata不知何故没有获得dev_src值,因此无法对注释添加更新。更新您的问题。为了澄清这个答案,因为它基本上是正确的:如果您将一个共享变量指定为'extern shared',那么您必须使用执行配置(the)的第三个参数指定在内核启动时分配的共享内存量(以字节为单位),如程序员所述。