AVX2、具体的には VPGATHERDD と VPSLLVQ が実装されたので、それを使ってハフマンデコードを4つ並列に行うコードを書いていました。

で、計測した結果…

C:\Users\umezawa\Documents\huff4>huff4 _exp.dat
* NORMAL Huffman Decode x4
decode 771.877848msec
       2.875469nsec/symbol
ok

* AVX2 Parallel Huffman Decode
decode 1021.410574msec
       3.805051nsec/symbol
ok

ダメじゃん(´・ω・`)

やっぱり VGATHER が「期待したほどには」速くないのが最大の要因かと思うのですが、SIMD化に伴う処理方法の変化(原則的に条件分岐を使わなくなる)も大きいかもしれません。Skylake あたりで VGATHER が高速化され、ついでに AVX-512 が投入されてようやくスカラー処理より早くなるんじゃないかという気がします。また2年待ちか…

あとこのコードは x64 用に書いています。定数を保持するために16本あるレジスタのうちの8本を使っているので、x86 だと目に見えて遅くなりそうです。

Trackback

3 comments untill now

  1. AVX2 による並列ハフマンデコード(その2)

    ちょっと高速化した。 Haswell では、レジスタ幅が同じなら VGATHERDD より VGATHERQQ の方が常に速いので、置き換えられるところは置き換える。 符号列の読み込みが一切不要な場合は条件分岐…

  2. ハフマンデコードにおける単一ストリーム複数シンボル同時出力

    以前、AVX2 を利用してハフマンデコードにおける複数ストリーム同時デコードを試したことがありますが、今度は単一のストリームで複数シンボルを同時にデコードする話です。 ハフマン…

  3. AVX512 による並列ハフマン符号処理

    以前、AVX2 による並列ハフマンデコードを試したことがあって、その時には利点が無いという結論になっていました。 AVX2 ではハフマン符号処理をベクトル化するにはいくつかのベクトル…

Add your comment now