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

llama.cpp b11047修复CUDA后端CUB argsort原地键导致的索引损坏

该版本针对argsort_f32_i32_cuda_cub在d_keys_in == d_keys_out时调用CUB SortPairs引发的内存别名问题,改为使用独立输出缓冲区,覆盖全部六个调用点。

AI解读:CUB的DeviceRadixSort::SortPairs内部靠双缓冲乒乓操作,要求键的输入和输出是两个不同缓冲区。原地复用会让排序在一趟中途覆盖自己的输入,吐出错误的排列结果,表现为偶发的垃圾索引。

具体触发场景是Maxwell架构、CUDA 12.5、CCCL 2.x下对 248k列词表做后端top_k,随后在下游get_rows里引发越界gather。修复方式是为全部六个调用点(普通与分段、升序与降序、查询大小与执行)改用独立的keys-out缓冲区。

如果你在用老Maxwell显卡跑大词表模型的top_k采样并遇到偶发乱码输出,这个版本值得升级;新架构或不用CUDA的用户不受影响。版本同时附带macOS、Linux、Windows、Android等平台的预编译包。

llama.cpp发布b11047,主要修复CUDA后端CUB argsort因原地键(in-place keys)导致的索引损坏,对应PR #28389。

问题出在argsort_f32_i32_cuda_cub调用一次性DeviceRadixSort::SortPairs API时,传入的d_keys_in与d_keys_out是同一块缓冲区(temp_keys, temp_keys)。

CUB双缓冲与原地键的冲突

CUB内部的排序依赖双缓冲乒乓操作,要求键的输入缓冲区和输出缓冲区必须是分开的。当两个指针指向同一块显存时,排序会在某一趟进行到一半时覆盖自己的输入,最终输出一个损坏的排列。

这种损坏在表面上表现为间歇性的垃圾索引。报告中提到的具体场景是:在Maxwell架构、CUDA 12.5、CCCL 2.x上,对 248k列的词表执行后端top_k,错误的索引随后在下游get_rows中触发越界gather。

修复范围与可用平台

修复方式是为全部六个调用点改用独立的keys-out缓冲区,覆盖普通与分段、升序与降序、查询大小与执行这些组合。

该版本同时提供多平台预编译包,包括macOS Apple Silicon与Intel、iOS XCFramework、Ubuntu x64/arm64/s390x以及Vulkan、CUDA 12.8、CUDA 13.3、ROCm 10.0、OpenVINO 2026.4、SYCL FP32/FP16等变体,以及Android arm64、Windows x64/arm64的CPU、CUDA、Vulkan、OpenVINO、SYCL、ROCm版本。

macOS Apple Silicon的KleidiAI加速包和openEuler相关构建被标记为DISABLED,对应PR #23780 与 #23705。

信息来源

llama.cpp Releases原始来源