CUDA核心 vs 线程数量

13

我对NVidia GPU中核心数量、SMP数量和最大线程数之间的关系感到困惑。我的笔记本电脑GT650m的设备属性显示有384个核心,2个SMP,并且每个SMP有1024个线程。

这些数字如何相互关联以及与warp大小有什么关系?我假设(可能是不正确的)每个SMP有192个核心,但这不是1024的因数。如果每个核心运行一个32个线程的warp,我会期望每个SMP有32 * 192个线程,或者是2^5 * (2^7 + 2^6),即4096 + 2048 = 6142个线程。

我错过了什么?

1个回答

18

我认为你应该深入了解在CUDA中如何调度内核。

有两个重要的大小: 块(block)每个块的线程数(threads per block)

每个被安排在一个SM上,然后被切片成warp。因此,块具有共享内存,该内存仅在块内部可访问,因为它位于SM内存上。每个SM的块数(blocks per SM)取决于设备限制和占用率计算。CC 1.0-2.x的最大块数为8,CC 3.x的最大块数为16。

每个都有一定数量的每个块的线程数(threads per block)。线程被划分为warp,warp可以以任意顺序运行,只取决于warp-scheduler和SM。

现在您的卡在2个SM上拥有总共384个核心,每个SM有192个核心。CUDA核心数量代表每个周期可以执行的单精度浮点或整数线程指令的总数。请不要在任何计算中考虑CUDA核心。

最大线程数(maximum number of threads)因计算能力而异。CC2.0-3.x支持最多1024个线程,前提是寄存器和warp槽足够。Warp静态分配给warp调度程序。每个SM的warp调度程序数为1(CC 1.x),2(CC 2.x)和4(CC 3.x)。

如果您的应用程序不执行并发内核,则为了使用每个SM,gridDim应该具有大于或等于SM块数的值。

对于GTX650m,要充分利用您的计算能力,至少应该有两个块(block)(否则,如果只有一个块,则只能使用一个SM)。另一方面,如果您想要调度10240个线程,则可以轻松地调度10个包含1024个线程的块。


谢谢。我想我缺失的是Warp调度。 - 3Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接