萌えハッカーニュースリーダー

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

出典: http://0x80.pl/notesen/2016-11-28-simd-strfind.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

むむ、それは言いすぎじゃ!藻ではなく、貴重な栄養分じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search