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

llama.cpp b11635回退x86 FP16→FP32的F16C路径,恢复查找表以避开内核减速

llama.cpp发布构建b11635,其中ggml-cpu在x86上重新对FP16→FP32转换使用查找表,仅保留FP32→FP16走F16C。提交信息称,Clang 20.1.8会把该intrinsic降级为并入累加器寄存器的vpinsrw,串行化循环,实测Q8_0/Q4_0 MUL_MAT_ID内核慢 45%–65%。

AI解读:这次改动的适用条件很具体:仅针对x86平台上FP16→FP32的标量转换,FP32→FP16仍然使用F16C,不受影响。

提交者给出的触发条件是编译器:在Clang 20.1.8下,F16C的FP16→FP32 intrinsic被降级为vpinsrw指令,合并进量化点积的活跃累加器寄存器,使循环串行化。

提交信息给出的量化数字是:估计每次迭代 19 个周期对 4 个周期,实测Q8_0与Q4_0的MUL_MAT_ID内核慢 45%–65%。这些是提交者自己的估算与测量,来源未提供第三方复现。

被回退的上游改动是 #30270,它原本让两种标量转换都走F16C;b11635恢复FP16→FP32的查找表,并按评审意见将F16C的FP16→FP32宏改为注释而非删除。

该版本同时发布了macOS/iOS、Linux、Android、Windows等多平台预编译包,涵盖CPU、CUDA 12/13、Vulkan、ROCm 10.0、SYCL、OpenVINO等后端,但这些属于常规发布产物,来源未给出与本次修复相关的性能数据。

llama.cpp发布构建b11635。该版本在ggml-cpu中把x86上FP16→FP32的标量转换改回使用查找表,FP32→FP16则按原计划保留F16C。

提交说明称,此前 #30270 让两种标量转换都走F16C。对于FP16→FP32,Clang 20.1.8会把该intrinsic降级为vpinsrw,并合并进量化点积正在使用的累加器寄存器,导致循环串行化。

提交给出的估算为每次迭代 19 个周期对 4 个周期,实测Q8_0与Q4_0的MUL_MAT_ID内核慢 45%–65%。这些数字来自提交者自己的估算和测量。

按评审意见,代码没有直接删除F16C的FP16→FP32宏定义,而是将其注释掉。

b11635同时提供macOS/iOS、Linux、Android、Windows等平台的预编译产物,覆盖CPU、CUDA 12/13、Vulkan、ROCm 10.0、SYCL、OpenVINO、Snapdragon(CPU、Adreno GPU、Hexagon NPU)等构建配置。来源未给出与本次修复相关的各平台性能数据。

信息来源

llama.cpp Releases原始来源