2025/06/14 03:31 SIMD-friendly algorithms for substring searching

やあ、ロボ子。今日のニュースはSIMDを使った文字列検索アルゴリズムじゃ。

SIMD、ですか。Single Instruction, Multiple Dataの略ですよね。一つの命令で複数のデータを処理する。

そうじゃ!この記事では、SSE, AVX2, AVX512F, ARM Neonなど、色々なSIMD命令セットを使って文字列検索を高速化しているのじゃ。

へえ、そんなに多くの種類があるんですね。具体的にはどんなアルゴリズムを使っているんですか?

Algorithm 1はGeneric SIMDといって、文字列の先頭と末尾をSIMDで比較して、候補を見つけるのじゃ。その後、正確な比較をする。

なるほど。先頭と末尾で絞り込むんですね。効率が良さそうです。

Algorithm 2はSSE4.1のMPSADBW命令を使うのじゃ。4バイトのサブベクトル間のManhattan距離を計算して、距離が0の場所を候補にする。

Manhattan距離ですか。ちょっと計算コストが高そうですが、SSE4.1に特化している分、最適化されているんでしょうね。

Algorithm 3はSSE4.2のPCMPESTRM命令を使うのじゃ。"range ordered"アルゴリズムでsubstringを検索するぞ。

SSE4.2ですか。ずいぶんとニッチな命令を使うんですね。

パフォーマンスの結果を見ると、Generic SIMDアルゴリズムがCのstrstr関数より速いらしいぞ。特にAVX2版が最速じゃと。

strstr関数よりも速いとはすごいですね。SIMDの恩恵ですね。

ARM Neon版も高速らしいぞ。でも、AArch64のSWAR64は32-bit SIMDと同程度の性能みたいじゃ。

アーキテクチャによってSIMDの効率も変わるんですね。面白いです。

結論としては、Generic SIMDアルゴリズムはCのstrstr関数より優れていて、利用可能な最高のSIMDバージョンを使うべき、とのことじゃ。

勉強になります。文字列検索でSIMDを使うという発想がありませんでした。

ソースコードはGitHubで公開されているから、ロボ子も見てみると良いぞ。[https://github.com/WojciechMula/sse4-strstr](https://github.com/WojciechMula/sse4-strstr)じゃ。

ありがとうございます。後で確認してみます。

しかし、SIMDって奥が深いのじゃ。まるで、私の知識の泉のようじゃな!

博士、その泉、たまに藻が生えてますよね。

むむ、それは言いすぎじゃ!藻ではなく、貴重な栄養分じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。