コンピュータ将棋で使える?AVX-512

この記事はコンピュータ将棋 Advent Calendar 2016の24日目の記事です。

www.adventar.org

 

 

AVX-512とは


x86、x64命令セット*1で使える拡張命令です。
今(2016/12/24)売られているCPUで使えるのはXeon Phiのみです。
Xeon EやCore iシリーズでは来年発売のものからの予定のようです。
具体的にはSkylake Xeon、Canonlakeからとされてます。
(でも既に発売されているSkylakeなXeon E3は非対応)

AMDのCPUではまだ対応予定の発表は無いはずです。

AVX-512の中にはいくつか種類がありAVX-512対応を名乗るには最低AVX-512Fに対応していればよいそうです。

 

AVX-512の特徴


その名前の通り512bit幅のSIMD演算*2が出来ます。
ただそれだけでは無く、いろいろAVX2までのx86、x64のSIMDになかった新機能等が山盛りです。


まずはマスク機能。

命令を実行して結果をレジスタ*3に書き戻すときに一部の結果だけを書き戻す機能です。書き戻さない箇所はゼロクリアするか前のままにするか選択できます。この機能のためにANDのような論理演算にも32bitとか64bitの区別が出来ました。またマスク自体は7本のマスクレジスタ+マスクなしから選べますがこのマスクレジスタ同士でも簡単な論理演算ができ、マスクの作成負荷の軽減が出来ます。

 

次にレジスタの数が倍増。(x64限定)

SIMDレジスタの数が16本から32本になります。残念ながらx86モードではAVX2までと同様に8本のままです。
またAVX-512ではZMMレジスタを使いますが下位256bitは同じ番号のYMMレジスタが割り付けられており、AVX2からの自然な拡張となっています。

 

他は新命令の追加

スキャッター(Scatter)のような全く新規の命令追加がいくつかあります。
またそれ以外にも今まで32bitバージョンだけだった命令に64bit命令が追加されていたり、符号付のみだった命令に符号なし用命令が追加されていたりします。

 

他にもいくつかありますが省略。また対応していれば*4マスクや倍に増えたレジスタは512bit命令だけではなく256bit, 128bi命令*5でも使えます。これによりコンパイルオプションだけで倍に増えたレジスタをうまく使ってくれるかもしれません。

 

AVX-512の新命令(一部)

私が注目している命令を紹介します。少なくてもここで挙げた命令は対応CPUが手に入り次第、私は使う予定です。

 

スキャッター(Scatter)

VPSCATTERDD,VPSCATTERDD,VPSCATTERDD,VPSCATTERDD等

簡単に言うとAVX2にもあるギャザー(gather)の書き込み版です。
これで「gatherで集めて一気に演算するまではいいけど書き戻せないからSIMD化できない」ことは減ることでしょう。

 

3オペランド論理演算

VPTERNLOGD,VPTERNLOGQ

なんと3つの引数の論理演算ができます。
おそらく処理にかかる時間は単純な2引数の論理演算と一緒なのでうまく使えば処理時間を短く出来るでしょう。実はSSE,AVX命令の中で初めて1命令でNOTを取ることが可能になる命令です。

 

パーミュート(Permute)

VPERMI2B,VPERMT2B

AVX2以前にもいくつかありましたが1バイト単位で2本のSIMDレジスタ128バイト分を自由に1本のSIMDレジスタに並び替えるという今までになかった自由度を持つ命令が追加されます。 

 

でコンピュータ将棋の役に立つの?

基本的には少し高速化できるだけでしょう。
しかも512bit幅を処理するのに256bitずつ処理する*6可能性もあり、単純な512bit化だけでは速くならないかもしれません。
なので劇的に役に立つということは無いと思います。

 

AVX-512命令の使い方

AVX2までの拡張命令と変わりありません
暗黙的にはコンパイルオプションで最適化(自動ベクトル化機能)に任せるとか、ライブラリを使うことが出来ます。
明示的に使うには組込み命令(intrinsic)を使うのが一般的だと思います。
組込み命令(intrinsic)の使い方は明日のコンピュータ将棋Advent Calendar 2016のテーマです。

*1:普通のPCのCPUではx64命令セットが使われていると考えてよい。x64CPUには過去との互換性のためx86命令セットも使えるようになっている。

*2:1命令で複数の演算をすること。AVX-512では8bit×64並列,16bit×32並列,32bit×16並列,64bit×8並列が可能。

*3:CPUコアにあるデータの保存場所。現在のx86、x64CPUではμop(CPU内部命令)レベルでは通常の命令はこの中でしか演算できない。

*4:Xeon Phiで無ければ大丈夫

*5:AVX-512VLと言うそうです。

*6:Pentium4やPentiumMまではSSEの128bit命令を64bitずつ処理していた