news 2026/8/15 23:29:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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,后续章更新更好找。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 23:26:20

04-人脸对齐与ArcFace识别

人脸对齐与 ArcFace 识别:Umeyama、112112 与余弦阈值 本文讲透一件事:检测到的五点如何变成标准脸,标准脸如何变成可比较的向量,向量如何用余弦相似度判定「是不是同一个人」。对齐核心是 Umeyama 相似变换与 kRef5 模板&#xf…

作者头像 李华
网站建设 2026/8/15 23:22:02

告别双电机“较劲”,MOTEC主从控制模式让驱动“完美”同步。

在轨道巡检机器人、AGV、助爬器等众多自动化设备中,双电机共同驱动同一刚性负载的场景十分普遍。然而,这种结构长期面临一个棘手难题:两台电机和驱动器之间缺乏有效协调,即使微小的速度差或力矩分配不均,也会导致电机互…

作者头像 李华
网站建设 2026/8/15 23:20:08

MySQL安全配置:secure-file-priv原理、配置与实战指南

1. 项目概述:理解secure-file-priv的来龙去脉如果你在 MySQL 里尝试执行SELECT ... INTO OUTFILE /tmp/result.csv或者使用LOAD DATA INFILE命令时,突然蹦出来一个错误:“ERROR 1290 (HY000): The MySQL server is running with the --secure…

作者头像 李华
网站建设 2026/8/15 22:58:03

做弱电十年,筛选长期合作一级代理商核心条件

长期做弱电集成的同行都清楚,稳定供货渠道直接决定项目交付效率、投标通过率。筛选可长期合作的网络设备一级代理,不能只看单次报价,五大硬性标准缺一不可,今天结合多年项目经验逐条拆解。 第一条:持有品牌当期盖章一级…

作者头像 李华
网站建设 2026/8/15 22:57:27

ARM Cortex-A/R/M内核深度解析:从架构差异到实战选型指南

1. 项目概述:为什么需要区分Cortex-A、R、M?如果你刚开始接触嵌入式或者物联网开发,面对琳琅满目的芯片型号,比如STM32F103、i.MX6ULL、Raspberry Pi的BCM2711,可能会感到一头雾水。它们都基于ARM架构,但性…

作者头像 李华
网站建设 2026/8/15 22:55:14

基于Python与AI的邮件日程自动化助手:从零构建智能联动原型

在实际工作中,日程安排和邮件沟通是两项高频且容易相互割裂的任务。我们常常需要手动从邮件中提取会议邀请、任务截止日期等信息,再录入到日历中,或者反过来,将日程安排通过邮件发送给同事。这个过程不仅繁琐,还容易出…

作者头像 李华