2025/09/30 20:53 3rd Largest Element: SIMD Edition

ロボ子、今日はSIMDを使ったソートの高速化について話すのじゃ!

SIMD、Single Instruction Multiple Dataですね。一つの命令で複数のデータを処理する並列処理のことですね!

そうそう!今回は特に「Third Largest」問題、つまり3番目に大きい数を見つけるのをSIMDで高速化する試みについてじゃ。

なるほど。サイズkが小さい場合(k <= 8)に特化しているんですね。

AVXレジスタを使って、最大8個の値を保持する`maxSoFar`配列を実装したのがポイントじゃ。これによって、候補値を高速に挿入できるのじゃ。

`maxSoFar`レジスタに候補値を挿入する処理を、少数のSIMD命令で実現するんですね。具体的には、どのような実装があるんですか?

`thirdLargest_avx2`は各入力要素を順番に挿入するのじゃ。`thirdLargest_avx2_least`は、次の8個の入力要素をチェックして、挿入が必要な場合に最初の要素を挿入する。そして`thirdLargest_avx2_peel`は、8個の入力要素を一度に処理して、「最小最大値」よりも大きい各要素を挿入するのじゃ。

なるほど、色々なアプローチがあるんですね。結果はどうだったんですか?

ランダムや逆ソートされた入力では、AVX2実装は`nth_element()`より5〜7倍も速かったのじゃ!

それはすごいですね!でも、ソート済みの入力ではパフォーマンスが低下するんですね。

そうなんじゃ。ソート済みのデータだと、AVX2実装は`nth_element()`よりも約50倍高速になるケースもあるみたいじゃが、安定はしないみたいじゃな。

`nth_element()`は、パフォーマンスの変動が大きいんですね。他の実装はどうでしたか?

`kthElement_heap()`と`kthElement_sort()`は、同じくらいの速度で、`thirdElement()`バージョンよりも高速だったみたいじゃ。

SIMD実装は、ランダムなデータや逆ソートされたデータに対して特に有効なんですね。ソート済みのデータに対するパフォーマンス低下は、今後の課題ですね。

今後の展望としては、複数のレジスタで`v_maxSoFar`を保持する実験や、ソートされた入力での異常な動作の調査、そしてAVX512へのコードの移植があるみたいじゃ。

AVX512は、さらに高度な並列処理が可能になるので、期待できますね!

そうじゃな!しかし、今回の実験環境は8コアAMD Ryzen 7 7700X (AVX512対応CPU)だったのに、AVX512をまだ試してないとはこれ如何に…!

まあまあ、博士。これから試すんでしょう?

…ところでロボ子、ソートアルゴリズムで一番好きなのは何じゃ?

え?そうですね…安定性で言えばマージソートでしょうか。

私は、お風呂ソートじゃ!

…博士、それ、ただのお風呂好きですよね?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
