コンテンツにスキップ

対応プラットフォーム

どれも必須ではありません。tensai は Go が動く場所ならどこでも、ポータブル カーネルと GPU なしで動きます。この表は、各プラットフォームがその上に何を 足せるか、そして何がまだ足りないかを示します。

OS 別

CPU カーネルは OS に一切依存しません。決めるのはアーキテクチャと Go の バージョンで、それは次の表です。OS が決めるのは GPU バックエンドと、 重みキャッシュの読み方です。

OS GPU 重みキャッシュ マップの解放
Linux Vulkan、dlopen メモリマップ madvise(MADV_DONTNEED)
macOS Metal、dlopen メモリマップ madvise (生のシステムコール)
Windows D3D12 または Vulkan、LoadLibrary メモリマップ (file mapping 経由) 無し。アンマップまで保持
その他 (BSD, illumos, ...) ビルドされない ReadAt で読み込み 無し

リリースバイナリは linux / macOS / Windows の amd64 と arm64 を配布しています。 それ以外でも go build は通り、tensai は動きます。失うのはマップ (ロードが キャッシュファイルの読み込みになり、時間とメモリを食いますが動作は同じ) と GPU タグです。

CPU カーネル

ベクトルカーネルは Go で書かれており (実験的な simd/archsimd パッケージ)、 ビルド時の GOEXPERIMENT=simd で有効になります。付けない場合、または下の表に 無い組み合わせでは、ポータブル実装が使われます。結果は同一で、速度は一桁落ちます。

AVX2 と NEON (ARM の Advanced SIMD) は命令セット拡張なので、どちらになるかは アーキテクチャと Go のバージョンだけで決まります。OS は関与しません。arm64 なら Linux でも macOS でも Windows でも同じ NEON カーネルが使われます。

アーキテクチャ Go カーネル 備考
amd64 1.26, 1.27 AVX2 実行時に判定。AVX2 と FMA が無い CPU はフォールバック
arm64 1.27 NEON AArch64 では必須のため判定不要。Go 1.26 の simd/archsimd に arm64 が無いため 1.26 はフォールバック
その他 すべて ポータブル

「ビルドがどれを選ぶか」と「実際に動かして確かめたか」は別の話なので、分けて示します。

プラットフォーム 選ばれるカーネル 検証
linux/amd64 AVX2 済。開発と計測はここで行っています
linux/arm64 NEON 済。エミュレータ上でテストと生成を確認
darwin/arm64 NEON 未。実機での計測がありません
windows/amd64 AVX2
windows/arm64 NEON

エミュレータでの確認は、arm64 の計算結果を信頼する根拠にはなりますが、速度の 根拠にはなりません。全パッケージのテストが通り、量子化 matvec のチェックサムが ポータブル実装とも AVX2 とも一致し、0.5B が amd64 と同じテキストを生成します。 しかし実機でどれだけ速いかは、実機で動かさないと分かりません。

NEON でベクトル化されている範囲は AVX2 より狭いです。

カーネル amd64 arm64
int8 matvec (-q8、requant 済みの重み) AVX2 NEON
attention の内積・値累算・softmax の exp AVX2 NEON
要素ごとの演算 (加算、スケール、SwiGLU ゲート) AVX2 NEON
4bit matvec (-q4) AVX2 ポータブル
grouped int8 matvec (gguf ブロックの直接リパック) AVX2 ポータブル
プレフィルのバッチ畳み込み AVX2 ポータブル
MXFP4 (gpt-oss) AVX2 ポータブル
活性化の量子化 AVX2 ポータブル
密行列積 (学習) AVX2 ポータブル

tensai bench はどの系統で走ったかを最初の行に出力するので、意図せず フォールバックしているビルドはすぐ分かります。

GPU

GPU バックエンドはビルドタグ 1 つで有効になり、実行時に wgpu-native を読み込みます。cgo も GPU SDK のインストールも不要です。ライブラリのバージョンと参照先の環境変数は GPU (WebGPU) を参照してください。

OS ローダ wgpu-native が選ぶバックエンド
Linux dlopen Vulkan
macOS dlopen Metal
Windows LoadLibrary D3D12 または Vulkan
その他 なし ビルドは通り、GPU は利用不可と報告

3 つの OS すべてで amd64arm64 をクロスビルドしています。2 つのタグは バインディング世代の選択で、-tags wgpu24 が v29 C API、-tags wgpu が v22.1.0.5 です。WSL2 内では dozen 経由で実 GPU に届くのは v29 の方で、素の wgpu ビルドはソフトウェアラスタライザに落ちます。

プラットフォームではなくモデル側の制限が 1 つあります。value を key から取る層を 持つ Gemma 4 のチェックポイントは、デバイス側カーネルがその形に未対応のため、 どのプラットフォームでもデコードが CPU で走ります。実行時にその旨を表示して 続行します。

どれも変えないもの

モデルの取得・リパック・キャッシュの手順はどこでも同じで、出てくる数値も同じです。 ベクトルカーネルはポータブル実装と一致するように書かれており、量子化 matvec は AVX2 でも NEON でもどちらでもない場合でもビット一致します。プラットフォームは tensai を遅くすることはありますが、違う答えを出させることはありません。