並列化

並列化に着手しました.
最初は山下さんの解説とYSS掲示板の情報をもとに実装しようと思ったのですが,見事撃沈.結局並列探索の教科書といわれる?craftyのソースをもとに実装しました.いろいろやっているうちになんとなく動いたという危険な並列化なので,まだバグが残っているのは間違いないと思います….
1手1秒,駒の価値のみの評価関数で実験してみたところ,2CPU側の52勝25敗23引き分けと少なくとも弱くはなっていないみたいです.…というかむしろ勝率が良すぎるのが不気味です.1CPUでの探索時も空きスレッドはビジーループで待機させていたので,npsが若干落ちているのかもしれません.あとは思考時間が短いので最善手が変わりやすい,評価関数が駒の価値のみなので探索の性能が大きく影響する,といったことを考えればこれくらいなんでしょうか.

ルートでの並列化?

並列化の条件は,ルートを除く残り深さが3以上のノードとしています.ルートでsplitすべきかどうかというのは以前YSSの掲示板でもかなり議論されていた話です.私の理解では,

  • ルートでsplitする利点

 反復深化で現在の深さ+1の探索に早く進むことができる(可能性がある)

  • ルートでsplitしない利点

 制限時間が来た時に,ルートで探索が終了している手が多い方が有利
   (その時点での最善手として利用できるため)

という話だったと思います(間違っていたら教えてください…).
1段深く読むと実はとんでもない悪手だったことが分かったりすることもあるので,ルートでsplitする利点が全くないとはいえないのではないかと思っています.ただ,ある程度の深さ以上の探索では,ルートでsplitすることが深さnの探索早く終わらせることにどれだけ貢献できるかはかなり疑問だと思っているので,現在はルートでの並列化は行っていません.
まぁ,なんだかんだいって実は「ルートでsplitするのは何となく怖い」というのが結構大きい要因だったりするのですが.

ルートで並列化?(2)

ルートでの並列化も試してみました.

次の一手問題の解答時間(sec)
 基準深さ5基準深さ6
1CPU82.547210.562
2CPU(rootでsplitしない)57.828121.610
2CPU(rootでsplitする)49.984116.453

もう少し深いところまで実験してみないとはっきりしたことは言えないですが,浅い探索ではルートでのsplitは効果的ですが,ある程度以上の深さではそれほど効果は高くないのではないかと思います.(本当はルートでのsplitありとなしで自己対局させてみればわかりやすいのですが,そうなるとsplitしない方をもう少ししっかり実装しないといけなそうなので,それはまた今度…)
逆にルートでsplitしない方の利点は明確なので,当面はルートでのsplitはなしでやっていこうと思っています.