llama.cpp 发布了修订版,修复了苹果设备图形运算中本应丢弃的值残留为错误计算结果的问题。对使用该运算的开发者而言,这一变化会在待丢弃的位置写入 0,使结果与其他运算后端,也就是执行运算的实现层保持一致。

1. 不再将待丢弃值相乘,而是选择 0

包含该修复的 b12220 在发布页面被标为预发布版本。相关拉取请求,即提交代码变更供审核的请求 #30711,于 2026 年 11 月 9 日获批并合并。

三角运算只保留矩阵中指定三角形内部的值,并将外部置为 0。这里的 NaN 指无法用正常数值表示的计算结果。仅仅遮蔽待丢弃位置与实际向该位置写入 0 之间的区别,是此次修复的出发点。

此前的 Metal 内核,即在 GPU 上执行的运算代码,会将比较结果 0 或 1 乘以原始值,因此待丢弃位置若为无穷大,与 0 相乘就会产生 NaN。此次改为根据条件选择原始值或 0,代码如下。

dst_row[i0] = _ggml_vec_tri_cmp<ttype>(i0, i1) ? src_row[i0] : static_cast<T>(0);

2. 新增使用特殊值的测试用例

变更包含 test_tri_special 测试用例。它在外部待丢弃的位置放入正、负无穷大,在需保留的位置放入有限值。通过分开放置待清除和待保留的值,展示乘法清除与选择 0 两种方式的区别。

测试覆盖上三角和下三角各自包含及不包含对角线的四种类型。它并非只检查一个方向的三角形,而是针对决定保留哪些位置的各项条件,检查特殊值的处理。

执行测试并比较结果的程序会拒绝输入或输出中出现 NaN 的情况。因此,新测试采用正、负无穷大。根据拉取请求说明,将 CPU 内核改为乘以比较结果后,四个用例均失败,而采用修复方式后则通过。

3. 既有测试与新增测试均已通过

拉取请求中记录的验证命令分别在 CPU 和 Vulkan 后端执行三角运算测试。作者记录称,两条命令中的既有四个用例与新增四个用例均通过。以下为原文给出的命令及结果注释。

test-backend-ops -o TRI -b CPU        # 4 existing cases and the 4 new ones, all pass
test-backend-ops -o TRI -b Vulkan0    # same set, all pass

已合并的拉取请求显示,25 项自动检查已通过。研究三角运算的开发者可以使用上述命令,同时检查既有用例和新增特殊值用例。

4. 影响与待确认事项

此次修复的益处在于消除待丢弃位置的无穷大引发的错误计算结果。关键是让这些位置得到与 CPU 和 Vulkan 已写入 0 的处理相同的结果。

与此同时,需要维护的测试代码也增加了。变更涉及 Metal 内核和后端运算测试文件两处,共新增 68 行、删除 2 行,在替换一行计算表达式的同时加入了特殊值测试用例。其意义在于,即使只是小规模运算修复,也配套了能重现问题的测试。

不过,拉取请求明确指出,未包含对 Metal 本身及其他未运行后端的直接验证。发布说明和拉取请求均未提供替换计算方式后的性能测量数据。

b12220 是一次针对性修复 Metal 三角运算中无穷大导致 NaN 的更新,使本应丢弃的位置被置为 0。