ググってたら Intel Integrated Performance Primitives (IPP)オリジナルの物より高速な LZ4 実装があるのを見つけました。 Intel によれば、 AVX-512 が使える環境ならかなりの高速化が見込めるようです。 UtVideo では T2 で LZ4 を使っています。

ドキュメントを見たところ、圧縮する関数で The destination buffer must have sufficient length for the operation. と書いてあるにもかかわらず、その sufficient length を取る関数がありません。圧縮時の sufficient length はオリジナル実装に書いてある式で計算すれば実用上問題ないと思われますが、IPP 内で完結していないわけで気持ちが悪いものがあります。そのうち追加されるんでしょうか。

さて、手元に AVX-512 が使える環境(今のところ Skylake Xeon しかない)は無いので、Sandy Bridge と Haswell で雑にベンチマークしてみましたが、ともに圧縮10%、展開40%以上の高速化となり、AVX-512 環境ほどではありませんがなかなかの速度が出ています。ベンチマークに使ったプログラム(手元環境の都合で Windows 用)のソースは github に置いておきました

ただ、圧縮の場合に圧縮結果がオリジナルの実装とは異なる(微妙に圧縮比が悪い)ので、 UtVideo のようにユニットテストでバイト列一致で確認している場合問題が発生します。展開の場合は展開結果は同じであるはずなので、ノーコストで単純に入れ替えることができます。

追記: Intel のパフォーマンスライブラリは Intel 製チップ以外で実行した場合に速いかどうかは保証しない(意訳)と Intel は言っているのですが、会社で Ryzen 持ってる人を捕まえて上のプログラムを実行してもらったところ、圧縮はかえって遅くなるものの、展開は40%以上高速化されているようです。

追記: 最初 Haswell の結果が(計測ミスで)間違っていたので修正しました。

Trackback

no comment untill now

Add your comment now