bonaの手生成のソースを読んでみました

今日は朝にすき屋で牛丼買って出勤したので、昼休みの外出無し
牛丼食べながら、読んでみました。


GenCapやGenNoCapは、misakiともそんなに違わない感じですね。
bonaはベタに書いてますが、私の方は、関数化して読んでます。
forceinlineすると凄く速くなりました。このへんは保守性の違いだけかもしれません


misakiの方は、moveGenということで、cap/noCap区別無くまとめて生成してます
逐次生成をやってないので、SEEでオーダリングをして指してますので。
静止探索用には、別にgenCap/genCap2みたいに作ってます。


肝心のdropGenですが、
bonaの場合、まず持ち駒の有無で、持ってる駒だけの手のリストを作っておいて、
盤上の空白マスに対して、リストを手配列に転送しているイメージでした。
unrollはやってないけれど、はじめに持ち駒ごとのリストを作っているので、


盤上のスキャンに対しては、持っている持ち駒毎の処理が走るというイメージです。
これはこれで巧妙ですね。
一般的には、盤上スキャンして空白マスごとに持ち駒の手を転送していく処理で発想すると思うので、
unrollしないと、持ってない駒を持っているか確認する無駄な処理が、空白マスの数だけ行われるわけです
make_listもそうだけど保木さんはlistが好きなのかもしれない。


手の代入に関しては、bonaは

      *pmove++ = To2Move( to ) | From2Move( from ) | Piece2Move( pawn );

手は32bitなのでpmoveポインターで代入。構造体を使わずにシフトで各要素を結合しているわけです。


misakiの場合は手が64bitの構造体で、

t[tp].koma=SFU;
t[tp].to=to;
t[tp++].from=from;

なイメージです。

tt->koma=SFU;
tt->to=to;
tt->from=from;
tt++;

みたいに改造すれば多少速くなるかな?(^^; 家帰ったら試してみます。
結局、レジスタだけで回るか、メモリアクセスするか?の勝負かもしれません。
↑bonaみたいな手の持ち方は改造範囲が広すぎて断念したので