我已经使用CUDA几周了,但是我对块/线程/线程的分配有一些疑问。 我正在从教学角度(大学项目)研究体系结构,因此达到最佳性能不是我的关注。
首先,我想了解一下我是否明白这些事实:
程序员编写内核,并在线程块网格中组织其执行。
每个块都分配给一个流多处理器(SM)。分配后,便无法迁移到另一个SM。
每个SM将自己的块拆分为Warp(当前最大为32个线程)。扭曲中的所有线程均在SM的资源上同时执行。
线程的实际执行由SM中包含的CUDA核心执行。线程和核心之间没有特定的映射。
如果warp包含20个线程,但是当前只有16个内核可用,则warp将无法运行。
另一方面,如果一个块包含48个线程,则它将拆分为2个扭曲,并在有足够内存可用的情况下并行执行。
如果线程在内核上启动,则由于内存访问或长时间浮点操作而被暂停,则其执行可以在其他内核上恢复。
他们正确吗?
现在,我有一个GeForce 560 Ti,因此根据规格它配备了8个SM,每个包含48个CUDA内核(总共384个内核)。
我的目标是确保体系结构的每个核心都执行SAME指令。假设我的代码不需要比每个SM中可用的更多的寄存器,我想到了不同的方法:
我创建了8个块,每个块有48个线程,因此每个SM都有1个块要执行。在这种情况下,这48个线程是否将在SM中并行执行(利用所有48个可用的内核)?
如果我启动64个6线程块,会有什么区别?(假设它们将在SM之间平均映射)
如果我将GPU“淹没”在计划的工作中(例如,创建1024个线程块,每个线程有1024个线程),则可以合理地假设所有内核将在某个时刻使用,并且将执行相同的计算(假设线程永不停止)?
有什么方法可以使用探查器检查这些情况吗?
这个东西有参考吗?我阅读了《 CUDA编程指南》以及“对大型并行处理器进行编程”和“ CUDA应用程序设计与开发”中有关硬件体系结构的章节;但是我找不到确切的答案。