11

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

这些数字如何相互关联以及经纱尺寸?我假设(可能是错误的)每个 SMP 有 192 个内核,但这不是 1024 的因数。如果每个内核运行 32 个线程的扭曲,我预计每个 SMP 有 32 * 192 个线程,或 2^5 * (2^ 7 + 2^6),或 4096 + 2048 = 6142。

我错过了什么?

4

1 回答 1

16

我认为您应该更深入地了解在 cuda 中调度内核。

有两个重要的大小:每个块的线程

每个都安排在一个 SM 上,然后在那里被分割成 warp。因此,块有一个共享内存,只能在块内部访问,因为它位于 SM 内存上。每个 SM的数取决于设备限制和占用计算。对于 CC 1.0-2.x,每个 SM 的最大块数为 8,对于 CC 3.x,为 16。

每个块每个都有一定数量的线程。线程被划分为warp,warp可以以任意顺序运行,仅由warp-scheduler和SM确定。

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

最大线程数因计算能力而异。CC2.0-3.x 支持每个块最多 1024 个线程,只要有足够的寄存器和扭曲槽。Warp 被静态分配给 warp 调度程序。每个 SM 的 warp 调度器数量对于 CC 1.x 为 1,对于 CC 2.x 为 2,对于 CC 3.x 为 4。

如果您的应用程序没有执行并发内核,那么要使用每个 SM,gridDim 应该具有 >= SM 块数。

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

于 2013-06-07T15:01:44.170 回答