並列探索を実験中

やらねばと思いつつかなり時間が経ってますが、改良も行き詰ってるので並列探索に取り組み中です(^^;


ルートでの並列探索は実はできているんですが、自己対戦で芳しくなかったので
ソースを見なしました。いくつか修正しました。
並列探索しても効率が悪いとはよく言われますが(一説ではSQRT(コア数)程度の伸びとか) 
シングルで反復進化が9回回っていたのが、並列探索で10回回れば、そりゃ強くなるはずです。


みやみにやっても効率が落ちるので

		if( retval!=ValueNone && (
				(tp-i>=30 && (depthMax-depth)>=4 ) || (tp-i>=20 && (depthMax-depth)>=5 )
			)
		)

残り30手以上ある&残り深さ4ある
または
残り20手以上ある&残り深さ5ある
ぐらいでやってみました。


すでに並列探索をやってる人はCraftyのやり方のように、再帰的に分割されていると思いますが、
根性なしなので、まずはルートのみです。


①ルートでalpha更新が発生したときに、PVSのカットノード探索を並列に行います。
②並列探索中にbetaカットが起きれば他のスレッドもすべて強制停止して探索終了
③各スレッド内でalpha更新してしまった場合は、独自にalpha更新して、カットノード探索を継続します。


※あるコアが先に探索終了したら、全部のスレッドが探索が終わるまで待ち状態になるので、効率が悪いです。
※あとalpha更新しても他のスレには情報が行かないので、
他のスレはシングル探索で見つけたPVのalphaでヌルウィンドウ探索を継続しますので
ウィンドウの面でも効率が悪いです
(もっともalpha更新を他のスレッドに伝えても、さほど効果が無かったと山下さんが書いてました)
※ルートでは並列化しないほうがいいという議論がYSSの掲示板で過去にありましたが、お手軽なのでルートでのみやってみます(^^;


とりあえずデバッグモードで自己対戦させてるので、問題ないようなら、シングルVSデュアルコアで対戦させてみようと思います。
1回対戦させたらデュアルが勝ちました。