CUDA:是否可以将所有48KB的片上存储器用作共享存储器?

时间:2012-09-13 08:23:19

标签: cuda gpu gpgpu nvidia

我正在使用Windows 7 64位SP1上的CUDA Toolkit 4.0和Visual Studio 2010 Professional为GTX 580开发CUDA应用程序。我的程序比典型的CUDA程序更耗费内存,我试图为每个CUDA块分配尽可能多的共享内存。但是,每次尝试为每个块使用超过32K的共享内存时,程序都会崩溃。

通过阅读官方CUDA文档,我了解到CUDA设备上每个SM有48KB的片上内存,计算能力为2.0或更高,片上内存在L1缓存和共享内存之间分配:

  

相同的片上存储器用于L1和共享存储器,以及多少   它专用于L1与共享内存可配置用于每个内核调用   (第F.4.1节)   http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/Fermi_Tuning_Guide.pdf

这让我怀疑在程序运行时只有32KB的单内存被分配为共享内存。因此我的问题是:是否可以将所有48KB的片上内存用作共享内存?

我尝试了所有我能想到的东西。我为nvcc指定了选项--ptxas-options =“ - v -dlcm = cg”,我在程序中调用了cudaDeviceSetCacheConfig()和cudaFuncSetCacheConfig(),但没有一个解决了这个问题。我甚至确保没有寄存器溢出,并且我没有意外地使用本地内存:

1>      24 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1>  ptxas info    : Used 63 registers, 40000+0 bytes smem, 52 bytes cmem[0], 2540 bytes cmem[2], 8 bytes cmem[14], 72 bytes cmem[16]

虽然我可以使用32KB的共享内存,这已经给了我巨大的性能提升,但我宁愿充分利用所有快速的片上内存。非常感谢任何帮助。

更新:我在程序崩溃时启动了640个线程。 512给了我比256更好的性能,所以我试图进一步增加线程数。

2 个答案:

答案 0 :(得分:6)

您的问题与共享内存配置无关,但与您要启动的线程数有关。

每个线程使用63个寄存器并启动640个线程,总共可以提供40320个寄存器。您设备的注册总量为32K,因此资源不足。

关于片上存储器在Tom的回答中得到了很好的解释,并且正如他评论的那样,检查API调用中的错误将有助于您将来的错误。

答案 1 :(得分:3)

计算能力2.0及更高版本的设备每个SM具有64KB的片上存储器。这可以配置为16KB L1和48KB涂层或48KB L1和16KB涂层(计算能力3.x上也是32/32)。

您的程序因其他原因而崩溃。您是否检查所有API调用是否有错误?你试过cuda-memcheck吗?

如果你使用太多的共享内存,那么当你启动内核说资源不足时你会收到错误。