llama.cppは、Apple機器のグラフィックス演算で破棄すべき値が不正な計算結果として残る問題を修正した版を公開した。この演算を使う開発者にとっては、破棄する要素に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を選択する方式の違いを明らかにする。

テストは上三角と下三角について、対角線を含む場合と除く場合の4種類を扱う。単に一方向の三角形だけを確認するのではなく、どの要素を残すかを決める条件ごとに特殊値の処理を点検する。

テストを実行して結果を比較するプログラムは、入力か出力のいずれかにNaNがあれば拒否する。そのため、新たなテストでは正負の無限大を使う。変更提案の説明によると、比較結果を掛けるようにしたCPUカーネルでは4ケースが失敗し、修正後の方式では通過する。

3. 既存と新規のテストをともに通過した

変更提案に記された検証コマンドは、CPUとVulkanの各バックエンドで三角演算のテストを実行する。作成者は、両コマンドとも既存の4ケースと新規の4ケースを通過したと記録した。以下は原文に示されたコマンドと結果のコメントだ。

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カーネルとバックエンド演算テストの2ファイルにわたり、68行の追加と2行の削除からなる。1行の計算式の置き換えに特殊値のテストケースを添えた。小さな演算修正にも、問題を再現できるテストを組み合わせた点に意味がある。

ただし変更提案は、Metal自体と、実行していない他のバックエンドでの直接検証は含まないと明記している。リリースノートと変更提案には、計算方式の置き換えによる性能測定値は示されていない。

b12220は、Metalの三角演算で無限大がNaNを生む原因を限定的に修正し、破棄すべき要素を0で処理するようにしたアップデートだ。