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