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