なんちゃって並列探索
諦めたとか言いつつ、未練たらたらの
とりあえず、なんちゃって並列探索っが動いた。
CraftyのPVSのようにノードを複数のスレッドで分割して処理するみたいなことではなくて、
反復進化のトップを同時に二つのスレッドで処理開始するだけ。
実際は同じ探索をしておかしくないと思うんですが、ハッシュは共有しているので
途中から探索が変わってくる。
まだハッシュのロックとかはしてないので、壊れててもかまわない。
そんな段階。
cpu0が探索を開始するときに、盤面をcpu1にコピーして、cpu1も探索させて、
cpu0の探索が終わったら、chudan_flagでcpu1を終了させて、
止まったのを確認したら自分も終了するってだけ。
相手の思考中に思考する処理を参考にしてみました(うさぴょんソースを参考にしてます)
実際は、
WaitForMultipleObjects
とかを使うようですが、いきなり高度なことはできないので、まずは並列処理に慣れてみようと思います
void __cdecl test(void *arg) { memcpy( cpu1.ban,cpu0.ban, sizeof(cpu1.ban) ); memcpy( cpu1.hand,cpu0.hand, sizeof(cpu1.hand) ); cpu1.initGame2(); cpu1.initKyokumen(); cpu1.initKiki(); cpu1.thinkI=cpu0.thinkI; printf("\n-------------cpu2-------------------\n"); cpu1.print3( cpu1.thinkI ); printf("\n------------------------------------\n"); cpu1.think0( cpu1.thinkI, 1 ); cpu1.nowThinking=0; } int Shogi::think(uchar SorE,char mode) { _beginthread( test ,0, 0 ); int ret=think0(SorE,mode); if( cpu1.nowThinking==1 ) { cpu1.chudan_flag=1;//思考中断フラグを立てる while( cpu1.nowThinking==1 ) printf("");//予測探索スレッドが終了するのを待つ } cpu1.nowThinking=0; }
しかーし、Athlon 64 x2 4400+使ってますが、CPU使用率が50%しか動かない。
複数スレッドをマルチコアで動かすには、コンパイルオプションなんだろ?(検索中)
たんにバグでしたCPU使用率は100%いきました。
単純にこれでいいですね。
同じ局面になるように同じ手を指して、探索すればいい。
ただ、やはりハッシュが壊れて、途中から評価値がめちゃくちゃになって異常終了しました(´・ω・`)ショボーン
lockしてみます。
void __cdecl test(void *arg) { cpu1.think0( cpu0.thinkI, 2 ); cpu1.nowThinking=0; } int Shogi::think(uchar SorE,char mode) { _beginthread( test ,0, 0 ); int ret=think0(SorE,mode); if( cpu1.nowThinking==1 ) { cpu1.chudan_flag=1;//思考中断フラグを立てる while( cpu1.nowThinking==1 ) printf("");//予測探索スレッドが終了するのを待つ } return ret; }
ハッシュを未使用でコンパイルしたバイナリなら異常もなく動きました。やはり壊れてるようです。
記念すべき初並列探索
しかし、ハッシュも共有してないし、二台のパソコンで同時に探索しただけと同じで、
まったく何の意味もない。
なお、[0][1]がスレッドの番号。
完全に同じ探索経路でした。ハッシュ共有してないし当然。
ハッシュを共有すると、情報を互いにぶつけ合うので、カオスが生まれるといえるのかも。
npsは150Kぐらいのが合算して235Kぐらいになってました。
なんにせよハッシュ共有しただけで意味があるか分かりませんが、やらないよりマシかなって程度。
▼持駒v歩v銀 9 8 7 6 5 4 3 2 1 987654321 ---------------------------+ ------------------+ v香v桂 ・v金v玉 ・ ・v桂v香|一 0 0 0 0 0 0 0 0 0|一 ・ ・v銀 ・ ・v銀v金 ・ ・|二 -1 0 0 0 0 0 0 0-1|二 v歩 ・v歩v歩v歩v歩 ・v歩 ・|三 -1 0 0 0 0 0 0 0-1|三 ・ ・ ・ ・ ・ ・v歩 ・v歩|四 0 0 0 0 0 0 0 0-1|四 ・ ・ ・ ・ ・ ・ ・ ・ ・|五 0 0 0 0 0 0 0 0 0|五 ・ 歩 歩 歩 飛 歩 歩 ・ 歩|六 0 0 0 0 0 0 0 0 1|六 歩 ・ 角 ・ 歩 ・ 桂 ・ ・|七 1 0 0 0 0 0 0 0 1|七 ・ ・ 金 銀 ・ 金 ・ ・ ・|八 1 0 0 0 0 0 0 0 1|八 香 桂 ・ ・ 王 角 ・v龍 香|九 0 0 0 0 0 0 0 0 0|九 ---------------------------+ ------------------+ △持駒 歩 gen:79 ▼19龍(2025)▼15歩(1569)▼64歩(1497)▼44歩(1495)▼28銀打(1476)▼27銀打(14 64)▼39銀打(1458)▼28龍(1457)▼82銀打(1455)▼26銀打(1446) [1]#1 0.0s +2025 ▼19龍 [1]#2 0.0s +1418 ▼19龍△85歩 gen:79 ▼19龍(2025)▼15歩(1569)▼64歩(1497)▼44歩(1495)▼28銀打(1476)▼27銀打(14 64)▼39銀打(1458)▼28龍(1457)▼82銀打(1455)▼26銀打(1446) [0]#1 0.0s +2025 ▼19龍 [0]#2 0.0s +1418 ▼19龍△85歩 [1]#2 0.0s +1581 ▼39銀打△38金 [0]#2 0.0s +1581 ▼39銀打△38金 [1]#3 0.0s +1581 ▼39銀打△38金▼19龍 [0]#3 0.0s +1581 ▼39銀打△38金▼19龍 [1]#4 0.1s +1114 ▼39銀打△47金▼19龍△85歩 [0]#4 0.1s +1114 ▼39銀打△47金▼19龍△85歩 [1]#4 0.1s +1301 ▼19龍△65歩▼44歩△同角 [0]#4 0.1s +1301 ▼19龍△65歩▼44歩△同角 [1]#5 0.5s +1258 ▼19龍△65歩▼54香打△11角成▼56香 [0]#5 0.5s +1258 ▼19龍△65歩▼54香打△11角成▼56香 [0]#6 3.1s +1258 ▼19龍△65歩▼54香打△11角成▼56香△同歩 [1]#6 3.0s +1258 ▼19龍△65歩▼54香打△11角成▼56香△同歩 [1]#7 14.9s +1301 ▼19龍△65歩▼54香打△11角成▼56香△21馬▼22金 [0]#7 15.4s +1301 ▼19龍△65歩▼54香打△11角成▼56香△21馬▼22金 BEST:23.95s +1301 ▼19龍△65歩▼54香打△11角成▼56香△21馬▼22金