kepler阻塞每mp?

时间:2014-02-20 11:31:15

标签: cuda kepler

我是来自kepler白皮书 here

的readind

kepler支持最多16块/ mp。

但是线程/块= 1024和线程/ mp = 2048,因此块/ mp = 2。

我在这里遗漏了什么吗?

1 个答案:

答案 0 :(得分:3)

正如你对kepler说的那样,流式多处理器可以运行最多 16个线程块。
在您的示例中,如果一个线程块由1024个线程组成,那么在一个mp时只能同时启动两个块,因为在这种情况下,您将受到每个多处理器的最大线程数限制 - 2048/1024 = 2个块。

有几个因素会影响流式多处理器中可以同时运行的块数。 SM也具有有限数量的寄存器和共享存储器。如果您使用太多寄存器或太多共享内存,那么您将受到这些因素的限制。

对此的一个很好的概述是CUDA occupancy calculator。使用excel表,您可以轻松地为所有CUDA架构设置内核配置,您将看到内核将受到限制。
此外,CUDA programming guide提供了所有必需的信息。


也许一个简单的例子可以帮助 - 完成计算能力3.0的占用计算器:

如果您的线程块由512个线程组成,并且您不使用任何寄存器或共享内存,则并行块的数量仅受块大小的影响。 对于每个SM 2048的cc 3.0,可以启动。所以2048/512 = 4.只能同时使用4个线程块。

在第二步中,每个线程将使用额外的48个寄存器。 每个线程块将使用512 * 48 = 24576个寄存器。但是SM只能使用65536个寄存器。现在它只能运行两个块而不是四个块。

在最后一步中,我们假设一个块使用32000字节的共享内存。因为SM只能使用49152个字节用于共享内存,所以只能使用1个线程块。