0

这个问题也是从以下链接开始的:共享内存优化混淆

在上面的链接中,从 talonmies 的回答中,我发现计划运行的块数的第一个条件是“8”。我有 3 个问题,如下所示。

  1. 是不是意味着条件 2 和条件 3 的块数超过 8 个时,只能同时调度 8 个块?是否不管cuda环境、gpu设备、算法等任何条件?

  2. 如果是这样,这确实意味着在某些情况下最好不要使用共享内存,这取决于。然后我们要思考如何判断哪个更好,使用或不使用共享内存。我认为一种方法是检查是否存在全局内存访问限制(内存带宽瓶颈)。这意味着如果没有全局内存访问限制,我们可以选择“不使用共享内存”。这是好方法吗?

  3. 加上上面的问题2,我认为如果我的CUDA程序应该处理的数据很大,那么我们可以认为“不使用共享内存”更好,因为在共享内存中很难处理。这也是好方法吗?

4

1 回答 1

3

同时调度的块的数量总是会受到某些东西的限制。

使用 CUDA 占用计算器应该清楚它是如何工作的。三种资源的使用会影响并发调度的块数。它们是Threads Per BlockRegisters Per ThreadShared Memory Per Block

如果您在2.0 上设置使用 1 Threads Per Block、 1Registers Per Thread和 1的内核,您将受到8 的限制。如果您开始增加,将继续成为您的限制因素,直到您达到成为限制因素的阈值。由于每个 SM 有 49152 字节的共享内存,这发生在大约 8 / 49152 = 6144 字节(它有点少,因为系统使用了一些共享内存并且它以 128 字节的块分配)。Shared Memory Per BlockCompute CapabilityMax Blocks per MultiprocessorShared Memory Per BlockMax Blocks per MultiprocessorShared Memory Per Block

换句话说,给定 8 的限制Max Blocks per Multiprocessor,使用共享内存是完全免费的(因为它与并发运行的块的数量有关),只要您保持在Shared Memory Per Block成为限制因素的阈值以​​下。

寄存器使用也是如此。

于 2012-04-04T14:46:09.403 回答