【问题标题】:CUDA shared array not getting values?CUDA 共享数组没有得到值?
【发布时间】:2012-03-03 23:10:44
【问题描述】:

我正在尝试实现简单的并行缩减。我正在使用来自 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 关键字并使共享数组的大小固定为 512 来使其正常工作。我现在状态良好。也许有人可以解释为什么它不能使用 extern 关键字

【问题讨论】:

  • 所以 dev_src 有正确的值,但 sdata 不知何故没有得到 dev_src 值
  • 不要向 cmets 添加更新。更新您的问题。

标签: memory cuda shared


【解决方案1】:

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

记住在调用kernel&lt;&lt;&lt;blocks,threads,sharedMemory&gt;&gt;&gt;sharedMemory 应该是共享内存的大小(以字节为单位)。所以,如果你声明 512 个元素,第三个参数应该是 512 * sizeof(float4)。我认为您只是按以下方式调用,这是错误的

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

希望有帮助

【讨论】:

  • 为了澄清这个答案,因为它大部分是正确的:如果您将 shared 变量指定为 `extern shared" 那么您必须指定数量正如程序员所描述的,使用执行配置的第三个参数(>>)在内核启动时分配共享内存(以字节为单位)。
猜你喜欢
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2014-03-21
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多