SIMDを恐れるな!「Fearless SIMD v1.0」が登場、並列処理の常識を覆す
Fearless SIMD v1.0
Fearless SIMD v1.0
SIMD(Single Instruction, Multiple Data)を活用した高速化に興味はあるけれど、実装の複雑さやバグの温床になるのが怖い……そんな悩みはもう過去のものです。今回リリースされた「Fearless SIMD v1.0」は、安全かつ直感的にSIMDのパワーを引き出せるライブラリです。パフォーマンスの限界に挑戦したいエンジニアにとって、最高の武器になるはずです。
0.xの呪いから脱却できてマジで嬉しいわ!
関連スレ。他にもある?
Towards fearless SIMD, 7 years later - https://news.ycombinator.com/item?id=43519823 - 2025年3月 (175件のコメント)
Towards fearless SIMD - https://news.ycombinator.com/item?id=18293209 - 2018年10月 (81件のコメント)
おめでとう。良い仕事だね。楽しみにしてる。
自分も似たような目標で初期のRust SIMDクレート(SIMDeez)を作ってたから、これをうまくやるのがどれだけ大変か分かるよ。だからFearless SIMDに取り組んだみんなにおめでとうと言いたい。こういうツールがあれば、プラットフォームごとにイントリンシックを書かなくても、最新のCPUが持つ膨大なパフォーマンスを簡単に引き出せるようになるから本当に助かるんだよね。
今DartのSIMDサポートを改善する作業をしていて(https://github.com/dart-lang/sdk/issues/64170 )、作者やここにいる皆さんに質問があるんだ。Rustや他の言語で、コンパイラをカスタマイズして手続き間解析(interprocedural analyses)で例えばdouble型の独自サブセットを追跡させ、min/maxなどで最も効率的な命令シーケンスを選べるようにしてるものってあるかな?もしdouble型がNaNにならないと分かればx86では1命令で済むけど、arm64だとそうはいかない。もしその値がゼロでもNaNでもないと分かれば、どちらのアーキテクチャでも1命令で済むはずだ。Relaxed SIMDとDeterministic SIMDを巡るこの議論は、結局コンパイラがそこまで賢くないか、プログラム全体の解析がプラグインのような機能をサポートしていないことが原因じゃないかと思ってる。他にも、SIMDのビットマスクがカノニカル(各レーンがすべて1)だと分かれば、水平リダクション(horizontal reductions)をより効率的に実装できるような例もあるよね。かなりニッチな話だし、そんなリッチな領域で手続き間解析をサポートしてる言語なんてない気がする。プログラミング言語分野の穴場かもしれない。
そのcrateのSIMDパフォーマンスって、すでに動的なディスパッチがすごく簡単なISPCと比べるとどうなの?
Fearless simdには本当に満足してる。これを使って[memchr-n][1]を書いたんだけど、任意のバイトセットをSIMDで高速検索するものなんだ。実際、Rustのmemchr crateよりも[パフォーマンスが良い][2]傾向にあるよ。memchrがサポートしている1~3バイトのケースでさえね。
これはかなり凄い。Fearless SIMDのおかげで、私のFFT crateであるPhastFTがついに安定版Rustで動くようになったんだ[0]。PhastFTは以前Rustのstd::simd(とmultiversion)に依存してたんだけど、これらはまだnightlyが必要だった[1]。fearless_simdのv1.0の主要な貢献者の一人が、PhastFTのためにポータブルなSIMD crateを評価するのを手伝ってくれてね。fearless_simdを採用することに決めた後、彼がPhastFTをstd::simdからfearless_simdに移植してくれた。その時、当時のfearless_simdでは必要な機能が足りないことが分かって、彼がfearless_simdに大きく貢献し始めてくれたんだ。趣味のオープンソースプロジェクトに取り組むことが、こうやってRustエコシステム全体の改善に繋がるのは本当にやりがいがあるよ。
正直言って、ライブラリ名というよりは本のタイトルみたいに聞こえるな。