为什么cuda共享内存动态分配在这里无效?

时间:2013-10-13 13:59:55

标签: cuda

这很好用:

a_size=FindSizeAtrunTime();

Kernel<<< gridDim, blockDim, a_size >>>(count)

但这显示错误

__global__ void Kernel(int count_a, int count_b)
{

a_size=FindSizeAtrunTime();
    __shared__ int a[a_size];

}

错误:表达式必须具有常量值

在这两种情况下,大小都是在运行时确定的。那么为什么第一种情况没问题,而不是第二种情况呢?

1 个答案:

答案 0 :(得分:4)

第二个是两个级别的非法。

  1. 首先,C ++ 98(这是CUDA主要派生自的)不允许静态声明的动态大小的数组。语言不允许,因此CUDA也不允许。
  2. 其次,更重要的是,在内核可以启动之前,必须知道动态共享内存分配的大小。 GPU必须知道在调度块之前要保留多少共享内存。这在你的第二个例子中是不可能的,而在你的第一个例子中。