【问题标题】:Why is cuda shared memory dynamic allocation not valid here?为什么 cuda 共享内存动态分配在这里无效?
【发布时间】:2013-10-14 02:58:09
【问题描述】:

这很好用:

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

}

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

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。你的第二点现在我很清楚了。但是您能否进一步详细说明您的第一点?
    • 在第二个示例中,您缺少动态分配所需的 __shared__ 分配前面的 extern 关键字。因此,它在语法上看起来像静态分配,并且静态分配必须具有编译器可发现的大小(即常量)。即使您使用extern 将其转换为适当的动态分配,它仍然会因为@talonmies 给出的第二个原因而失败。您也不妨查看相关的doc section
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多