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

为什么cuda共享内存动态分配在这里无效?,cuda,Cuda,这很好: a_size=FindSizeAtrunTime(); Kernel<<< gridDim, blockDim, a_size >>>(count) 错误:表达式必须具有常量值 在这两种情况下,大小都是在运行时确定的。那么,为什么第一种情况可以,而第二种情况不行呢 第二个在两个层面上是非法的 首先,C++98(CUDA的主要来源)不允许静态声明、动态调整大小的数组。语言不允许,库达也不允许 其次,更重要的是,在启动内核之前,必须知道动态共享内存分

这很好:

a_size=FindSizeAtrunTime();

Kernel<<< gridDim, blockDim, a_size >>>(count)
错误:表达式必须具有常量值


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

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

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

  • 第二种在两个层面上是非法的

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

  • 谢谢我现在非常清楚你的第二点。但是,请您进一步阐述您的第一点好吗?在第二个示例中,您缺少动态分配所需的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,它在语法上类似于静态分配,并且静态分配必须具有编译器可以发现的大小(即常量)。即使您使用
    extern
    将其转换为适当的动态分配,由于@talonmies给出的第二个原因,它仍然会失败。您还可以查看相关的感谢。我现在非常清楚你的第二点。但是,请您进一步阐述您的第一点好吗?在第二个示例中,您缺少动态分配所需的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,它在语法上类似于静态分配,并且静态分配必须具有编译器可以发现的大小(即常量)。即使您使用
    extern
    将其转换为适当的动态分配,由于@talonmies给出的第二个原因,它仍然会失败。您还可以查看相关的
    __global__ void Kernel(int count_a, int count_b)
    {
    
    a_size=FindSizeAtrunTime();
        __shared__ int a[a_size];
    
    }