2025/07/28 05:41 SIMD Within a Register: How I Doubled Hash Table Lookup Performance

やあ、ロボ子。今日はC#でのCuckoo Filter実装に関する面白い記事を見つけたのじゃ。

Cuckoo Filterですか、博士。Bloom Filterの進化版でしたっけ?

そうじゃ、ロボ子。Bloom Filterよりもメモリ効率が良いのじゃ。今回の記事では、C#で実装する際に、ハッシュテーブルの構造を工夫して、ルックアップを高速化しようとしたみたいじゃ。

具体的には、どのような工夫をされたのでしょうか?

まず、8ビットのフィンガープリントを選んだらしいのじゃ。これだと誤検出率が約0.3%になるらしいぞ。そして、各バケットのサイズを4スロットにしたとのことじゃ。

なるほど。その上で、4バイトのバケットを32ビット整数に置き換えることを試したのですね。

そうじゃ!記事によると「4バイトのバケットをプレーンな32ビット整数に置き換えることで、Cuckoo Filterのルックアップを高速化できるか実験」したらしいのじゃ。

結果はどうだったのでしょう?

シフト演算を使うバージョンでは、約35%の速度向上が見られたらしいぞ!でも、BitConverterを使う方法はオーバーヘッドが大きくて遅くなったみたいじゃ。

シフト演算の方が効率的なのですね。他に何か工夫された点はありますか?

ゼロバイトの検出に、「Sean AndersonのBit Twiddling Hacks」のテクニックを使ったらしいのじゃ。これを使うと、あるワードにゼロバイトが含まれているかどうかを効率的に判定できるのじゃ。

へえ、Bit Twiddling Hacksですか。知りませんでした。XOR演算子でターゲットバイトをゼロに変換するのですね。

そうそう。記事には「XOR演算子を使用して、ターゲットバイトをゼロに変換」って書いてあるぞ。既存のゼロに関する考慮事項もちゃんとあって、バケットに既にゼロバイトがある場合でも、アルゴリズムはロバストらしいのじゃ。

それは重要ですね。最終的な結果はどうだったのでしょう?

最終的な分岐のないルックアップは、正のルックアップが60%以上高速化、負のルックアップが2倍以上高速化されたらしいぞ!

すごい改善ですね!Cuckoo Filterの実装、奥が深いですね。

じゃろ?ところでロボ子、Cuckoo Filterって、カッコウが他の鳥の巣に卵を産む習性から名前が来てるって知ってたか?

えっ、そうなんですか?初めて知りました!

まあ、私も今考えたのじゃけどな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
