01
什么是算子:从数学函数到计算图中的基本单元
算子的定义与分类(计算密集型 vs 访存密集型)
基础概念分类
02
计算图与执行模式
静态图与动态图的区别,算子作为计算图的节点
计算图框架
03
为什么需要融合
冯·诺依曼瓶颈与内存墙问题,访存开销远大于计算开销
硬件性能
04
融合的本质
减少Kernel Launch次数与减少中间结果读写,将多个算子合并为一个Kernel
核心思想Kernel
05
第一个融合案例
逐元素加法与ReLU的融合,手动实现一个简单的FusedKernel
动手实践CUDA
06
水平融合与垂直融合
同层级算子的合并与流水线相邻算子的合并
策略模式
07
TVM与Ansor中的算子融合
TVM的融合规则(Injective, Reduction, Complex-out-fusable)
编译器TVM
08
XLA的融合策略
HLO Op融合,Layout Assignment与融合后的代码生成
XLATPU
09
Triton中的融合
Triton语言如何通过Triton Kernel实现融合,Mask与Block-Level编程
TritonBlock
10
FlashAttention中的融合
Attention计算中的QKV投影、Score计算、Softmax、加权求和的全融合
Attention高效
11
融合与并行性的权衡
融合后可能降低并行度,如何平衡计算密度与并行效率
优化并行
12
访存优化与Tile Size
融合后如何选择Tile大小以最大化L1/L2缓存命中率
缓存调优
13
自动融合与手动融合
编译器自动融合的局限性,手动融合在特定场景下的优势
自动手动
14
融合中的数值精度问题
融合后中间结果精度丢失,FP16/BF16混合精度下的融合注意事项
精度混合精度
15
融合与算子库的配合
cuDNN/cuBLAS中的融合API(如cuBLASLt),何时用库何时自己写融合
库cuDNN
16
多级融合策略
从L1缓存到全局内存的多级融合,减少不同层级的数据搬运
层次内存
17
融合在Transformer中的应用
LayerNorm + Residual + Dropout的融合,FFN中的GELU融合
TransformerNLP
18
融合在卷积网络中的应用
Conv + BN + ReLU的融合,Winograd与Im2Col中的融合
CNN视觉
19
融合在RNN/LSTM中的应用
Gate计算与激活函数的融合,序列维度上的融合
RNN序列
20
融合在GNN中的应用
消息传递与聚合的融合,Scatter与Gather的融合
GNN图
21
融合在推荐系统中的应用
Embedding Lookup与MLP的融合,特征交叉的融合
推荐Embedding
22
融合在图像处理中的应用
颜色空间转换与滤波的融合,Resize与Normalize的融合
图像预处理
23
融合在科学计算中的应用
Stencil计算中的多点融合,FDTD中的时间步融合
科学计算Stencil
24
融合在数据库与SQL引擎中的应用
Filter + Projection + Aggregation的融合,谓词下推与融合
数据库SQL
25
融合在边缘设备上的挑战
内存带宽更低,如何设计轻量级融合策略
边缘轻量
26
融合与量化感知训练
QAT中的融合,FakeQuant与算子的联合优化
量化QAT
27
融合的Profiling与调试
如何用Nsight/NVTX分析融合前后的性能差异,融合Kernel的调试技巧
ProfilingNsight
28
融合的编译器实现
从IR层面到CodeGen的融合Pass实现,以MLIR为例
MLIRPass
29
融合的未来趋势
动态融合、Just-in-Time Fusion、硬件感知的融合搜索
趋势JIT
30
综合实战:从零实现一个简单的融合编译器
将三个算子融合为一个CUDA Kernel
实战CUDA编译器