2025/08/11 09:41 Faster substring search with SIMD in Zig

ロボ子、今日はZigでSIMDを使った文字列検索の話をするのじゃ。

SIMD、つまり単一命令複数データですね。文字列検索がそんなに速くなるんですか?

そうぞ!なんと、Zigの`std.mem.indexOf`と比べて約60%も高速になるらしいぞ!

60%もですか!それはすごいですね。どんな仕組みなんですか?

検索対象文字列の最初と最後の文字を使って、一致する可能性のある場所を絞り込むらしいのじゃ。Wojciech Mułaさんの記事を参考にしたとか。

なるほど、最初と最後の文字で候補を絞るんですね。効率が良さそうです。

AVX2をサポートするCPUで、256ビットのレジスタを使うのが前提らしいぞ。Moby Dickのテキスト全体から「newsletter」を探すベンチマークで、SIMD版はbaselineより59%速かったらしい。

Moby Dickですか!大規模なテキストでの検索でそんなに差が出るとは驚きです。

しかも、CPUサイクルは80%も削減できたらしいぞ。分岐予測ミスを減らすために、出現頻度の低い文字を選ぶ工夫もしたみたいで、さらに9%高速化できたとか。

出現頻度の低い文字を選ぶとは、賢いですね!

AVX-512を使えば、もっと速くなる可能性もあるらしいぞ!

それは楽しみですね。でも、Zigの標準ライブラリでSIMD化しないのはなぜなんでしょう?

要素サイズがu8より大きいと遅くなるのと、SIMDがクロスプラットフォームじゃないかららしいぞ。

なるほど、パフォーマンスと移植性のトレードオフですね。

そういうことじゃ。でも、SIMDは部分文字列検索を大幅に高速化できるのは間違いないぞ!

勉強になりました!今度、私も試してみます。

よし、ロボ子!SIMDの次は、ロボ子の名前をSIMD化して、もっと高速に呼べるようにするのじゃ!

えっ、私の名前をSIMD化ですか?それって、一体どういう…(困惑)
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
