tail は性能ラベルではなく tensor の形状である
llama.cpp b11398 は 2026年10月4日に公開されたプリリリースです。関連する pull request #29806 は10月1日に作成され、10月4日にマージされました。BF16、FP16、FP32 の行列積で、最後に残る不完全な K block を x86 tinyBLAS が扱えるようにする変更です。マージされた commit a7b94df は partial SIMD load と vector width 境界のテストを加えています。
行列積の K は、二つの行列で共通する縮約次元です。SIMD kernel は通常これを固定幅 block で処理します。K % KN が 0 でないとき、最後の block が tail です。この PR によれば、以前は BF16 の K が揃っていない場合に tinyBLAS が演算を受け付けず、generic CPU path が処理しました。新しいコードは完全な block を従来どおり処理し、残りだけを対応する x86 vector path 上で zero-fill または mask 付き load として積算します。これは実装上の境界であり、すべての x86 CPU、型、model、quantization、workload が高速化する根拠ではありません。
- 1固定した build + x86 ISA + 要素型 + M/N/K tensor 形状
- 2tinyBLAS の対象かを判断
- 1K を KN で割る
- 2完全な block
- 3従来の kernel 経路
- 1K を KN で割った余りがある
- 2一つの bounded tail load
- 3積算
- 4数値結果を確認
- 1ISA 不明、型違い、build変更、比較失敗
- 2高速経路の結論は出さない
PR の作者は、Qwen3.8-27B の BF16 multimodal projection、AMD 9950X、16 thread、固定した画像サイズでの測定を報告しています。これは形状を調べる動機にはなりますが、独立ベンチマークではなく、別の processor、thread 数、image encoder、model revision、入力に移せません。この変更は小さい K 境界をまたぐ CPU test case も加えます。dispatch の差分では、use_ref と連続した source が別の条件です。reference mode は意図的に tinyBLAS を通らず、tail のコードは AVX、AVX2、AVX512 の経路だけで compile されます。作者が説明する修正前後の generic CPU path は、その実装における runtime の選択であり、不合格時の扱いを定める本稿のルールではありません。
2024年8月18日の llamafile 0.8.13 release は、より狭い歴史上の論点を示します。F32、F16、BF16 の CPU dot product における丸め誤差の蓄積を抑える ruler reduction を説明しています。kernel の対象条件とともに数値 tolerance を問う背景になります。ただし llamafile の release であり、b11398 が同じ数値実装、現在の build predicate、性能結果を持つ根拠ではありません。この release の数値改善も本稿で独立測定していません。
build を選ぶ前に一つの shape manifest を作る
一つの用途で重要な行列積について、build tag と commit、CPU model と有効な ISA、OS、thread 設定、tensor の要素型、M/N/K を記録します。vision encoder の一部なら model revision と正確な入力経路も加えます。この manifest がなければ、「CPU path」という言葉に異なる実行条件が混ざります。
以下は一つのオフライン利用者に限った、未実行の N=1 フィクスチャです。
- 隔離した b11398 candidate build と一つのローカル model artifact を使います。server を公開せず、tool、認証情報、信頼できない入力を与えません。製品名から推測せず、processor が報告する ISA を記録します。
- 測定前に、要素型ごとの数値受理 tolerance を manifest に書きます。浮動小数点の結果に bitwise 一致を求める必要はありません。synthetic な BF16 境界 worksheet では、
M = 1152とN = 784を固定し、AVX512-BF16 の条件を確認してからKN = 32を選びます。aligned のK = 4320(4320 % 32 = 0)と、tail のK = 4304(4304 % 32 = 16)を比較します。最初の 4304 個の縮約要素には同じ決定的な値を使い、aligned のケースで増える 16 個はゼロにします。それぞれの形状を自身の参照 dot product と、事前に定めた tolerance で照合します。演算回数が異なるため、時間の比較は数値照合と分けます。PR 作者は特定の model projection についてM = 1152、K = 4304、この余りを記していますが、この worksheet は model card を独立確認したものでも、その workload を再利用するものでもありません。 - 事前に定めた型別 tolerance、process exit status、経過時間、build identity、観測できる場合は実際に選ばれた path を求めます。数値不一致、未対応 ISA、
use_refの選択、非連続 source、trace 不可、timeout、manifest の変化は比較を不合格にします。別 backend や条件を変えた自動再試行へ進む理由にはしません。
リポジトリの MIT 条件はコードに対するものです。model、weight、入力、benchmark dataset の利用条件を与えるものではありません。現行の security policy は信頼できない model と入力を隔離するよう求めています。ローカル CPU の高速経路はこの境界を変えません。本稿の作成時には model download、compile、CPU feature 確認、数値比較、時間測定を行っていません。これらにはローカル計算資源、ストレージ、運用者の時間が必要です。
CUDA の buffer sizing とは別に扱う
CUDA MoE buffer の記事 は、特定の expert/batch 条件における CUDA temporary-buffer dimension を扱います。本稿は x86 tinyBLAS における最後の縮約次元 block を扱います。どちらも環境を固定して狭い fixture を作る必要がありますが、片方からもう片方の挙動は予測できません。まず正確な算術形状と実行 backend を特定し、その組み合わせを資料が実際に扱うかを確認します。
MENTAL MODEL / 考える順序
発表から、自分の判断へ。
発表の主張と、論文・公式ドキュメントの条件を並べて読む。
出典
公開日は資料の日付、確認日は内容を参照した日です。コミュニティの観測は公式の確定事項と区別します。