0

这工作正常:

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];

}

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

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

4

1 回答 1

4

第二个在两个层面上都是非法的。

  1. 首先,C++98(这是 CUDA 的主要派生源)不允许静态声明、动态大小的数组。语言不允许这样做,CUDA 也不允许。
  2. 其次,更重要的是,在启动内核之前必须知道动态共享内存分配的大小。GPU 必须知道在调度块之前要保留多少共享内存。这在您的第二个示例中是不可能的,而在您的第一个示例中是不可能的。
于 2013-10-13T14:13:01.557 回答