🚅 Mitchell Hashimotoの「全員SIMDを知るべき」— intrinsics暗記ではなく5ステップの定型で書く入門論
HashiCorp共同創業者でGhostty作者のMitchell HashimotoがSIMD入門記事を公開しHN 614ポイント。Zigのポータブルベクトルを使えば日常的なSIMDは5ステップの定型に収まる。スカラー1行がSIMD12行になりAVX2実測約5倍というGhosttyの実例と、HNの「自動ベクトル化で十分」論争を読む。
自分が毎日使っているターミナルGhosttyの中身で、SIMDがどう働いているか——それを作者本人が「誰でも書ける」と言い張る記事を出した。Mitchell Hashimoto、HashiCorpの共同創業者(Vagrant/Terraformの作者)にして、Zig製ターミナルGhosttyの開発者。「Everyone Should Know SIMD」はHNで614ポイント・229コメントまで伸びた。
SIMD(Single Instruction, Multiple Data)は、1命令でN個の値を同時に処理するCPU機能だ。AVX-512だのNEONだの、ISAごとのintrinsics(組み込み関数)を暗記する黒魔術という印象が強い。記事はその印象に正面から反論する。日常的なSIMDコードは、ほぼ同じ定型に従う。スカラーループを書けるなら書ける、と。
5ステップの定型
記事の中核は、GhosttyのZigコードを使った実例だ。デコード済みのコードポイント列から、0xF以下の制御文字を探すスキャン。スカラー版は1行のループで、SIMD版は12行増える。その12行が5ステップの定型に分解される。
比較したい定数をベクトル全レーンに複製する(Zigなら@splat(0xF))。ベクトル幅単位でループを回す。全レーンを一括比較する。結果を縮約して位置を取り出す(@reduceや@ctz)。ベクトル幅で割り切れない残りをスカラーで処理する。——どのSIMDコードもだいたいこの骨格で、変わるのは真ん中の演算だけ。憶えるのは命令セットではなく、この型ひとつでいい。
効果はどうか。理論値はNEON(4レーン)で最大4倍、AVX2で8倍、AVX-512で16倍。実測のエンドツーエンドはAVX2のIntelデスクトップで約5倍だったという。理論値との差を「SIMDの周りのコードで必ずいくらか失う」と正直に書いてあるのが、この記事の信用できるところだ。
肝はZigの@Vectorがポータブルなことにある。CPU固有なのは構文ではなくコード生成のほうで、同じコードがx86ならAVX系、ARMならNEONの命令に落ち、ベクトル未対応環境ではスカラーへフォールバックする。intrinsicsの暗記から、言語のジェネリックベクトル+定型へ。この移行が記事の言う「全員が知るべき」の実体だ。
「コンパイラで十分」論争
HNで一番割れたのはここだった。自動ベクトル化派は「モダンコンパイラは優秀。手書きの前にまずコンパイラに任せろ」と言い、記事は「本番のコンパイラは定期的にベクトル化の機会を見落とす」と返す。手書きの利点として挙がっていたのは速度そのものより予測可能性——コンパイラの更新で静かに性能が落ちる事故を避けられることだ。「知るべきはSIMDの書き方ではなく、ベクトル化が起きなかったときの見抜き方だ」という第三の立場もあって、これが一番実務的かもしれない。
「『簡単』と言いつつ例が複雑だ。SIMDは難しいが割に合う、と正直に言うべきでは」という突っ込みも入っていた。わかる。12行は1行の12倍だ。ただ、判定基準として記事が置いた一文は持ち帰る価値がある——連続データを走査・比較・カウント・変換するホットループを見たら、それがSIMDの出番。逆に簡単に書けそうになければ今はスキップしていい、という撤退線までセットなのが親切だった。
日本語圏はintrinsics入門ばかり
QiitaにはAVX-512のintrinsics入門、ZennにはRustの数値計算章と、日本語のSIMD解説は昔から一定量ある。ただほぼ全部がISA別のintrinsics解説で、「ポータブルベクトル+5ステップの定型」という抽象度で入る記事は見当たらない。Rust nightlyのstd::simd、C++26、Go 1.26の実験的SIMDと、ジェネリックベクトルを載せる言語はこの1年で一気に増えたところで、入門の正解ルートが変わりつつある。
正直に言うと、自分はSIMDを書く仕事をしていない。それでもこの記事を読んだのは、毎日目の前でスクロールしているターミナルの速さの中身を、作者の声で説明してもらえる機会がそうないからだ。道具の中身を知ってから使う道具は、ちょっとだけ別の道具になる。あなたのホットループ、走査・比較・カウント・変換のどれかをしていませんか。