SSE5とBitslice DES
おことわり
AMDがSSE5をキャンセルし、AVXと親和性の高い128ビット/256ビットSIMD拡張命令セットであるXOPをアナウンスしました。 いろいろ便利になってしまうので、このコンテンツは、ほとんど意味が無くなりました。
新たなページはこちら
SSE5 Enhanced Bitslice DES
これは何か?
AMDが32nmプロセス世代で投入するK11(Bulldozer)マイクロアーキテクチャにてサポートされる拡張命令セットのSSE5には、pcmovという命令が追加されます。これはAltiVecにおけるvsel、Cell B.E.のSPEにおけるselbと同じく、3入力のビット選択オペレーションを実現するものです。 AltiVecやSPEでの実装例同様、これを用いることにより、Bitslice DESを構成する論理演算ゲート数の削減が期待できます。
ダウンロード
現状あまり需要がなさそうなのでマルチライセンスにはしておりません。
- 第2版(BSDスタイルライセンス) (2009.01.02更新)
注意
こちらはあくまでビット論理演算の回数の削減のみに着目した最適化のみ行っております。実際の演算のスループットを反映したものではありません。従来のBitslice DESより性能低下を起こす可能性もあります。
あくまで参考程度と思って下さい。
Tripcode Explorerの将来バージョン - IntelとAMDどっちが有利?
pcmov命令によるS-Box構成命令数の削減効果は?
SSE5用Bitslice DES S-Boxes(試作版)のS4関数(一番ビット論理演算回数が少ない)を32ゲートまで最適化後、gcc 4.3でコンパイルし、Linux x86-64用アセンブリコード吐かせてみました。更に命令数を減らすため、余分なmovdqaを削る手動最適化をしています。
命令スケジューリングはかなりテキトーです。
movdqa xmm10, xmm1 movdqa xmm9, xmm4 movdqa xmm6, xmm2 por xmm10, xmm4 movdqa xmm11, xmm0 movdqa xmm7, xmm2 movdqa xmm13, xmm4 movdqa xmm12, xmm10 pcmov xmm7, xmm1, xmm4, xmm7 movdqa xmm14, xmm3 pxor xmm12, XMMWORD PTR [ALL_ONE] por xmm9, xmm12 pcmov xmm6, xmm12, xmm1, xmm6 movdqa xmm8, xmm6 pandn xmm8, xmm9 pcmov xmm11, xmm6, xmm8, xmm11 pxor xmm7, xmm8 pcmov xmm2, xmm11, xmm0, xmm2 pxor xmm6, xmm9 movdqa xmm8, xmm0 pcmov xmm8, xmm6, xmm7, xmm8 pcmov xmm7, xmm11, xmm8, xmm7 pxor xmm9, xmm7 pcmov xmm7, xmm6, xmm1, xmm7 pxor xmm13, xmm7 pcmov xmm14, xmm11, xmm8, xmm14 pxor xmm8, xmm2 pcmov xmm9, xmm9, xmm13, xmm3 pcmov xmm6, xmm7, xmm12, xmm6 pcmov xmm9, xmm9, xmm14, xmm5 pxor xmm6, xmm0 pcmov xmm14, xmm14, xmm9, xmm5 pxor xmm10, xmm8 pxor xmm14, XMMWORD PTR [rcx] pcmov xmm10, xmm10, xmm11, xmm0 movdqa XMMWORD PTR [rcx], xmm14 pcmov xmm4, xmm4, xmm13, xmm10 pxor xmm2, xmm4 pcmov xmm8, xmm8, xmm10, xmm3 pcmov xmm3, xmm6, xmm2, xmm3 pcmov xmm3, xmm3, xmm8, xmm5 pcmov xmm8, xmm8, xmm6, xmm5 pxor xmm8, XMMWORD PTR [rdi] pxor xmm3, xmm5 movdqa XMMWORD PTR [rdi], xmm8 pxor xmm9, xmm5 pxor xmm3, XMMWORD PTR [rsi] movdqa XMMWORD PTR [rsi], xmm3 pxor xmm9, XMMWORD PTR [rdx] movdqa XMMWORD PTR [rdx], xmm9
愚痴
これでなんとか50命令。
John the Ripperのx86-64.SでもS4は63命令程度なのでかなり減っています。
※ xmm0〜xmm5を入力パラメータとし、4つのポインタを出力先として取る点では、対等な比較ができるはずです。
これでpcmovのスループットがpand/pandn/por/pxorと同じでないとしたら結構きついかも。
AVXは、現時点でコード生成できるコンパイラがない(最新のIntel C++で対応?)が S4関数はKwanのnonstd.cベースでもコードは短めですみます。 AVXは2入力1出力の3オペランド形式により一時変数の待避が必要なくなるぶん、所要命令数を簡単に見積もることができ、41ゲート+出力値とのXORによる49命令で済ませることができます(変数は十分足りるのでメモリへの待避は不要で、もちろんYMMレジスタの上位に待避させる等という裏技も必要ありません)。
理想はAVX+SSE5か
デスティネーション・ソースの独立によるレジスタ待避命令の削減にしろ、論理演算回数の削減にしろ、どちらも最適化には有用であることにはかわりありません。そして、両方が使えるに超したことはありません。
AVXと、SSE5のVEXエンコーディング形式による真の4オペランド形式のpcmov(vpcmov?)が実現したとすれば32+8(4つの出力値とのXOR+ストア)の最短40命令程度で済みます。
もっとも、先にも言ってるとおり、性能がついてくるのはスループットが他の2ソース論理演算と同じという前提が必要です。
ちなみに、こんな感じになります。
vpor xmm10, xmm1, xmm4 vpcmov xmm7, xmm1, xmm4, xmm2 vpxor xmm12, xmm10, XMMWORD PTR [ALL_ONE] vpor xmm9, xmm4, xmm12 vpcmov xmm6, xmm12, xmm1, xmm2 vpandn xmm8, xmm6, xmm9 vpcmov xmm11, xmm6, xmm8, xmm0 vpxor xmm7. xmm7, xmm8 vpcmov xmm2, xmm11, xmm0, xmm2 vpxor xmm6, xmm6, xmm9 vpcmov xmm8, xmm6, xmm7, xmm0 vpcmov xmm7, xmm11, xmm8, xmm7 vpxor xmm9, xmm9, xmm7 vpcmov xmm7, xmm6, xmm1, xmm7 vpxor xmm13, xmm4, xmm7 vpcmov xmm14, xmm11, xmm8, xmm3 vpxor xmm8, xmm8, xmm2 vpcmov xmm9, xmm9, xmm13, xmm3 vpcmov xmm6, xmm7, xmm12, xmm6 vpcmov xmm9, xmm9, xmm14, xmm5 vpxor xmm6, xmm6, xmm0 vpcmov xmm14, xmm14, xmm9, xmm5 vpxor xmm10, xmm10, xmm8 vpxor xmm14, xmm14, XMMWORD PTR [rcx] vpcmov xmm10, xmm10, xmm11, xmm0 vmovdqa XMMWORD PTR [rcx], xmm14 vpcmov xmm4, xmm4, xmm13, xmm10 vpxor xmm2, xmm2, xmm4 vpcmov xmm8, xmm8, xmm10, xmm3 vpcmov xmm3, xmm6, xmm2, xmm3 vpcmov xmm3, xmm3, xmm8, xmm5 vpcmov xmm8, xmm8, xmm6, xmm5 vpxor xmm8, xmm8, XMMWORD PTR [rdi] vpxor xmm3, xmm3, xmm5 vmovdqa XMMWORD PTR [rdi], xmm8 vpxor xmm9, xmm9, xmm5 vpxor xmm3, xmm3, XMMWORD PTR [rsi] vmovdqa XMMWORD PTR [rsi], xmm3 vpxor xmm9, xmm9, XMMWORD PTR [rdx] vmovdqa XMMWORD PTR [rdx], xmm9
(2009.05.02追記)
AVX+XOPにより一個人の妄想は現実へと変わろうとしています。 上のコードは実際に使えるようになるでしょう。たぶん。
Keyword(s):
References:[Enhanced Bitslice DES] [Bitslice DES] [AVX vs SSE5]