我正在 Windows 7 64 位 SP1 上使用 CUDA Toolkit 4.0 和 Visual Studio 2010 Professional 为 GTX 580 开发 CUDA 应用程序。我的程序比典型的 CUDA 程序更占用内存,我试图为每个 CUDA 块分配尽可能多的共享内存。但是,每次我尝试为每个块使用超过 32K 的共享内存时,程序都会崩溃。
通过阅读 CUDA 官方文档,我了解到计算能力为 2.0 或更高的 CUDA 设备上的每个 SM 都有 48KB 的片上内存,并且片上内存分为 L1 缓存和共享内存:
L1 和共享内存都使用相同的片上内存,对于每个内核调用(第 F.4.1 节) http://developer.download.nvidia.com,可以配置多少专用于 L1 与共享内存 /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 更好的性能,所以我尝试进一步增加线程数。