Memory CUDA共享阵列未获取值?
我试图实现简单的并行归约。我正在使用CUDA sdk中的代码。但不知何故,在我的内核中存在一个问题,因为共享数组没有得到全局数组及其全零的值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
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)的第三个参数指定在内核启动时分配的共享内存量(以字节为单位),如程序员所述。