C-05. Kernel Fusion 代价边界:少写回 vs 寄存器压力与 occupancy
C-04 钉死少同步点不等于该 fuse。本章回答垂直融合何时省 GMEM 真赚、何时寄存器/occupancy 把收益吃掉。本机瘦融合随链长3.9×→9.8×fat把 occupancy 6→1相对瘦融合慢8×。配套可复现Yapeng-Gao/AI-System-Performance-Lab文章 .cu 实测表。有用请 Star。 本章示例examples/03_compute_primitives/05_kernel_fusion.cu。TL;DR工程结论口径RTX 5090 /sm_120CUDA eventmedian整条链一包。完整表见docs/results/C-05_kernel_fusion.md。短 elementwise 链该垂直 fusefused/naivek2…8 →3.87×→9.81×fused 墙钟几乎平坦~0.08 msnaive 随 k 涨——主收益是少 GMEM 往返。fuse 也可能更慢fatFAT_TEMPS48occupancy6→1fat/fused8.01×更慢甚至慢于 naive——寄存器压力悬崖成立。两轴一起看瘦融合与 stage 同为6 blocks/SM不靠抬 occupancy 赚钱fat 必须看 occupancy 墙钟。可维护性也是代价短链手写长链先看编译器→ E。判停sweep的加速比随 k 抬升modes的fat/fused1。禁止把 ncu 附着墙钟当结论。1. 问题少 launch 之后还该不该 fuse问题本章交付多核点式链有多贵naive中间写 global垂直融合能赚多少fusedsweepvsk寄存器压力怎么翻车fat定点 occupancy和 Graph/launch一句钩子 → C-06边界章节已覆盖本章不重复C-04sync 分层不重测空同步C-06launch / Graph不拆 host launchModule DSoftmax / GEMM epilogue不做生产算子融合Module Etorch.compile不做框架自动融合正文左每级写回 GMEM。中单核寄存器直通。右fat 人为堆 live 临时occupancy 可能掉。2. 物理模型省流量 vs 烧寄存器naive: x --K1-- GMEM --K2-- GMEM --K3-- y ← 多次往返 fused: x --[K1;K2;K3 in regs]-- y ← 一次写回 fat: fused 一堆 live tmp → sink压力探针收益风险少 GMEM 读写每线程 regs ↑ → occupancy ↓少 kernel launch次要spill / 难维护编译器可跨级优化过度融合难复用水平融合独立核拼一块本章不做主线见 §7。3. API / 实验形态路径做法naivek次kernel_stage双缓冲 ping-pongfused单核 fors0..k-1stage_opfat同 fused 写outC05_FAT_TEMPS个 live 累加进sink防 DCEstage_opy a_s*y b_s偶级 ReLU。计时一对 event 包住整条链。4. 决策表信号建议短点式链、大n、中间无复用需求垂直融合融合后 occupancy 明显掉、墙钟变差拆回多核或减 live 量只为少 launch先测墙钟launch 拆解 →C-06/ Graph长链 / 框架图先看编译器是否已 fuse → EGEMMepilogue→ Module D不在本章手写5. 实验怎么设计mode问题进主结论naive/fused定点时延定点fat压力探针modes 定点不进 sweepsweepk∈{2,3,4,6,8}fused/naive主曲线modes全表 occupancy写结果用./bin/03_compute_primitives_05_kernel_fusion--modesweep ./bin/03_compute_primitives_05_kernel_fusion--modemodes6. 实测RTX 5090docs/results/C-05_kernel_fusion.md。口径mediann16Mblock256。6.1 Sweepfused/naivevskknaive_msfused_msfused/naive20.3180.0823.87×30.3330.0843.99×40.4900.0835.87×60.6620.0837.94×80.8320.0859.81×fused 几乎不随 k 涨naive 近似线性——链越长少写回越赚。6.2 Modesk4含 fattagmedian_msocc_bpsm相对naive0.4916—fused0.0836fused/naive5.89×fat0.6671fat/fused8.01×更慢怎么读瘦融合不伤 occupancyfat 把 blocks/SM 打到 1 后墙钟崩盘甚至慢过 naive。7. 扩展阅读CUDA Graph / launch 墙 →C-06本章只把省 launch 当次要收益。torch.compile / Inductor 自动 fuse → Module E。水平融合 HFUSE自动 VF 库Fused Kernel Library 等→ §10-D。GEMM epilogue / FlashAttention 类融合 → Module D。8. 误区与 SOP误区纠正能 fuse 就一定更快看 occupancy / 墙钟跑fat对照少 kernel 主收益点式链主收益常是少 GMEMfat 是生产写法仅压力探针用 ncu 附着 ms 当下结论只信裸跑 medianSOP确认是垂直依赖的短点式链。--mode sweep看fused/naivevsk。--mode modes看fat与 occupancy。仍为 launch 墙 → C-06算子级融合 → D/E。9. 小结与下一章融合是用寄存器换流量换过头 occupancy 先崩。sweep回答赚多少fat回答怎样翻车。下一章C-06 CUDA Graph 与 launch overhead把「少 launch」这条轴单独测清——不再复读本章 elementwise 融合曲线。10. 参考文献A. 官方CUDA C Best Practices GuideMemory / OccupancyOccupancy APIcudaOccupancyMaxActiveBlocksPerMultiprocessorB. 工程NVIDIA, Kernel Fusion in NVIDIA CUDANVIDIA, Shared Memory Register SpillingCUDA 13寄存器阶跃 / spill 工程笔记occupancy 阈值C. 实证Filipovič et al., arXiv:1305.1183fusion on BLASoccupancy 可拖慢本仓库C-05_kernel_fusion.md5090 主结论C-04phases≈1 ——「少同步/少 launch 不自动更快」同族D. 前沿 / 扩展arXiv:2508.07071 Fused Kernel LibraryHFUSE / MCFuser / FlashFuser 等torch.compile / Inductor → Module E本文配套代码与实测AI-System-Performance-Lab。觉得有用请 Star后续章更新更好找。