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內有獨立指令(無數據依賴),可在同一時鐘周期發射多條指令。