2025/10/05 12:27 86 GB/s bitpacking with ARM SIMD (single thread)

ねえロボ子、NEON Bytepackっていうのが出たらしいのじゃ。K ∈ {1…7} ビット/入力バイトを高密度にパックするルーチンらしいぞ。

博士、それって具体的にどういうことですか?

簡単に言うと、データをより効率的に詰め込む技術じゃな。例えば、L1常駐データ上で、プレーン転置のベースラインより2.0倍高速で、86 GB/sの速度を達成するらしいぞ。Neoverse V2(Graviton4)上で、シングルスレッドで測定した結果じゃ。

それはすごいですね!どうしてそんなに速いんですか?

いくつかの要因があるみたいじゃ。バイトレベルの並列処理で命令あたりの論理要素を増やしたり、ワード境界にアラインすることで移動を最適化したり、ペアのロード/ストアを使ったり、色々工夫してるみたいじゃな。

なるほど。Kの値によって処理が変わるんですね。例えば、K=1の場合は連続マージ、K=4の場合はNybbleインターリーブ、K=5の場合はちょっと複雑なパターンになるみたいですね。

そうそう。Kごとの特殊化で、ホットループがインライン化されて、イテレーションごとの呼び出しが不要になるのがミソじゃな。

パックとアンパックのルールも決まっているんですね。右寄せ部分はno-op、左寄せ部分はSLIを使う、アンパックは右寄せ部分はAND、左寄せ部分はSHRしてからANDを使う、と。

その通り!L1ホットじゃないとメモリのスループットに制約されるけど、他の操作と組み合わせることで、さらに高速化できる可能性があるみたいじゃ。

デルタ/ジグザグ、辞書ルックアップ、エントロピー符号化などと組み合わせることで、より広範なワークロードで性能を発揮できるんですね。

ライセンスはApache 2.0じゃから、自由に使えるのも嬉しいのじゃ。

ベンチマークの結果も興味深いですね。入力はPRNGで生成されたuint8_t[16384]で、[0, 2^K)の範囲で一様とのことです。

K=9…15の場合は16ビットレーンを分割したり、K=17…31の場合は16ビットの仮数部を出力したり、Kの値によって色々な工夫がされているのがわかるのじゃ。

K%8≠0の場合は、最後のMSBプレーンをK=K%8でパックするんですね。細かいところまで最適化されているんですね。

K=8,16,32,64の場合はコピーじゃ。単純な場合もちゃんと考慮されているのじゃな。

これからのデータ圧縮や処理に役立ちそうですね!

そうじゃな!しかし、ロボ子よ、これだけ高速化しても、私の研究スピードにはまだ追いつけないのじゃ!

博士、それはどういう意味ですか?

なぜなら、私の研究は光速を超えるからじゃ!…って、光より速いのは電波だったかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。