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

llama.cpp b11184为Metal新增宽块FWHT内核,覆盖 1024 到 8192

新内核kernel_fwht_tg每个线程组处理一行、256 线程各保留N/256个值;64 到 512 的宽度继续走原有simdgroup内核,M5 Pro上MUL_MAT_HADAMARD 26/26、MUL_MAT 1265/1265全部通过。

AI解读:这条更新解决的是Metal后端FWHT(Hadamard变换)在块宽度超过 512 时无法用现有内核覆盖的问题。原来一个simdgroup处理一行、每lane保留N/32个值,宽度再大寄存器就不够用了,所以 1024 到 8192 的块此前没有对应实现。新内核换了并行切分方式,让更宽的块也能在Apple GPU上跑起来。

直接受影响的是在Apple芯片上跑涉及Hadamard变换量化格式的llama.cpp用户,尤其是用到较宽块的模型。技术上这次只补齐了覆盖范围:64 到 512 仍走老内核,1024 到 8192 同时支持F32和F16输入,没有宣称速度提升。

新内核有个硬件约束值得注意。它按float[N] 分配线程组内存,8192 宽时要 32 KB,因此代码会读取设备上限,放不下的宽度直接报为不支持,避免设备先接受操作、再在空pipeline上崩溃。作者给出的验证只有M5 Pro上的后端算子测试结果。

llama.cpp发布b11184版本,其中一项改动是为Metal后端加入宽块FWHT内核,覆盖块宽度 1024 到 8192(PR #29095)。原Metal FWHT只覆盖 64 到 512 的宽度,采用一行一个simdgroup、每lane保留N/32个值的布局;更宽的块需要的每lane寄存器数超过该布局可承受范围。

新内核kernel_fwht_tg改为一行一个线程组、共 256 个线程,每个线程保留N/256个值。simdgroup宽度以下的蝶形运算仍走shuffle,到线程组宽度之间的部分经过线程组内存,其余留在寄存器中;蝶形与符号约定与simdgroup内核一致。

宽度 64 到 512 继续使用simdgroup内核;1024 到 8192 使用新内核,F32与F16源均支持。宽内核按float[N] 分配线程组内存,8192 宽时为 32 KB,因此尺寸检查会读取设备上限,对放不下的宽度报告为不支持。改动说明指出,如果没有这项检查,线程组内存较小的设备会先接受该操作,然后在空pipeline上中止。

作者在M5 Pro上运行test-backend-ops的结果为:MUL_MAT_HADAMARD 26/26,MUL_MAT 1265/1265。提交说明中标注还有待办事项(add TODOs)。该PR的Co-authored-by为Georgi Gerganov。

随版本发布的预编译产物覆盖macOS/iOS(Apple Silicon arm64、Intel x64、iOS XCFramework)、Linux(Ubuntu x64与arm64的CPU、Vulkan、CUDA 12.8、CUDA 13.4、ROCm 10.0、OpenVINO 2026.4、SYCL FP32/FP16,以及Linux arm64 Snapdragon的CPU、Adreno GPU、Hexagon NPU)、Android arm64、Windows(CPU、CUDA 12.4/13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0、OpenCL Adreno)和UI包。其中macOS Apple Silicon的KleidiAI启用版和openEuler相关产物标注为DISABLED。

信息来源

llama.cpp Releases原始来源