当前位置: 首页 > news >正文

C-05. Kernel Fusion 代价边界:少写回 vs 寄存器压力与 occupancy

C-04 钉死:少同步点不等于该 fuse。
本章回答垂直融合何时省 GMEM 真赚、何时寄存器/occupancy 把收益吃掉。
本机:瘦融合随链长3.9×→9.8×fat把 occupancy 6→1,相对瘦融合慢

配套可复现:Yapeng-Gao/AI-System-Performance-Lab(文章 +.cu+ 实测表)。有用请 Star。 本章示例:examples/03_compute_primitives/05_kernel_fusion.cu


TL;DR(工程结论)

口径:RTX 5090 /sm_120,CUDA eventmedian(整条链一包)。完整表见docs/results/C-05_kernel_fusion.md

  1. 短 elementwise 链该垂直 fusefused/naive@k=2…8 →3.87×→9.81×;fused 墙钟几乎平坦(~0.08 ms),naive 随 k 涨——主收益是少 GMEM 往返
  2. fuse 也可能更慢fat(FAT_TEMPS=48)occupancy6→1fat/fused=8.01×(更慢),甚至慢于 naive——寄存器压力悬崖成立。
  3. 两轴一起看:瘦融合与 stage 同为6 blocks/SM(不靠抬 occupancy 赚钱);fat 必须看 occupancy + 墙钟。
  4. 可维护性也是代价:短链手写;长链先看编译器(→ E)。
  5. 判停sweep的加速比随 k 抬升;modesfat/fused>1禁止把 ncu 附着墙钟当结论。

1. 问题:少 launch 之后还该不该 fuse

问题本章交付
多核点式链有多贵?naive(中间写 global)
垂直融合能赚多少?fused+sweepvsk
寄存器压力怎么翻车?fat定点 + occupancy
和 Graph/launch?一句钩子 → C-06

边界:

章节已覆盖本章不重复
C-04sync 分层不重测空同步
C-06launch / Graph不拆 host launch
Module 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 / 实验形态

路径做法
naivekkernel_stage,双缓冲 ping-pong
fused单核 fors=0..k-1stage_op
fat同 fused 写outC05_FAT_TEMPS个 live 累加进sink防 DCE

stage_opy = a_s*y + b_s,偶级 ReLU。计时:一对 event 包住整条链


4. 决策表

信号建议
短点式链、大n、中间无复用需求垂直融合
融合后 occupancy 明显掉、墙钟变差拆回多核或减 live 量
只为少 launch先测墙钟;launch 拆解 →C-06/ Graph
长链 / 框架图先看编译器是否已 fuse → E
GEMM+epilogue→ Module D,不在本章手写

5. 实验怎么设计

mode问题进主结论?
naive/fused定点时延定点
fat压力探针modes 定点(不进 sweep)
sweepk∈{2,3,4,6,8}fused/naive主曲线
modes全表 + occupancy写结果用
./bin/03_compute_primitives_05_kernel_fusion--modesweep ./bin/03_compute_primitives_05_kernel_fusion--modemodes

6. 实测(RTX 5090)

docs/results/C-05_kernel_fusion.md。口径:median;n=16M;block=256。

6.1 Sweep:fused/naivevsk

knaive_msfused_msfused/naive
20.3180.0823.87×
30.3330.0843.99×
40.4900.0835.87×
60.6620.0837.94×
80.8320.0859.81×

fused 几乎不随 k 涨;naive 近似线性——链越长,少写回越赚。

6.2 Modes(k=4,含 fat)

tagmedian_msocc_bpsm相对
naive0.4916
fused0.0836fused/naive5.89×
fat0.6671fat/fused8.01×(更慢)

怎么读:瘦融合不伤 occupancy;fat 把 blocks/SM 打到 1 后墙钟崩盘,甚至慢过 naive。


7. 扩展阅读

  1. CUDA Graph / launch 墙 →C-06(本章只把省 launch 当次要收益)。
  2. torch.compile / Inductor 自动 fuse → Module E。
  3. 水平融合 HFUSE;自动 VF 库(Fused Kernel Library 等)→ §10-D。
  4. GEMM epilogue / FlashAttention 类融合 → Module D。

8. 误区与 SOP

