RustのSIMD、2026年の最新事情
The state of SIMD in Rust in 2026
RustのSIMDはここ1年で大きく進歩した。自動ベクトル化は依然として不安定だが、Rust 1.98でalgebraic_add()が安定化し浮動小数点の最適化が可能に。ポータブルSIMD抽象化では、Fearless SIMDがマルチバージョニング、固定幅・ハードウェア幅ベクトル、型と幅のジェネリクスを備えたオールインワンソリューションとして登場。std::simdはnightly限定でAPIが不安定、wideやpulp、maceratorもそれぞれ長所と短所を持つ。x86のマルチバージョニング問題やAVX-512の速度検出など、実用上の課題も整理されている。
浮動小数点は奇妙だ。適度な精度で浮動小数点の配列を合計するといった些細なことでさえ、驚くほど複雑になる。
HNでの議論
64- ack_complete
AArch64は確かにx86-64よりもはるかに包括的なベースラインを持っているが、状況によっては影響が大きいオプション拡張がいくつかある。Crypto拡張や、より新しい一部のaccumulation / dot product命令などだ。そしてIntelと違って、ARMには機能フラグを問い合わせるためのCPUIDに相当するポータブルな手段がなく、どのintrinsicが特定のFEAT_*フラグを必要とするかのドキュメント化もひどい。
ARMベースのCPUメーカーは、自社CPUに関する低レベルドキュメントをほとんど公開しておらず、この状況をさらに悪化させている。主流のx86 CPUならほぼどれでも、どのISAレベルをサポートしているか、一般的な実行幅やレイテンシはどうかといった情報を載せたドキュメントを見つけるのは簡単だ。しかし大多数のARM CPUについては、何もない。ARMが最適化ガイドを用意しているのは一部のCortexコアだけで、NVIDIAはOlympusコアの情報を公開した。だがApple M1の実行詳細はリバースエンジニアリングするしかなく、Oryonについては何もない。これは特にインオーダーコアにとって深刻で、残念ながら今でも重要だ。なぜなら新しいCPUがインオーダーの効率コアを搭載して出荷され続けているからだ。
- tancop
> ... 全部が十分に新しく、少なくとも10年以上前に導入されたAVX2を持っていると断言して、AVX2なしで動くものがあればクラッシュしたり誤動作したりするようにすればいい
> しかし、他の人に実行してもらうためにバイナリを配布するなら、それは実際には選択肢にならない。
これはどんなソフトウェアを作っているかによる。多くのゲームは要求スペックを5世代ほど前に設定している。例えばFC 27では最低要件がRyzen 1600だ。これならAVX2を無条件に使えて、超古いCPUで動かそうとしたユーザーからの苦情も防げる。
さらに、CachyOSやClear (RIP)のようなLinuxディストリビューション全体が、アーキテクチャレベルごとに世界をリビルドして、別々のバリアントとして提供している。これも他の人向けのバイナリと言えるだろう。
- imtringued
「演算を行うハードウェアは安いので、今世紀に作られたCPUならどれも十分に備えている。しかし命令デコードブロックは依然として1つしかなく、それを高速化するのは難しい。だから演算ハードウェアは大幅に活用されていない。
警告、細かい突っ込み。「ハードウェアは安い」と「命令デコードは高い」(暗黙)と言うのは、ちょっとした矛盾だ。命令デコード自体はいくらでも複製できる。地獄になるのはその前の段階、命令フェッチだ。
同じレジスタに書き込まないと仮定すれば、一度に16命令をフェッチ、デコード、実行できるコンピュータを作ることを妨げるものは何もない。
しかし同じaddを16回繰り返したいなら、プログラムメモリが16倍必要で、キャッシュの読み出しポートも16倍広くする必要がある、などなど。SRAMは本当に高価なので、この戦略はおそらく最初から必要なかったメモリに大量の面積を浪費することになる。これは大学でチップを設計しなければならなかった者として言うが、巨大なSRAMブロックの間に原始的なCPUすら見つけられないような状況だった。同じ命令を再利用することで、面積あたりの計算対メモリ比を高められる。
SIMDがなぜ存在するのか知りたい人向けの注意喚起だ。記事を批判しているわけではなく、SRAMがチップ設計者にとってどれほどの苦痛かをより多くの人に理解してほしいだけだ。
- sharktheone
ポータブルSIMDをすごく期待している。でも、手書きでロールしたSIMDの方が速いことが多いとも思う。
あとCraneliftのSIMD対応もかなりWIPだ。ごく一部の例外を除いて、基本的に128bitベクトルのサブセットしかサポートしていない。
- the__alchemist
私は自作ライブラリ `lin_alg` を使っている。これは浮動小数点値に関してcore_simdを模倣し、その概念をベクトルやクォータニオンに拡張したものだ。安定版Rustにcore::simdが登場したら、最終的には浮動小数点部分を置き換えるつもりだ。
欠点:現状ではx86専用だ。