初期局面での差分指し手生成

昨日の記事で差分指し手生成に成功したと書いたが、差分指し手生成とは次の3つの段階にわけられる。

1) MakeMoveで利きの更新を行ない、影響を受ける駒を確定させておく。
2) gen_XXXでは、そこでdirty flag(指し手のupdateを要する駒を示すフラグ)の立っている駒だけ指し手の生成をしなおす。
3) gen_XXXでは、そのあと生成された指し手をシリアル化する。

大雑把に説明すればそういうアルゴリズムである。詳しいことは、また別に記事を書こうと思う。

ともかく、差分指し手生成による初期局面(ぐらいの指し手数である局面)の全指し手生成の速度は、昨日の実験では50M回/4602[ms] (Core2Duo 2.8GHz/シングルコア/VC++ PGOなし)だったが、そんな遅いはずがあるかといじくり回した結果50M回/2661[ms]になった。18.8M回/secである。まだ速くなると思う。

このスコアは、言うまでもなく上記3)のみの時間だ。1),2)が含まれていない。言わばインチキ参考スコアである。

であるから、3)だけ速くしても仕方ないと思われるかも知れないが、2)と3)は密接に関係していて、3)を高速化する技法がそのまま2)でも使えるのできちんと練らなければならない。

あと、私は1),2)の処理にどれくらいのCPU時間が必要なのか正確に検証できていない。そもそもまだ2)がまともに書けていない。2)を高速化するにはいくつか未解決の問題がある。難問というほどではないが、下手な実装をすると元の指し手生成より遅くなりかねないので、うまい実装法が問われる。