整数の積和算を倍精度の積和算演算器を借りて52ビット精度で実行する。BWに入っていないbyte操作の命令。ニューラルネットワーク処理用の整数演算命令。16bit整数同士の積を32bit整数と足す。ニューラルネットワーク処理用の整数演算命令。16bit整数同士の積を32bit整数と足すのを4回繰り返す。単精度の内積を4回繰り返す。これもニューラルネットワーク処理用。ベクトル化されたpopcount。BWにもVBMIにも入っていないbyte操作の命令。ビット操作関連の命令。マスク演算AVX512では比較演算の結果などはマスクレジスタと呼ばれる特殊なレジスタに格納されます。AVX512では命令にマスクとしてマスクレジスタを指定することができます。b[i+63:i]このようにマスクでビットが立っている場所を演算せずに値を残すことが可能です。値を残す代わりに0にすることもできます。マスクあり(マスクされたら0)のように使います。マスク同士の演算このマスクレジスタはSIMDレジスタ(XMM/YMM/ZMMレジスタ)とも通常のレジスタとも違うので、通常のレジスタとマスクレジスタとの間で値をやりとりするのにもコストがかかります。addなど)はマスクレジスタ同士で行えるようになっています。命令の解説AVX512-FVPTERNLOG{D,Q}ビット単位の任意の3項演算ができます。演算内容は即値で与えます。0xD0を与えてやれば良いです。0xD0)のように使います。これを使えば他のビット論理演算命令いらないじゃんとなりそうですが、怪しいページによるとスループットが2命令/サイクルとandやorなどの3命令/サイクルに比べると劣るので適材適所で使うことになりそうです。マスクが32bit/64bit単位で指定できます。VPS{L,R}{L,A}{,V}{W,D,Q}16bit/32bit/64bit単位のビット{論理,算術}シフトです。V付きはシフト量もベクトルで指定することで、各データごとに異なるシフト量を指定できます。VPRO{L,R}{,V}{D,Q}待望のローテート命令です。32bit/64bitだけ。上位ビットから見て最初に1が立っているビットの位置を調べる。整数→浮動小数の変換で前からほぼ同じことができましたが、キャストとか0の特別扱いとか諸々せずに済むようになりました。Detectionに入っているんでしょうか。AVX512-VBMIVPERMI2B各バイトの下位7bitをインデックスにして、2つのZMMレジスタをくっつけた128bytesの中から表引きします。これまでの128bit境界に捕われていたり、即値で指定しないといけなかったりしたシャッフル命令とはおさらばできます。いえスループットやレイテンシが大きかったら従来のシャッフル命令も併用しないといけなさそうですね。VPMULTISHIFTQB各64bit要素に対して各バイトの分だけ右シフトしたデータを返します。tmp[7:0]AVX512-VBMI2VPSH{L,R}D{,V}{W,D,Q}2つの値をつなげてシフトします。多倍長シフトとかに使えますね。V付きの命令はシフト量もベクトルで指定することで、各データごとに異なるシフト量を指定できます。count(1になっているビットの数を数える)です。AVX512-BITARGVPOPCNT{B,W}8bit/16bit単位でのpopcountです。VPOPCNT{D,Q}とは別の拡張になっています。VPSHUFBITQMB謎命令。各64bit要素に対して、各バイトをインデックスとして64bitデータの指定したビットを取ってきてマスクにします。疑似コードを見るのが早いと思います。resAVX512以外の拡張VPCLMULQDQ繰り上がりなしの64bit乗算を並列で行います。diaryとかに使えそうですね。便利Intrinsic_mm512_reduce_{or,and}_epi{32,64}32bit/64bitデータ16/8個のOR/ANDを取ります。reduced[63:0]まとめAVX512にはどう使うかよくわからない便利そうな命令がたくさん追加されています。使えるCPUを手に入れた暁にはうまく使ってビット演算ライフを満喫しましょう!明日のKMCアドベントカレンダーはwass88さんによる「役に立たないこと」の予定です。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。