我正在开发一个CUDA应用程序GTX 580与CUDA工具包4.0和VisualStudio2010Professional在Windows 7 64位SP1上。我的程序比典型的CUDA程序占用更多的内存,我正试图为每个CUDA块分配尽可能多的共享内存。但是,每当我试图为每个块使用超过32K的共享内存时,程序就会崩溃。
通过阅读官方的CUDA文档,我了解到在计算能力为2.0或更高的CUDA设备上,每个SM都有48 or的片上内存,并且在L1缓存和共享内存之间分离:
相同的片上内存用于L1和共享内存,其中有多少用于L1而共享内存对于每个内核调用都是可配置的(第F.4.1节) Guide.pdf。
这让我怀疑,当我的程序运行时,只有32 as的单芯片内存被分配为共享内存。因此,我的问题是:是否可以使用所有48 on的片上内存作为共享内存?
我试过了我能想到的一切。我为nvcc指定了选项--ptxas--dlcm=cg=“-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]
虽然我可以使用32 of的共享内存,这已经给我带来了巨大的性能提升,但我更愿意充分利用所有的快死内存。任何帮助都是非常感谢的。
更新:当程序崩溃时,我正在启动640个线程。512给了我比256更好的性能,所以我试图进一步增加线程的数量。
发布于 2012-09-13 01:03:10
您的问题与共享内存配置无关,而是与正在启动的线程数量有关。
每个线程使用63个寄存器,并启动640个线程,总共提供了40320个寄存器。设备的注册总数为32K,因此资源不足。
关于芯片上的内存,Tom的回答很好地解释了,正如他评论的那样,检查API调用中的错误将有助于您处理将来的错误。
发布于 2012-09-13 00:48:37
计算能力2.0及更高的设备每SM有64 SM的片上内存。这可以配置为16 on的L1和48 on的涂片或48 on的L1和16 on的涂片(在计算能力3.x上也是32/32 )。
你的程序崩溃还有另一个原因。您是否检查了所有API调用中的错误?你试过库达-麦考克了吗?
如果您使用过多的共享内存,那么当您启动内核时会出现一个错误,说明资源不足。
发布于 2012-09-20 06:53:41
另外,将参数从主机传递到GPU使用共享内存(最多256个字节),因此您将永远得不到实际的48 so。
https://stackoverflow.com/questions/12402191
复制相似问题