开源llama.cpp Releases·原文 2026年10月26日

llama.cpp b11879:CUDA在MMQ中融合FFN gate/up矩阵乘与GLU

该版本针对prompt处理阶段,把稠密FFN的gate与up两次matmul合并为一次mul_mat_q启动,并在写回时计算GLU;适用于NVIDIA Turing及更新架构上的Q4_K、Q5_K、Q6_K、Q8_0和IQ4_XS。

AI解读:具体做法是:loader接收gate权重作为第二个指针,把up与gate行按 8 行一组交错填入权重tile,使每个线程同时持有up值和对应的gate值;MMA循环本身不变,融合写回在寄存器中计算GLU并只写一半行。

融合路径使用常规tiling(不用stream-k),列tile放在最内层,以便相邻block共享权重tile;该路径要求tiling高效且无fallback。

支持的数据类型为Q4_K、Q5_K、Q6_K、Q8_0和IQ4_XS,硬件范围为NVIDIA Turing及更新架构。

提交信息称测试覆盖每种类型和GLU操作的融合gate/up MMQ用例;来源未给出性能提升数据,融合收益不能量化。

该版本同时提供macOS、Linux、Windows、Android等多平台预编译包,其中openEuler与macOS KleidiAI构建标注为DISABLED。

llama.cpp发布b11879版本,CUDA后端新增一项针对prompt处理阶段的融合:把稠密FFN的gate和up两次矩阵乘作为一次mul_mat_q启动,并在写回阶段应用GLU(提交 #29948)。

提交说明给出的适用范围是NVIDIA Turing及更新架构,支持Q4_K、Q5_K、Q6_K、Q8_0和IQ4_XS五种量化类型。

融合如何实现

按提交描述,loader把gate权重作为第二个指针读入,将权重tile中的up行与gate行按每 8 行一组交错排列,使每个线程同时持有一个up值和与之匹配的gate值(即一个MMA tile中的第r行和第r+8行)。

MMA主循环保持不变:相同的tile、warp布局、vec_dot,以及每个线程一份sum[]。变化在写回:融合写回直接从寄存器计算GLU,并写出原行数的一半。

  • 融合路径采用常规tiling,不使用stream-k。
  • 列tile被放在最内层,使相邻block能共享权重tile。
  • 融合仅在tiling高效且不触发fallback时启用。
  • 提交要求显式传入has_fusion,并移除了原先仅针对融合路径的src1精度检查。

测试与构建

提交信息称,测试为每种数据类型和GLU操作各增加了一个融合gate/up MMQ用例。来源没有公布吞吐、延迟或显存占用的对比数据,因此融合带来的实际性能变化无法从该发布说明中得出。

b11879同时发布了macOS(Apple Silicon arm64、Intel x64)、Linux(Ubuntu x64/arm64/s390x、CUDA 12.8/13.4、ROCm 10.0、Vulkan、SYCL、OpenVINO)、Windows、Android等平台的预编译包与UI包。macOS arm64的KleidiAI构建和openEuler构建在发布页标注为DISABLED。

信息来源

llama.cpp Releases原始来源

更多

新闻专题
外观