unsafeを書かずに速くする RustのSIMD「Fearless SIMD」1.0
RustでSIMD(1命令で複数データを処理)を使うと、普通は大量のunsafeが要る。Fearless SIMD 1.0は安全な部品2つに閉じ込め、速さを落とさずunsafeをほぼ消した。
#なぜ今日これを選んだか
Rustを学ぶ理由の一つは「速さと安全を両立できる」ことだと聞く。その看板が本当かを確かめるのに、SIMDはちょうどいい題材だ。CPUの性能を引き出す場面ほどunsafeが増えるのが普通で、そこを安全に書けるなら、ハードウェアに近い仕事でもRustを選ぶ理由になる。
#要点
- SIMDは1回の命令で複数の数値をまとめて計算する仕組み。従来のRustの抽象化では、1つのクレートに数千のunsafeブロックが必要になることもあった
- Fearless SIMDは、unsafeを
kernel!マクロと安全な型変換モジュールの2つに集約した。点検すべき場所がこの2か所に絞られ、それ以外にその場限りのunsafeはほぼ無い - 新しい
#[simd]マクロで、CPUごとに最適な版へ実行時に振り分ける処理を自動で作れる。すでに直接依存30クレート、間接的には1,000を超えるクレートが使っており、1.0以降は3年間のセキュリティ更新が約束されている
#自分にとっての示唆
「unsafeを消す」ではなく「unsafeを点検できる2か所に閉じ込める」という設計が一番の学びだった。危ない部分をゼロにするのは無理でも、置き場所を決めれば人が確かめられる。これはRustに限らず、自分のコードで外部APIや権限を扱う部分にもそのまま使える考え方だと思う。いまはRustの基礎を固める段階なので、SIMDそのものを書くのはまだ先。明日からの行動は1つだけ。Rustで配列を回す処理を書くとき、一度forループで書き、次にiter().map().sum()の形に書き直して、両方がどう違うかを確かめる。速さを引き出す書き方への入口はここからだ。