我在读专业CUDA C编程,并在GPU 架构概述部分:
CUDA 采用单指令多线程 (SIMT) 架构来管理和执行 32 个线程组(称为 warp)。 warp 中的所有线程同时执行相同的指令。每个线程都有自己的指令地址计数器和寄存器状态,并根据自己的数据执行当前指令。每个 SM 将分配给它的线程块划分为 32 线程线程束,然后调度这些线程束在可用硬件资源上执行。
SIMT 架构类似于 SIMD(单指令、多数据)架构。 SIMD和SIMT都通过将相同的指令广播到多个执行单元来实现并行性。一个关键的区别是 SIMD 要求向量中的所有向量元素在统一的同步组中一起执行,而 SIMT 允许同一 warp 中的多个线程独立执行。尽管 warp 中的所有线程都在同一程序地址处一起启动,但各个线程也可能有不同的行为。 SIMT 使您能够为独立的标量线程编写线程级并行代码,以及为协调线程编写数据并行代码。 SIMT 模型包含 SIMD 所不具备的三个关键功能:
➤ 每个线程都有自己的指令地址计数器。
➤ 每个线程都有自己的寄存器状态。
➤ 每个线程可以有独立的执行路径。
第一段提到“All threads in a warp execute the same instruction at the same time.
”,而在第二段中,它说“Even though all threads in a warp start together at the same program address, it is possible for individual threads to have different behavior.
”。这让我很困惑,上面的说法似乎很矛盾。谁能解释一下吗?
这并不矛盾。 warp 中的所有线程始终以锁步方式执行相同的指令。为了支持条件执行和分支,CUDA 在 SIMT 模型中引入了两个概念
- 谓词执行(参见here)
- 指令重放/序列化(参见here)
谓词执行意味着条件指令的结果可用于屏蔽线程执行后续指令而无需分支。指令重放是处理经典条件分支的方式。所有线程通过重放指令来执行条件执行代码的所有分支。不遵循特定执行路径的线程将被屏蔽并执行相当于 NOP 的操作。这就是CUDA中所谓的分支发散惩罚,因为它对性能影响很大。
这就是锁步执行如何支持分支。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)