# Warp Divergence ## 定義 warp divergence(warp分岐、branch divergence)とは、SIMT(single instruction, multiple thread)方式で実行される同一warp内のスレッドが、`if/else` 等の条件分岐で異なる制御フロー経路を取る現象である。GPUは1warp(32スレッド)単位で命令を発行するため、分岐が生じると各経路を直列に実行せざるを得ず、非該当のスレッドは実行中マスクされて遊休化する。この結果、warp execution efficiency(warpあたりの有効稼働スレッド率)が低下し、命令数と実行時間が増大する(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 8 Occupancy Tuning, Warp Efficiency, and Instruction-Level Parallelism]])。 ## 横断的知見 - predication(述語化)によるwarp divergence解消は、分岐が短く軽量な場合にのみ有効という条件付きの手法である。本章の例示(閾値処理カーネル)ではpredication適用でwarp execution efficiencyが50%から99%へ改善し実行時間が半減したが、各分岐の処理が重い場合はpredicationによる「両分岐を全スレッドで計算する」オーバーヘッドの方が分岐そのものより高くつく可能性があり、その場合はカーネル分割や warp-unanimous な条件再構成の方が有利になる、というトレードオフが明示されている(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 8 Occupancy Tuning, Warp Efficiency, and Instruction-Level Parallelism]])。 - warp divergenceの影響はwarp境界に閉じている。異なるwarp間で条件分岐の結果が異なっていても、互いに他のwarpをストールさせることはない。この性質が「warp-unanimousな条件への再構成」(warp ID等でデータを整列し、各warpが単一の分岐のみを取るようにする)という緩和策の根拠になっている(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 8 Occupancy Tuning, Warp Efficiency, and Instruction-Level Parallelism]])。 ## 未解決の問い - PyTorchの `torch.compile`(TorchInductor)がpointwise演算を融合する際、warp divergenceを避ける述語化・ベクトル化がどこまで自動的に行われ、どこからユーザーの明示的なコード再構成(`torch.where`等)が必要になるかの境界線は何か。 - ツリー/グラフ構造のように本質的にスレッドごとの処理量が異なるワークロードでは、divergenceを完全に避けられない。そうした場合の実務上のベストプラクティス(divergent区間を短く保つ、warp-vote intrinsicsで作業を集約する等)の効果はどの程度定量化されているか。 ## 関連 - [[@2025__OReilly__AI Systems Performance Engineering - Chapter 8 Occupancy Tuning, Warp Efficiency, and Instruction-Level Parallelism]] - [[Occupancy (GPU)]] - [[Instruction-Level Parallelism (GPU)]] - [[wiki/entities/AI Systems Performance Engineering|AI Systems Performance Engineering]] ## 出典 - Chris Fregly, *AI Systems Performance Engineering*, O'Reilly Media, 2025, Chapter 8「Occupancy Tuning, Warp Efficiency, and Instruction-Level Parallelism」.