FrontPage  Index  Search  Changes  PageRank  RSS  Login

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を構成する論理演算ゲート数の削減が期待できます。

ダウンロード

現状あまり需要がなさそうなのでマルチライセンスにはしておりません。

注意

こちらはあくまでビット論理演算の回数の削減のみに着目した最適化のみ行っております。実際の演算のスループットを反映したものではありません。従来の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により一個人の妄想は現実へと変わろうとしています。 上のコードは実際に使えるようになるでしょう。たぶん。

Last modified:2009/12/14 10:08:25
Keyword(s):
References:[Enhanced Bitslice DES] [Bitslice DES] [AVX vs SSE5]