BMI使ってますか?

知っている人は知っているかと思いますが、Haswellになってから、Bit Manipulation Instructions Sets (BMI sets)という命令セットが使えるようになりました。

http://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets#BMI2_.28Bit_Manipulation_Instruction_Set_2.29

SIMD用ではないので汎用レジスタ(64bit)に対してしか使えませんが、面白い命令がいくつかあります。
例えば、PEXTというParallel bits extract命令。これはなかなか使えます。

例えば、60bit目,30bit目,12bit目を1にしたbit maskを用意したとします。このmaskを指定してPEXTを使うと、入力レジスタの60bit目と30bit目と12bit目が、結果レジスタの2bit目,1bit目,0bit目に来ます。凄いですね。magic bitboardとは何だったのかという感じです。

そもそもmagic bit boardは将棋ではテーブルサイズが大きくなりすぎて使えないと私は考えています。magic bitboardで速くなったとか言って喜んでいられるのは、評価関数テーブルが小さくてメモリ帯域が無視できているうちだけで、評価関数をうまく設計するなら、評価関数のパラメーターはメモリ帯域の限界まで大きくしたほうがソフトの棋力は上がるわけですから、magic bitboardはいずれは使えなります。

まあ、それはそれとして、PEXTを用いて、玉の周辺24近傍の駒の有無を調べてテーブルを引くために、直列化された24bitを得るなんてことも簡単に出来ます。

mask = around24[king_sq];
serial24 = _pext_u64(occupied, mask);
※ 64bitの盤面ならば。将棋では盤面は64bitに収まらないのでこのコードではうまくいきませんが応用は容易ですよね..。