title: 什么是线程束?

线程束 (Warp) 是一组被一起调度并并行执行的线程。一个线程束中的所有线程都被调度到单个流式多处理器 (SM) 上。单个 SM 通常执行多个线程束,至少包括来自同一个协作线程阵列(也称为线程块)的所有线程束。

线程束是 GPU 上典型的执行单元。在正常执行过程中,线程束的所有线程并行执行相同的指令——这就是所谓的"单指令多线程"或 SIMT 模型。当线程束中的线程分道扬镳执行不同指令时(也称为线程束分化),性能通常会急剧下降。

线程束大小在技术上是与机器相关的常数,但在实践中(以及本词汇表的其他地方)它是 32。

当线程束被发出指令时,结果通常无法在单个时钟周期内获得,因此无法发出相关指令。虽然这对于从全局内存的读取最为明显(通常需要离开芯片),但对于某些算术指令也是如此(请参阅CUDA C++ 最佳实践指南了解特定指令每个时钟周期的结果表)。

下一个指令因缺少操作数而延迟的线程束被称为停滞

当多个线程束被调度到单个 SM 上时,线程束调度器不会等待指令结果返回,而是选择另一个线程束执行。这种延迟隐藏是 GPU 实现高吞吐量并确保执行期间所有核心始终有工作可用的方式。因此,最大化调度到每个 SM 上的线程束数量通常是有益的,确保始终有符合条件的线程束供 SM 运行。线程束被发出指令的周期比例称为发射效率。线程束调度中的并发程度称为占用率

线程束实际上并不是 CUDA 编程模型线程层次结构的一部分。相反,它们是在 NVIDIA GPU 上实现该模型的实现细节。从这个意义上说,它们有点类似于 CPU 中的缓存行:一种您不直接控制且不需要考虑程序正确性的硬件特性,但对于实现最佳性能很重要。

根据 Lindholm 等人,2008,线程束的命名参考了编织——"第一种并行线程技术"。其他 GPU 编程模型中与线程束等效的概念包括 WebGPU 中的子组、DirectX 中的波阵面以及 Metal 中的simdgroups