我知道 CUDA GPU 上有多处理器,其中包含 CUDA 内核。在我的工作场所,我正在使用 GTX 590,它包含 512 个 CUDA 内核、16 个多处理器,并且 warp 大小为 32。所以这意味着每个多处理器中有 32 个 CUDA 内核,它们在同一个 warp 中的相同代码上运行. 最后,每个块大小的最大线程数是 1024。
我的问题是块大小和多处理器计数 - 扭曲大小是如何完全相关的。说一下我对这种情况的理解:例如我在 GTX 590 上分配了 N 个最大 threadPerBlock 大小为 1024 的块。据我从 CUDA 编程指南和其他来源了解,这些块首先由硬件枚举. 在这种情况下,N 个块中的 16 个被分配给不同的多处理器。每个块包含 1024 个线程,硬件调度程序将其中的 32 个线程分配给单个多处理器中的 32 个内核。同一多处理器(warp)中的线程处理同一行代码并使用当前多处理器的共享内存。如果当前32个线程遇到内存读写等片外操作,它们被当前块中的另一组 32 个线程替换。所以,实际上在一个块中有 32 个线程,它们是在任何给定时间在多处理器上完全并行运行,而不是整个 1024。最后,如果一个块完全由多处理器处理,则将 N 个线程块列表中的一个新线程块插入当前多处理器。最后,在 CUDA 内核执行期间,GPU 中总共有 512 个线程并行运行。(我知道如果一个块使用的寄存器比单个多处理器上可用的寄存器多,那么它会被划分为在两个多处理器上工作,但在我们的例子中假设每个块都可以放入单个多处理器。)
那么,我的 CUDA 并行执行模型是否正确?如果没有,有什么问题或遗漏?我想微调我正在做的当前项目,所以我需要整个事情中最正确的工作模型。