此问题也是从以下链接开始的:shared memory optimization confusion
在上面的链接中,根据talonmies的回答,我发现计划运行的块数的第一个条件是“8”。我有3个问题,如下所示。
是否意味着当条件2和3的块数超过8时,只能同时调度8个块?是否适用于cuda环境,gpu设备或算法等任何条件?
如果是这样,它确实意味着最好不要在某些情况下使用共享内存,这取决于它。然后我们必须考虑如何判断哪一个更好,使用或不使用共享内存。我认为一种方法是检查是否存在全局内存访问限制(内存带宽瓶颈)。这意味着如果没有全局内存访问限制,我们可以选择“不使用共享内存”。这是好方法吗?
再加上问题2,我认为如果我的CUDA程序应该处理的数据很大,那么我们可以认为“不使用共享内存”更好,因为在共享内存中很难处理。这也是好方法吗?
答案 0 :(得分:3)
并发计划的块数总是受某些的限制。
使用CUDA占用计算器应该清楚它是如何工作的。三种资源的使用会影响并发调度的块的数量。它们是Threads Per Block
,Registers Per Thread
和Shared Memory Per Block
。
如果您在Threads Per Block
2.0上设置使用1 Registers Per Thread
,1 Shared Memory Per Block
和1 Compute Capability
的内核,则受Max Blocks per Multiprocessor
的限制,如果您开始增加Shared Memory Per Block
,Max Blocks per Multiprocessor
将继续成为您的限制因素,直到您达到Shared Memory Per Block
成为限制因素的阈值。由于每个SM有49152个字节的共享内存,因此大约发生在8/49152 = 6144个字节(由于系统使用了一些共享内存并且它以128字节的块分配),因此它会少一些。
换句话说,给定8 Max Blocks per Multiprocessor
的限制,使用共享内存是完全免费的(因为它与并发运行的块的数量有关),只要你保持低于{{1的阈值成为限制因素。
注册用法也是如此。