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