やねうら王 classic v2.15のNEW_TTなしの不具合 [コンピュータ将棋]
Aperyでコンパイルでグローバル変数が0になる問題もC++14によるスマートな解決方法が見つかったのと、mingwがあまりに不安定なので、やねうら王の不具合解析なるものをやってみた。
誰かやねうら王miniのデバッグきぼんぬhttp://yaneuraou.yaneu.com/2016/03/01/%E8%AA%B0%E3%81%8B%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8Bmini%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%8D%E3%81%BC%E3%82%93%E3%81%AC/
■セットアップ
txtファイルとかが、ほんとうに親切
評価関数のバイナリはコンピュータ将棋選手権のページから落としてくる
■ビルド
VisualStudioでビルドするだけ
■設定
とりあえずいつも通り4コア。
デフォルトで置換表サイズが16MBになっているが、将棋所で1秒自己対戦させるとハッシュが溢れるので128MBぐらいにしておく。
■NEW_TTありなし
NEW_TTありが16bit Keyの最新Stockfishの置換表
NEW_TTなし(以下OLD_TT)は2013年頃までの古いスタイル+独自拡張
NPSは17万~23万ぐらい
全幅探索はNEW_TTが17~22ぐらい、OLD_TTが14~16ぐらい
■バグ
NEW_TT同士では更新履歴に書いてあるようなクラッシュする不具合は簡単に出なかった
次に、NEW_TTvsOLD_TT
NPSはほとんど同じだが、NEW_TTのほうがたまに謎の高速化で全幅探索で+5ぐらいいくときがあり、微妙な局面で5手も先に読むと中盤から引き離して圧勝。レーティングは200以上差があるように思われる。
OLD_TTは結構落ちやすいようで、1回目は37戦で発生したが、PDB保存してなかったので再度実行。2回目は一晩放置して66戦で発生した。
2回目のクラッシュをデバッガで確認したところ、更新履歴に書いてあるようにinsert_pv_in_ttのアサートに引っかかっていた。早い話PVが合法手ではなかったので引っかかっていたが、その内容が後手による8九歩打だった。
こういうのが出るときはpseudoLegalと相場が決まってるのでposition.cppを見てみたところ、8九に歩を打つかどうかのチェックが入っていなかった。ひとまず入れたところ、NEW_TTより遅いだけの安定したバージョンができたように見えた。
が、コメントを読んでいるうちに怪しい箇所を見つけた。
例えばPromotionの場合は
と書かれているが、駒打ちのほうだと
最初は合法手チェックが入ってないだけだと思っていたのだが、「bit 0」は置換表に入れるときに潰してる部分なので、コメントの想定通りになっていない。
bit 0を潰しているので後手が打った手を先手が取り違える可能性があり、△8九歩打の理由が説明できる。
ついでに、このような条件にどの程度ぶつかるか、benchコマンドで確認した。
自分のPCでは約585万回書き換えにくるが、その際にDropが違法手になるのは3回だった。
これをビット0を保存するようなハッシュキーにしたところ、発生回数が0回になったので、多分コメントに書いてあるような想定通りに動いていると思われる。(と思ったけど、下のようにサイズ変えるだけで出たり出なかったりするのでイマイチ自信がない)
NEW_TTのときになんでこうならなかったのかは、置換表のキーサイズが16ビットからだという奇妙な現象だった。OLD_TTでキーサイズを48bit => 32bit => 16bitと試してみたところ、ハッシュキーが衝突したうえでDropする3回の現象が、でる => でる => でない となった。すごい、意味がわからない。NEW_TTで現象が出ないのはたまたまなのか、何かしらの理由があるのかは今後の課題とする。(やらないパターン)
追記
一応一晩走らせてみたところ、NEW_TT 128-9-63 OLD_TT となったので、探索速度的なレーティング差とほぼ同じになったのででかい問題はないと思われる。
誰かやねうら王miniのデバッグきぼんぬhttp://yaneuraou.yaneu.com/2016/03/01/%E8%AA%B0%E3%81%8B%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8Bmini%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%8D%E3%81%BC%E3%82%93%E3%81%AC/
■セットアップ
txtファイルとかが、ほんとうに親切
評価関数のバイナリはコンピュータ将棋選手権のページから落としてくる
■ビルド
VisualStudioでビルドするだけ
■設定
とりあえずいつも通り4コア。
デフォルトで置換表サイズが16MBになっているが、将棋所で1秒自己対戦させるとハッシュが溢れるので128MBぐらいにしておく。
■NEW_TTありなし
NEW_TTありが16bit Keyの最新Stockfishの置換表
NEW_TTなし(以下OLD_TT)は2013年頃までの古いスタイル+独自拡張
NPSは17万~23万ぐらい
全幅探索はNEW_TTが17~22ぐらい、OLD_TTが14~16ぐらい
■バグ
NEW_TT同士では更新履歴に書いてあるようなクラッシュする不具合は簡単に出なかった
次に、NEW_TTvsOLD_TT
NPSはほとんど同じだが、NEW_TTのほうがたまに謎の高速化で全幅探索で+5ぐらいいくときがあり、微妙な局面で5手も先に読むと中盤から引き離して圧勝。レーティングは200以上差があるように思われる。
OLD_TTは結構落ちやすいようで、1回目は37戦で発生したが、PDB保存してなかったので再度実行。2回目は一晩放置して66戦で発生した。
2回目のクラッシュをデバッガで確認したところ、更新履歴に書いてあるようにinsert_pv_in_ttのアサートに引っかかっていた。早い話PVが合法手ではなかったので引っかかっていたが、その内容が後手による8九歩打だった。
こういうのが出るときはpseudoLegalと相場が決まってるのでposition.cppを見てみたところ、8九に歩を打つかどうかのチェックが入っていなかった。ひとまず入れたところ、NEW_TTより遅いだけの安定したバージョンができたように見えた。
が、コメントを読んでいるうちに怪しい箇所を見つけた。
例えばPromotionの場合は
// --- 成らない指し手 // 駒打ちのところに書いた理由により、不成で進めない升への指し手のチェックも不要。 // 間違い → 駒種をmoveに含めていないのでこのチェック必要だわ。
と書かれているが、駒打ちのほうだと
// --- 移動できない升への歩・香・桂打ちについて // 打てない段に打つ歩・香・桂の指し手はそもそも生成されていない。 // 置換表のhash衝突で、後手の指し手が先手の指し手にならないことは保証されている。 // (先手の手番の局面と後手の手番の局面とのhash keyはbit0で区別しているので) // ゆえに、ここではこれ以上のチェックは不要なのである。
最初は合法手チェックが入ってないだけだと思っていたのだが、「bit 0」は置換表に入れるときに潰してる部分なので、コメントの想定通りになっていない。
uint64_t key32 = key >> 16;
bit 0を潰しているので後手が打った手を先手が取り違える可能性があり、△8九歩打の理由が説明できる。
ついでに、このような条件にどの程度ぶつかるか、benchコマンドで確認した。
自分のPCでは約585万回書き換えにくるが、その際にDropが違法手になるのは3回だった。
これをビット0を保存するようなハッシュキーにしたところ、発生回数が0回になったので、多分コメントに書いてあるような想定通りに動いていると思われる。(と思ったけど、下のようにサイズ変えるだけで出たり出なかったりするのでイマイチ自信がない)
NEW_TTのときになんでこうならなかったのかは、置換表のキーサイズが16ビットからだという奇妙な現象だった。OLD_TTでキーサイズを48bit => 32bit => 16bitと試してみたところ、ハッシュキーが衝突したうえでDropする3回の現象が、でる => でる => でない となった。すごい、意味がわからない。NEW_TTで現象が出ないのはたまたまなのか、何かしらの理由があるのかは今後の課題とする。(やらないパターン)
追記
一応一晩走らせてみたところ、NEW_TT 128-9-63 OLD_TT となったので、探索速度的なレーティング差とほぼ同じになったのででかい問題はないと思われる。
コメント 0