Memory 如何将所有可用共享内存分配给CUDA中的单个块?

Memory 如何将所有可用共享内存分配给CUDA中的单个块?,memory,cuda,gpu,Memory,Cuda,Gpu,我想将SM的所有可用共享内存分配给一个块。我这样做是因为我不想将多个块分配给同一个SM。 我的GPU卡有64KB(共享+L1)内存。在我当前的配置中,48KB分配给共享内存,16KB分配给L1。 我编写了下面的代码来使用所有可用的共享内存 __global__ void foo() { __shared__ char array[49152]; ... } 我有两个问题: 如何确保所有共享内存空间都已用完 我可以将“48K”增加到更高的值(不会得到任何错误或警告)。有人能证明这一

我想将SM的所有可用共享内存分配给一个块。我这样做是因为我不想将多个块分配给同一个SM。 我的GPU卡有64KB(共享+L1)内存。在我当前的配置中,48KB分配给共享内存,16KB分配给L1。 我编写了下面的代码来使用所有可用的共享内存

   __global__ void foo()
{

  __shared__ char array[49152];
...

}
我有两个问题:

  • 如何确保所有共享内存空间都已用完
  • 我可以将“48K”增加到更高的值(不会得到任何错误或警告)。有人能证明这一点吗
  • 提前感谢,

    伊曼

  • 您可以从
    cudaDeviceProp::SharedTemperBlock
    读取可用设备共享内存的大小,您可以通过调用
    cudaGetDeviceProperties
  • 您不必指定数组的大小。相反,您可以动态地将共享内存的大小作为第三个内核启动参数传递

  • “clock”CUDA SDK示例演示了如何在启动时指定共享内存大小。

    当我使用(静态分配的)共享内存大小太大进行编译时,会出现编译错误(来自ptxas)。请提供共享内存分配过大的代码的完整可编译示例,以及用于编译的命令行,以便进一步调查您的问题#2。如果按照Eugene的建议,在内核启动时切换到动态分配共享内存,那么应该会出现运行时错误(是否正在检查错误?)如果请求的共享内存太大。如果您的应用程序不支持并发内核执行,则您只需为每个共享内存分配1/2*MAX_shared_memory\u+1字节的共享内存,将占用限制为每个共享内存1个块。