複数の独立した GPU カーネルを単一のカーネルに統合する最適化技術。ループフュージョンの GPU 版に相当するが、カーネルの起動境界でグローバルメモリが暗黙的に同期される点がループフュージョンと本質的に異なる。 ## 定義 GPU プログラムは通常、複数のカーネルを順次起動する。各カーネル起動の境界ではグローバルメモリが暗黙的に同期され、中間結果が一旦デバイスメモリに書き出される。カーネルフュージョンはこの中間書き出しを排除し、データをレジスタまたはシェアードメモリ上で次の処理ステージに直接渡す。 **フュージョンの三方式**(Wang ほか [378] による分類): 1. **inner thread 方式**: 各スレッドが両カーネルの処理を担当。スレッドブロックとグリッドサイズが一致する必要がある 2. **inner thread block 方式**: 各スレッドブロックが両カーネルを順次処理。スレッドブロック間の独立性が必要 3. **inter thread block 方式**: ブロック番号に基づいて処理を振り分け ## 主な効果 - **グローバルメモリ帯域幅削減**: 同一データを扱う複数カーネルの中間書き出しを排除(最も普及した理由) - **キャッシュ効果向上**: データがキャッシュ/レジスタ上に留まる - **カーネル起動オーバーヘッド削減**: 起動回数を減らす - **データ再利用の向上**: 中間結果をレジスタ経由で渡す場合、同一スレッドがデータを保持し続ける ## トレードオフ・制約 - **レジスタ圧力増大**: フューズされたカーネルはより多くのレジスタを消費し、オキュパンシーが低下する可能性がある - **スレッドマッピング制約**: 2 カーネルが同一スレッド数でない場合、一方をシリアライズしてフュージョンするトレードオフが生じる - **グローバル同期不要の場合のみ適用可能**: フューズする 2 カーネルが異なるスレッドブロック間の同期を必要とする場合、通常のフュージョンは不可(ブロック間同期技術が必要) - **「fusibility」の判定**: 中間結果をレジスタで渡すには同一スレッドマッピングが必要。シェアードメモリ経由ならブロックマッピングが一致すれば可 ## 横断的知見 - **LLM 推論の中核技術**: Flash Attention(Dao ほか 2022)はソフトマックス計算とアテンション行列積を単一カーネルに統合したカーネルフュージョンの代表例であり、HBM 往復を削減することで大幅な高速化を実現する。GPU 最適化の古典的技術が深層学習推論で再発見されている形態といえる - **10〜17% の性能向上がグラフアルゴリズムで報告**: Liu ほか(2019)はグラフアルゴリズムで Kepler 2012 で 10〜74% の改善を報告するが、13% の低下も記録。全メモリ集約的アプリケーションでフュージョンが効果的だが、文脈依存性が高い([[@2023__CSUR__Optimization Techniques for GPU Programming]] §A.1.8) - **カーネル分割(Kernel Fission)と双対**: 大型カーネルをより単純な小カーネルに分割するカーネル分割は、フュージョンとは逆方向の最適化であり、規則性向上・auto-tuning 適用性向上の目的で使われる。どちらを選ぶかはカーネルの複雑性・データ共有パターン・レジスタ圧力によって異なる ## 未解決の問い - Flash Attention のようなカーネルフュージョンは手動で設計されているが、コンパイラによる自動フュージョンがどこまで可能か - 3 個以上のカーネルを同時にフュージョンする場合の最適な分割点はどう決定するか - Hopper の Non-Coherent MicroBenchmarks や Tensor Memory Accelerator (TMA) はカーネルフュージョンのトレードオフをどう変えるか