1. 背景
- 最开始在学习 cuda 编程时,只知道 warp scheduler 线程束调度的概念,但是不清楚调度的细节。现在查看 CUDA Pragramming Guide 性能优化篇看到了关于 warp 调度更清晰的细节。
 
2. 概念
- 延时:一个线程束准备好执行下一条指令的时钟周期,受数据依赖,资源竞争,调度策略影响。
 
- 指令延迟:指令从发出到完成的时钟周期,是硬件特性;
 
- 独立指令:没有其他依赖的指令,可以是访存指令也可以是算数指令。比如:
 
FMA R1, R2, R3, R4  // 指令A:R1 = R2 * R3 + R4
LD R5, [R6]         // 指令B:加载内存到R5
3. 线程束调度
- 不同架构配置不同,假如每个SM有4个 warp scheduler,最大容许 48个 warp, 每个warp scheduler有12个warp issue slots;
 
- 指令发射:每个 warp scheduler 选择一条就绪指令,发射到 warp 的 active threads;
 
- latency:该 warp 准备好执行下一条指令的延迟,大于指令延迟。
 
- 指令延迟隐藏:比如在计算能力 7.x 的设备上,大多数算术指令通常需要 4 个时钟周期。那么该 SM 需要有 4 * 4 = 16个就绪 warp 才能隐藏指令延时;
 
- 下一条指令:可能是属于该 warp,也有可能属于其他 warp,如果该 warp 有多个独立指令,则会发射这些指令到  active threads,用于延迟隐藏的 warp 数量需求就变少了。
 
4. warp scheduler
- 作用:选择一个就绪指令发射到 active threads
 
- 分类:
 
- 单发射(Single-Issue)调度器:传统GPU(如Fermi架构)的调度器每次只能发射一个warp的一条指令,即使指令间无依赖关系,也需顺序执行。
 
- 多发射(Multi-Issue)调度器:现代GPU(如Volta/Ampere架构)的调度器可同时检查多个warp的指令流,若发现同一warp内有独立指令(无数据依赖),可在同一时钟周期发射多条指令。