19. Operator Fusion Introduction | Operator Fusion Introduction
难度: Medium | 标签: Operator Fusion, Compiler, Performance | 目标人群: 准备进入 Chapter 3 的学习者
这一页先讲清楚:为什么要把多个算子合在一起做。核心是减少中间结果读写,提高整体吞吐。
前置关系
- Chapter 3 会直接进入融合算子和编译优化
- 先建立“减少搬运比单点提速更重要”的思维
你应该先建立的直觉
1. 算子之间的中间结果很贵
一个算子做完以后,结果通常要:
- 写回内存
- 再被下一个算子读出来
这种来回读写在 GPU 上很容易成为隐性成本。
所以融合的第一价值,就是少做一次中间结果落地。
2. 融合的核心不是“把代码写得更长”,而是减少中间结果的读写成本
算子融合真正想做的是:
- 减少内存往返
- 提高数据局部性
- 让多个步骤在一次执行里完成
所以它关注的是“组织方式”,不是“把代码堆在一起”。
3. 不是所有算子都适合融合
融合也有边界:
- 依赖关系太复杂时不适合硬融
- 数据形状差异太大时不一定划算
- 有些算子融合后会增加实现复杂度
所以判断“能不能融、值不值得融”本身就是工程能力。
一个最常见的理解路径
text
算子 A -> 写中间结果 -> 算子 B 读取 -> 再继续计算如果能改成:
text
算子 A 和 B 在一次执行中连续完成 -> 少一次中间读写 -> 更高吞吐你就已经抓住了算子融合的核心意义。
常见误区
- 以为融合就是“把功能写到一起”
- 只看算子数量,不看中间结果成本
- 以为所有算子都应该尽量融合
- 忽略可维护性和实现复杂度
这一页学完后,你应该能回答
- 为什么算子融合能提升性能
- 为什么中间结果读写是隐性成本
- 为什么融合不是越多越好
- 为什么 Chapter 3 的编译优化要关心算子边界
和后续章节的联系
Chapter 3: 融合算子实现
你会看到哪些算子适合融合,怎么融合Chapter 3: 编译器优化
你会看到编译器如何自动做部分融合和重排Chapter 3: Triton / CUDA
你会看到内核级实现如何支撑融合
小结
这一页的作用很简单:
- 先让你知道为什么中间结果贵
- 再让你知道融合为什么有用
- 最后让你知道为什么 Chapter 3 要谈算子融合
如果你已经能把“减少中间读写”看成优化目标,这一页的目标基本达成。
