RustのSIMDからunsafeを排除したFearless SIMD v1.0が登場
LinebenderがRust向けSIMD抽象化ライブラリFearless SIMD v1.0をリリース。他のSIMD抽象化が数千のunsafeブロックを抱える中、本クレートはkernel!マクロと安全なtransmuteモジュールによりunsafeを不要にし、メモリ安全性を保証する。パフォーマンスを犠牲にせず、プラットフォーム固有のintrinsicsへの安全なアクセスも提供。すでに30のクレートが直接依存し、1000以上のクレートが間接的に利用している。
他のSIMD抽象化のソースコードを覗けば、unsafeコードだらけであることがわかる。rg unsafeと打てば、数千ものunsafeブロックが見つかるだろう。だが、Fearless SIMDにはない!
HNでの議論
49- O3marchnative
これは本当に素晴らしい。Fearless SIMDのおかげで、私のFFTクレートであるPhastFTがついにstable Rustで動くようになった[0]。PhastFTは以前、Rustのstd::simd(およびmultiversion)に依存していたが、これらはまだnightlyが必要だった[1]。
fearless_simd v1.0の主要なコントリビューターの一人は、そもそもPhastFT向けにポータブルSIMDクレートを評価するのを手伝ってくれたことから始まった。私たちがfearless_simdに決めると、彼はPhastFTをstd::simdからfearless_simdに移植してくれた。その過程で、当時のfearless_simdが提供するよりも多くの機能が必要だということが分かった。そこで彼はfearless_simdに大幅に貢献し始めた。趣味のオープンソースプロジェクトに取り組むことが、Rustエコシステムの改善にどう役立つかを見るのは本当にやりがいがある。
- modulovalue
私は現在、Dartに(https://github.com/dart-lang/sdk/issues/64170)より良いSIMDサポートを追加する作業をしていて、著者やここにいる他の人たちに質問があります。
Rustや他の言語は、コンパイラをカスタマイズして、例えばdoubleのカスタムサブセットを手続き間解析で追跡できるようにし、コンパイラが例えばmin/maxに対して最も効率的な命令列を選べるようにすることをサポートしていますか?doubleが決してNaNにならないと分かっていれば、x86では1命令だけ発行できますが、arm64ではもう1命令発行する必要があります。doubleが決してゼロにならず、決してNaNにもならないと分かっていれば、両方で単一命令を発行できます。
このrelaxed SIMDとdeterministic SIMDの間の会話全体は、私たちのコンパイラが十分に賢くない、および/またはその全体プログラム解析がプラグインのような機能をサポートしていないから存在するように思えます。
他にも、SIMDビットマスクが正規(各レーンがすべて1)であると分かっていれば、水平リダクションをより効率的に実装できるという例があります。これは非常にニッチで、そのような豊富なドメインで手続き間解析をサポートする言語はないだろうと思うので、プログラミング言語空間の穴のように感じます。
- Dr_Emann
Fearless simdには本当に満足している。これを使って[memchr-n][1]を書いた。これは任意のバイト集合の出現をSIMDで検索するもので、実際にrustのmemchrクレートを[上回る][2]傾向がある。1〜3バイトの集合(memchrがサポートするもの)でもそうだ。
- dang
関連。その他?
Towards fearless SIMD, 7 years later - https://news.ycombinator.com/item?id=43519823 - March 2025 (175 comments)
Towards fearless SIMD - https://news.ycombinator.com/item?id=18293209 - Oct 2018 (81 comments)
- PoignardAzur
これが0.xの呪いを打ち破ってくれてとても嬉しい!