GEMM
GEMM(General Matrix-Matrix Multiplication,通用矩阵乘法)是大语言模型中线性层、注意力投影与 MoE 专家计算的核心算子。模型的大部分参数都参与 GEMM,因此它往往决定推理的计算吞吐、显存带宽利用率与低精度加速效果。
本文先建立 GEMM 的计算模型,再从执行方式、稀疏性和实现生态三个相互独立的维度组织相关概念。
1. 计算模型
1.1 M、N、K
BLAS 将 GEMM 定义为:
其中:
; ; ; 表示 或 ; 、 是缩放系数。
1.2 线性层映射
深度学习框架通常将线性层权重保存为
这里的
Transformer 中常见的映射包括:
| 模块 | 输入形状 | 权重形状 | 输出形状 |
|---|---|---|---|
| Q、K、V、O 投影 | |||
| MLP Gate、Up 投影 | |||
| MLP Down 投影 | |||
| LM Head |
其中
2. 推理工作负载
2.1 Prefill
Prefill 一次处理提示词中的多个 Token,连续批处理还可能将多个请求拼接在同一轮中,因此
2.2 Decode
Decode 阶段每个请求通常只生成一个新 Token,但调度器可以把多个活跃请求合并到同一轮,所以 GEMM 的
因此,“Prefill 使用 GEMM、Decode 使用 GEMV”只能作为单请求场景下的直觉,不能作为服务系统中的严格划分。
2.3 MoE
MoE 路由会把 Token 分配给不同专家。第
各专家的
3. 执行方式
Single、Batched 与 Grouped GEMM 使用相同的矩阵乘法定义,但一次接口调用提交的问题数量和参数组织方式不同:
| 执行方式 | 问题数量 | 形状与参数 | 典型场景 |
|---|---|---|---|
| Single GEMM | 1 | 一组固定参数 | 普通线性层 |
| Batched GEMM | 多个 | 通常共享参数 | 规则的小矩阵批次 |
| Grouped GEMM | 多个 | 可以不同,约束取决于接口 | MoE 专家计算 |
三者的数学关系、cuBLAS 示例接口,以及 Grouped GEMM 的 Top-2 MoE、Packed 布局和 SGLang/DeepGEMM 实现见 GEMM 执行方式。
4. 稀疏性
稀疏性与执行方式是两个正交维度:单 GEMM、Batched GEMM 和 Grouped GEMM 都可以继续区分为稠密或稀疏计算。
4.1 Dense GEMM
Dense GEMM 按稠密矩阵参与计算,不根据元素值跳过乘加。即使权重中恰好存在零值,只要没有使用稀疏格式和对应的 Sparse Kernel,它仍会消耗普通乘加指令与存储带宽。
Dense GEMM 接口成熟、适用形状广,是当前 LLM 线性层的基础路径。量化会改变输入、权重、累加器和输出的数据类型,但不会自动把 Dense GEMM 变成 Sparse GEMM。
4.2 Sparse GEMM
Sparse GEMM 利用矩阵中的非零模式减少存储或计算,可分为:
- 非结构化稀疏:非零位置任意,需要索引或压缩格式描述;
- 结构化稀疏:在固定分组内满足规定模式,硬件更容易高效执行。
NVIDIA Sparse Tensor Core 支持的 2:4 结构化稀疏要求每四个元素中保留两个非零值。使用时不仅需要权重中出现零值,还要完成剪枝、压缩,并由支持该模式的 Kernel 读取元数据。cuSPARSELt 提供了相关的矩阵乘法、剪枝、压缩与 Epilogue 接口。
稀疏指令的理论吞吐提升不等于端到端同比加速,实际结果还取决于压缩开销、元数据访问、矩阵形状和非 GEMM 算子的占比。底层稠密与稀疏 MMA 指令可参考NVIDIA MMA。
5. Kernel 执行结构
5.1 分块矩阵乘法
为简化表达,先忽略
不同
设线程块负责一个
其中:
; ; 。
这与逐元素点积完全等价,只是重新组织了计算顺序。每轮加载
因此 Tiling 的数学目的不是减少乘加次数,而是让相同输入参与更多乘加后再离开片上存储,从而减少每次浮点运算对应的全局显存流量。
5.2 Mainloop 与 MMA
线程块先把当前的
这里的小写
矩阵 P[M, N]
└─ Thread Block Tile P[M_b, N_b]
└─ Warp Tile
└─ MMA Tile A[m, k] × B[k, n]一个线程块的 Mainloop 按以下顺序执行:
- 将累加器
初始化为零; - 加载第
组 、 Tile; - 用若干次 MMA 计算
,并累加到 ; - 沿
维遍历所有 ,得到完整的 。
多级流水和双缓冲不会改变上述数学结果,只是让第
若使用 Split-K,第
它用额外的
浮点加法不满足严格结合律。分块、流水线或 Split-K 会改变累加顺序,所以不同 Kernel 即使计算同一个数学表达式,也可能产生不完全相同的末位结果。
5.3 Epilogue
Mainloop 结束后,累加器中保存的是
其中
Epilogue 除了完成基础的
- Bias;
- 激活函数;
- 量化缩放与反量化;
- 数据类型转换;
- Clamp 等逐元素操作。
融合让中间结果直接从累加器变换为最终输出,避免先写回
6. 实现生态
cuBLAS 是预构建数学库,CUTLASS 是 Kernel 开发框架,DeepGEMM 则是面向特定架构和低精度工作负载的专用 GEMM 库。
| 实现 | 定位 | 主要特点 |
|---|---|---|
| cuBLAS / cuBLASLt | 通用数学库 | 接口稳定、覆盖广,通过启发式选择算法 |
| CUTLASS / CuTe DSL | Kernel 开发框架 | 显式组合布局、数据搬运、MMA、流水线与 Epilogue |
| DeepGEMM | 专用 GEMM 库 | 面向 Hopper、Blackwell 与低精度 GEMM,提供 MoE M-Grouped 路径 |
6.1 cuBLAS 与 cuBLASLt
cuBLAS 提供 NVIDIA GPU 上的 BLAS 实现,包括 GEMM、Batched GEMM、Strided Batched GEMM 和 Grouped Batched GEMM。cuBLASLt 以矩阵乘法为中心,提供更灵活的布局、数据类型、计算类型、算法启发式与 Epilogue 配置。
应用通常描述问题并让库选择候选算法,适合需要广泛硬件和形状覆盖的通用路径。其代价是调用者对 Kernel 内部流水线和数据布局的控制相对有限。
6.2 CUTLASS 与 CuTe DSL
CUTLASS 提供构建高性能 CUDA Kernel 的 C++ 模板组件,并在同一生态中提供基于 Python 的 CuTe DSL。二者都允许开发者表达 Tensor Layout、Tiled Copy、Tiled MMA、流水线和 Epilogue;CuTe DSL 侧重以 Python 语法生成并 JIT 编译特定 Kernel。
因此,CuTe DSL 不宜与 DeepGEMM 并列为同一种“实现库”:它是 CUTLASS 生态中的 Kernel 编程方式,而 DeepGEMM 是可以被推理框架直接集成的专用算子库。CUTLASS 还提供 Operator API,用于发现、编译和执行预定义算子。
6.3 DeepGEMM
DeepGEMM 面向 NVIDIA Hopper 与 Blackwell GPU,提供普通 Dense GEMM,以及为 MoE 设计的 M-Grouped GEMM。M-Grouped 接口包含两种常见数据组织:
- Contiguous:将各专家 Token 连续拼接,并用专家索引标识每一行,适合 Token 数量动态变化的 Prefill 或训练;
- Masked:为每个专家预留固定上限,通过 Mask 指定有效行数,便于 Decode 场景复用 CUDA Graph。
SGLang 的本地实现同时封装了普通 FP8/BF16 GEMM,以及 Contiguous、Masked 两类 Grouped GEMM,并在 MoE Runner 中根据执行路径调用对应接口。这说明 DeepGEMM 不是“Grouped GEMM”的同义词,而是同时实现多种 GEMM 执行方式的一个具体后端。MoE 路由与 M-Grouped 接口的完整数据流见 GEMM 执行方式。
7. 性能边界
7.1 算术强度
若暂时忽略缓存、量化 Scale、稀疏元数据与
其中
较大的
7.2 形状与调度
相同 FLOPs 的 GEMM 可能具有完全不同的性能,主要影响因素包括:
是否与硬件 Tile 和对齐要求匹配; - 输入布局、转置方式与内存连续性;
- 数据类型、累加类型和量化粒度;
- Thread Block 数量能否充分占用 GPU;
- Grouped GEMM 中各问题的负载是否均衡;
- Epilogue 融合收益是否超过额外资源开销;
- Split-K 等并行策略是否引入过多归约成本。
因此不存在对所有模型、批量和 GPU 都最优的单一实现。推理框架通常依据硬件架构、形状、数据类型、布局和是否启用 CUDA Graph 进行 Dispatch,并通过 Benchmark 或启发式选择 Kernel。
8. 参考
- Netlib, Basic Linear Algebra Subprograms
- NVIDIA cuBLAS, GEMM、Strided Batched GEMM、Grouped Batched GEMM
- NVIDIA, cuSPARSELt Documentation
- NVIDIA, CUTLASS Efficient GEMM
- NVIDIA, CuTe DSL Overview
- DeepSeek-AI, DeepGEMM
- SGLang, DeepGEMM Wrapper;DeepGEMM MoE Runner;DeepEP Dispatcher;EP Scatter/Gather