对于使用 CUDA 运行或验证本地语言模型的开发者,此次修复解决了部分计算可能过早覆盖其他任务仍在读取的内存的问题。开发者报告称,用于检测操作顺序冲突的检查工具不再发出警告,此次变更的意义在于计算顺序的安全性,而非速度提升。
1. 问题所在
2026年10月19日发布的 llama.cpp b11724 是包含此修复的预发布版本。修复对象是 CUDA 的向量式 flash attention 内核,即在 GPU 上执行注意力计算的代码。
问题出在将计算出的分数存入共享内存后,在下一次迭代中复用同一空间的过程中。这就像共用一本记事本,有人还没读完,另一个人就用新内容覆盖了它。开发者将其描述为读后写竞争。
2. 修复方式
补丁在循环末尾增加了 warp 级同步。warp 是一组线程,lane 是其中的单个执行单元,这一同步让下一次覆盖等待同组的读取完成。
ggml_cuda_syncwarp(); // Needed for KQ synchronization.以上代码原样展示了补丁新增的一行。开发者解释,相关读写都发生在同一组线程内,因此这一范围的同步就已足够。这是内核内部的变更,而非修改用户配置的示例。
3. 验证结果与范围
开发者基于提交 e467e5b,使用 RTX 3090 进行了验证。
GPU 架构为 sm_86,NVIDIA 驱动版本为 610.43.03。
竞争检查针对的运算与下述正确性检查相同,具体配置为 hsk=256 和 nb=1。
在这些条件下,用于检测内存访问顺序冲突的 racecheck 警告从修复前的 8,007,424 条降至修复后的 0 条。
正确性检查中选定的 38 项在修复前后均通过。修复后,完整的 FLASH_ATTN_EXT 正确性检查也通过了 3,993 项中的 3,993 项。未提供修复前的完整检查结果。作者补充称,未观察到该竞争导致错误输出的案例。
4. 预期效果与待明确之处
收益是保证复用共享内存时的读写顺序,代价是增加了线程之间的等待点。不过,公开资料未提供性能变化数据,因此不应将这种等待解读为实际速度下降,也不应将警告减少理解为吞吐量提升。
判断是否适用时,应先确认当前使用的执行路径是否属于修复范围。公开验证仅限于前述硬件和配置,未提供其他硬件或 CUDA 以外执行路径的验证结果。
此次修复并非承诺改善输出,而是一项纠正 CUDA 共享内存复用顺序、消除检查警告的稳定性补丁。
