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