並列探索をちゃんと作る

今まではCraftyを参考にしてましたが、なかなか解りにくくて
簡易的な並列探索しかやってませんでしたが、bona4のソースが解りやすいので
ちゃんと再帰的にsplitするコードに書き換え中です


従来は

探索中に残り3以上深さがあったら
4CPUのスレッドループすべてがアイドリング中ならば
現在探索中の情報を、4つのスレッドにそれぞれコピーし、それぞれ探索開始を指示
4つのスレッドがすべて探索が終わるまで待つ
 それぞれの探索の中でβカットが起きたら他の3つのスレッドすべてを停止
 もしαカットが起きたら探索値と手を保存して終了
4つのスレッドで最大の探索値を探索値とし、その探索手をハッシュに登録

というものでした。
これだと4CPUで並列探索時は良いのですが、途中で1,2と探索が終了して、
最後の1つが探索中は、残りの3CPUが遊びます。
あくまで全員の仕事が終わるまでの間で並列探索できるだけ。


改善版の動きは

探索中に残り3以上深さがあったら
4CPUのスレッドループのうちアイドリング中のスレッドがあれば
現在探索中の情報(親)を、そのスレッド(子)にコピーし、探索開始を指示
同じ親を持つスレッドがすべて探索が終わるまで待つ
 それぞれの探索の中でβカットが起きたら他の同じ親を持つ子のスレッドすべてを停止
 もしαカットが起きたら探索値と手を保存して終了
同じ親をもつ子のスレッドで最大の探索値を探索値とし、その探索手をハッシュに登録

これなら4CPUで探索中に、2CPUの探索が終了した時は、まだ探索中の2CPUの探索の中で
さらに余っている2CPUを使って再帰的に探索が動きます。
同じ親をもつ子供同士でグループにしているのがミソです。


まだ時々エラーで止まるので不完全です(汗