本文へスキップ

Fearless SIMD 1.0がRustに安定した安全なSIMDをもたらす

9月21日に公開されたFearless SIMD(フィアレスSIMD)1.0は、SSE2からAVX-512、NEON、WebAssemblyまでの安全なSIMDをRustに提供する。APIは安定し、3年間のセキュリティ修正も約束された。

著者 Tech AI Wire Team

3 分で読めます

GitHub上のlinebender/fearless_simdリポジトリ。fearless_simd-v1.0.0が最新リリースとして表示されている画面。

数字で見る

crates that depend on it indirectly
1,000+
crates that use it directly
30
minimum Rust version
1.89
of security backports promised
3 years

Fearless SIMDは、unsafeブロックなしで高速な数値計算コードを書くためのRustライブラリである。2026年9月21日にバージョン1.0に到達した。このリリースでAPIが凍結されるため、今日このライブラリに向けて書いたコードは今後もコンパイルできるはずだ。すでに1,000を超えるRustのクレートが、直接または他のライブラリを通じてこれに依存しているため、この点は重要である。

Linebenderプロジェクトはこのリリースを9月22日にブログで発表した。このバージョンはRustのドキュメントホストであるdocs.rsにも、9月21日の日付で掲載されている。

SIMDとは何か、そしてなぜRustでは難しいのか

SIMDは「single instruction, multiple data」(単一命令・複数データ)の略である。最新のプロセッサは、数値を1つずつ処理する代わりに、1つの命令で複数の数値を加算、比較、乗算できる。グラフィックス、音声、圧縮、画像のコードはいずれも速度を得るためにこれに頼っている。

Rustでこれらの命令に直接たどり着く道は「イントリンシック」である。これはプロセッサの1命令にそのまま対応する関数だ。その多くはunsafeと指定されている。その命令を持たないプロセッサで呼び出すと、プログラムがクラッシュする可能性があるからだ。Rustはプログラマーに、確認を済ませたことを手作業で約束するよう求める。

さらに、プロセッサの系統ごとに独自の命令セットがある。IntelのAVX-512向けに書いたコードは、Armのスマートフォンでは何もしない。複数のチップに対応するには、通常同じ処理を何度も書くことになる。

Fearless SIMDは何をするのか

このライブラリは、両方の問題を安全なコードで包み込む。READMEはこれを「イントリンシックと安全な抽象化の両方を通じてSIMDを安全に使う方法であり、ライブラリ自体に含まれる安全でないコードは驚くほど少ない」と説明している。

Linebenderの投稿によると、4つの手法を提供する。

  • 自動ベクトル化: 通常のループをコンパイラがSIMDコードに変換するのを助ける。
  • マルチバージョニング: 1つの関数について異なるチップ向けの複数のコピーを作り、実行時に適切なものを選ぶ。
  • ポータブルな演算: 対応するすべてのプロセッサで動作する1組のベクトル型。
  • プラットフォーム固有のイントリンシック: unsafeなしで、チップ固有の命令に直接アクセスする。

Linebenderが強調するのは最後の点である。投稿には「イントリンシックに安全にアクセスできるので、性能の上限は_存在しない_」とある。

項目詳細
バージョン1.0.0、2026年9月21日
IntelとAMDSSE2からAVX-512まで
ArmNEON
ブラウザWebAssembly SIMD
その他のチップスカラーのフォールバック
最低Rustバージョン1.89
依存関係コアクレートにはなし
ライセンスApache-2.0またはMIT

オプションの関連クレートfearless_simd_macrosは、#[simd]属性を追加する。ブログ投稿はこれについて「どのSIMD関数に付けても、とにかく動く」と述べている。

1.0で何が変わったか

Linebenderによると、このプロジェクトは8年前の2018年にプロトタイプとして始まった。GitHubリポジトリによると、1.0リリースには凍結前の最後の互換性を壊す変更がいくつか含まれている。

  • witness()はtoken()に名前が変わり、新しいスーパートレイトExtractTokenに移る。
  • SimdBase::NとSimdMask::NはLENに名前が変わる。
  • as_arrayはコピーではなく参照を返すようになった。
  • 飽和演算とビットカウントの新しい演算。
  • 新しいリダクション: reduce_min、reduce_max、reduce_sum、reduce_product。
  • 新しい積和演算(fused multiply-add)。

リポジトリはサポートの約束も定めている。各最低Rustバージョンに対応する最新の1.0リリースは、そのRustバージョンの公開から少なくとも3年間セキュリティ修正を受ける。今後のリリースでは、マイナーアップデートで最低Rustバージョンが引き上げられる可能性がある。

開発者にとっての意味

Fearless SIMDを取り込むクレートを使っているなら、それが1.0に移行したかを確認してほしい。上記の名前変更は、witness()を呼び出したり、Nを使ったり、as_arrayがコピーを返すことに頼ったりするコードを壊す。機械的な修正で済むが、直すまではコンパイルエラーになる。

手書きのunsafeなSIMDコードを保守しているなら、このライブラリと比べてみる良い機会だ。主な利点は、x86、Arm、WebAssemblyの3つのコード経路が1つで済むことである。自分のホットループを移行の前後でベンチマークしてほしい。性能の上限がないというプロジェクトの主張は、自分のデータで試す価値がある。

ライブラリの作者にとっては、安定したAPIとセキュリティ期間によって、Fearless SIMDを公開インターフェースで使いやすくなる。1.0以前は、依存先の互換性を壊す変更がそのまま自分の互換性を壊す変更になった。Rust 1.89という下限に注意し、利用者が使う最も古いコンパイラに合うか確認してほしい。

出典

  1. Fearless SIMD v1.0 is here - Linebender
  2. linebender/fearless_simd - GitHub
  3. fearless_simd 1.0.0 documentation - docs.rs

関連記事

握手を交わす2本のロボットの手を描いた線画。片方の手首に、開いた小さな赤い錠が下がっている。
プログラミング

Rustls 0.23.45、2024年からのTLS 1.3不具合を修正

0.23.13から0.23.44までのバージョンが、誤った暗号化レベルのTLS 1.3ハンドシェイク(接続確立のやり取り)メッセージを受け入れていました。原因は2024年9月に入った不具合です。