SOAR 周冠军笔记 06| FlashSALA:Marlin GEMM 内核调优与 W4A16 推理优化实践
编者按·调优与极限
本周 SOAR 2026 周赛的赛场上,FlashSALA 凭借对 Marlin 内核的系统性调优斩获周冠军。本次技术分享围绕 SGLang 框架下的 Marlin GEMM 内核优化展开,从默认通用配置的细粒度适配出发,针对不同 M×N 矩阵设计多档位 tile 配置,并对流水线深度、线程块数量等参数进行了系统性实验。同时,他还针对 decode 阶段的 atomic_add 路径进行了优化。通过对共享内存、寄存器及线程配置等方面的细致调优,使 W4A16 GPTQ 推理场景下的内核性能更加接近带宽利用率的理论极限。这篇复盘为大模型推理优化开发者提供了务实的调优参考,也印证了:高性能推理的突破,离不开对内核细节的极致打磨。
以下是作者分享原文。
很高兴能拿下本周周冠军。这篇文章分享一下我在 Marlin GEMM 内核调优方面的工作。
01 背景:Marlin 是 SGLang 中用于 W4A16 GPTQ 量化推理的核心 GEMM 内核。它通过异步流水线预取和精巧的数据打包布局,在小 batch 下能达到接近理论极限的带宽利用率,非常适合 decode 阶段的 memory-bound 场景。但 Marlin 的默认线程配置是面向通用场景设计的,没有针对具体模型的矩阵形状做细粒度适配。:02 调优方向:Marlin 内核有几个关键的编译期和运行时参数会影响性能:流水线深、每个 SM 的线程块数以及tile 的形状。这些参数共同决定了共享内存用量、寄存器压力和计算并行度。我对这几个维度都做了系统性的实验探索。:03 分场景 tile 选择:原始 Marlin 的 determine_exec_config 只区分大 batch 和小 batch 两种情况,但实际推理中 M 值的范围很广,且不同线性层的 N 维度也差异很大。:我的做法是将 tile 选择拆分为多个档位,为每个档位分别定义优先级排序的候选 tile 配置表。核心思路是 decode 阶段 K 方向更长,倾向于在 K 方向展开更多以提高带宽利用率;prefill 阶段 batch 较大,则侧重 N 方向的并行展开。同时每种配置都需要验证共享内存不超限、K 和 N 可被整除等约束条件。:经过大量对比实验,最终为不同 M×N 组合找到了各自最优的 tile 配置。:04 Decode 路径 Atomic Add 优化:Marlin 原始实现中,多个线程块在 N 维度上并行计算后需要归约到最终结果。原始逻辑通过一个基于 N 维度阈值的判断来决定是否使用 atomic_add 归约,即只有当 ceil(M/64) × N ≤ 16384 时才走 atomic_add 路径,否则退回 barrier 同步。:但在M 较小时,barrier 同步的串行等待开销反而成为瓶颈。我修改了判定逻辑,让M较小时无条件走 atomic_add 路径,消除了不必要的同步开销。:致谢:感谢 SOAR 2026 组委会和 SGLang 团队的开源工作。Marlin 内核调优是从共享内存、寄存器到线程配置的精细工程,需要反复实验验证。比赛还在继续,祝大家都能做出更好的成绩!
作者介绍:李晓辰:在校学生,专注大语言模型推理系统优化,熟悉vLLM/SGLang 等主流推理框架,曾在某大厂实习,在模型精度量化、KV Cache 压缩策略等方面有丰富实战经验。:需要声明一下,由于团队成员变更,我创建了一个新的队伍,“智算一队”榜上成绩取消。:🌟 OpenBMB 社区的小伙伴们:SOAR 2026 稀疏算子加速大奖赛正火热进行中,每周都有新挑战,实时榜单虚位以待 。如果你想在模型推理加速、算子级优化、量化技术上展示你的技术实力 ,我们诚挚邀请你入场参赛,与曹议及更多优秀的小伙伴同台竞技,共同挑战 MiniCPM-SALA 的推理极限!点击下图或访问大赛官网 *https://soar.openbmb.cn/*了解更多。