我认为您应该更深入地了解在 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 个线程。