並列探索をちゃんと作る
今まではCraftyを参考にしてましたが、なかなか解りにくくて
簡易的な並列探索しかやってませんでしたが、bona4のソースが解りやすいので
ちゃんと再帰的にsplitするコードに書き換え中です
従来は
探索中に残り3以上深さがあったら 4CPUのスレッドループすべてがアイドリング中ならば 現在探索中の情報を、4つのスレッドにそれぞれコピーし、それぞれ探索開始を指示 4つのスレッドがすべて探索が終わるまで待つ それぞれの探索の中でβカットが起きたら他の3つのスレッドすべてを停止 もしαカットが起きたら探索値と手を保存して終了 4つのスレッドで最大の探索値を探索値とし、その探索手をハッシュに登録
というものでした。
これだと4CPUで並列探索時は良いのですが、途中で1,2と探索が終了して、
最後の1つが探索中は、残りの3CPUが遊びます。
あくまで全員の仕事が終わるまでの間で並列探索できるだけ。
改善版の動きは
探索中に残り3以上深さがあったら 4CPUのスレッドループのうちアイドリング中のスレッドがあれば 現在探索中の情報(親)を、そのスレッド(子)にコピーし、探索開始を指示 同じ親を持つスレッドがすべて探索が終わるまで待つ それぞれの探索の中でβカットが起きたら他の同じ親を持つ子のスレッドすべてを停止 もしαカットが起きたら探索値と手を保存して終了 同じ親をもつ子のスレッドで最大の探索値を探索値とし、その探索手をハッシュに登録
これなら4CPUで探索中に、2CPUの探索が終了した時は、まだ探索中の2CPUの探索の中で
さらに余っている2CPUを使って再帰的に探索が動きます。
同じ親をもつ子供同士でグループにしているのがミソです。
まだ時々エラーで止まるので不完全です(汗