误区纠正
能 fuse 就一定更快看 occupancy / 墙钟;跑fat对照
少 kernel = 主收益点式链主收益常是少 GMEM
fat 是生产写法仅压力探针
用 ncu 附着 ms 当下结论只信裸跑 median

SOP

  1. 确认是垂直依赖的短点式链。
  2. --mode sweepfused/naivevsk
  3. --mode modesfat与 occupancy。
  4. 仍为 launch 墙 → C-06;算子级融合 → D/E。

9. 小结与下一章

融合是用寄存器换流量;换过头 occupancy 先崩。
sweep回答赚多少;fat回答怎样翻车。

下一章C-06 CUDA Graph 与 launch overhead:把「少 launch」这条轴单独测清——不再复读本章 elementwise 融合曲线。


10. 参考文献

A. 官方

  1. CUDA C Best Practices Guide(Memory / Occupancy)
  2. Occupancy API:cudaOccupancyMaxActiveBlocksPerMultiprocessor

B. 工程

  1. NVIDIA, Kernel Fusion in NVIDIA CUDA
  2. NVIDIA, Shared Memory Register Spilling(CUDA 13)
  3. 寄存器阶跃 / spill 工程笔记(occupancy 阈值)

C. 实证

  1. Filipovič et al., arXiv:1305.1183(fusion on BLAS;occupancy 可拖慢)
  2. 本仓库C-05_kernel_fusion.md(5090 主结论)
  3. C-04:phases≈1 ——「少同步/少 launch 不自动更快」同族

D. 前沿 / 扩展

  1. arXiv:2508.07071 Fused Kernel Library;HFUSE / MCFuser / FlashFuser 等
  2. torch.compile / Inductor → Module E

本文配套代码与实测:AI-System-Performance-Lab。觉得有用请 Star,后续章更新更好找。

http://www.cnnetsun.cn/news/4047379.html

相关文章:

  • 04-人脸对齐与ArcFace识别
  • 告别双电机“较劲”,MOTEC主从控制模式让驱动“完美”同步。
  • MySQL安全配置:secure-file-priv原理、配置与实战指南
  • 做弱电十年,筛选长期合作一级代理商核心条件
  • ARM Cortex-A/R/M内核深度解析:从架构差异到实战选型指南
  • 基于Python与AI的邮件日程自动化助手:从零构建智能联动原型
  • AI研发框架重构Git工作流:提升67%代码审查效率
  • 第四篇 STM32MP157-M4:Makefile 完整详解
  • 【太狠了】做自媒体多平台发布太耗时?一键同步公众号、知乎、小红书8个主流平台
  • 基于MiniCPM5-1B构建本地研究智能体:从模型部署到ReAct框架实战
  • 第2章 坤•承载 二维的答案与三维的深渊
  • Git分支管理:从创建、拉取到跟踪的完整实践指南
  • MMKV原理与实战:高性能键值存储组件深度解析
  • 钉钉直播教学全流程26个常见问题解决方案与实战指南
  • Swift 常量详解:从基础语法到实战应用
  • Windows 10家庭版MySQL 8.0安装初始化无响应问题深度排查与实战部署指南
  • Dify 中级实验(13):多 Agent 协作——如何编排多个智能体分工干活?
  • PotPlayer字幕翻译插件完整上手笔记:四个动作,让外语视频当场出双语字幕
  • AI编码协作习惯检测实战:微软AI‑Engineering‑Coach部署、规则二次开发与落地踩坑
  • Java Stream核心操作精讲
  • C++文件操作全解析:从基础读写到性能优化实战
  • AI编程助手Turbo与Turbo+核心区别:从代码补全到任务协作的范式演进
  • 网络拨测与 PageSpeed 分工:通不通 vs 快不快的决策顺序
  • [通信与计算]复变函数:概念及其与通信的联系
  • Go缓存策略实战从本地缓存到Redis多级缓存
  • 00 - AI Agent 开发实战 · 课程大纲
  • PKC 第 126 个开关:隐藏 PKC的位置、验证方法与风险边界
  • 今天的表现,是多个变量共同作用后的结果。
  • 欢迎使用Markdown编辑器
  • 孤能子视角:EIS认识论分册总纲——同一认知呼吸的四次显影