是否可以为同一网格中的不同块声明不同的共享内存?

时间:2014-06-12 09:56:47

标签: cuda gpgpu gpu-programming

我已经问过这个问题HERE,但没有得到任何满意的答案。也许是因为我在那个问题中包含了多个问题。 我的问题是我是否被允许为同一网格的不同块声明不同的共享内存。

例如:

Dx = blockDim.x;
Dy = blockDim.y;
Bx = BlockIdx.x;
By = BlockIdx.y;

if(By==0)
 {
  if (Bx==0)
  {
   __shared__ bds[5][5];
  }
  else if (Bx==(Dy-1))
  {
   __shared__ bds[6][6];
  }
  else
  {
   __shared__ bds[5][6];
  }
}

上面的代码是内核代码的一部分。我试图将特定数量的共享内存分配给特定块。这种行为在CUDA中是否允许?

1 个答案:

答案 0 :(得分:3)

现在目标已停止摆动,并且有一个具体,稳定的问题要回答:

是的,完全有可能这样做但请注意

  1. 每个静态定义的共享内存变量在内核中具有受限制的范围,这将使代码结构比它需要的更加复杂
  2. 编译器将为您在共享内存中定义的每个变量发出单独的静态共享内存预留。如果,如你所说,你有一个内核有9个有条件定义的本地作用域共享内存分配,内核将使用静态预留进行编译,静态预留是所有九个变量的静态定义大小的总和
  3. 第2点暗示即使您有条件声明的共享内存分配不同,每个块的共享内存量也是相同的
  4. 第二点和第三点意味着您提出的方案没有规模效率增益。事实恰恰相反。你的内核将需要更多的共享内存,而不是只有一个静态声明的共享内存,这是每种情况下所需的最大内存并且你做了相应的编码。