やっと並列化のバグがとれたかも..
いやー、今回はしんどかったです。
コンピューター将棋のデバッグってこんなに大変なのですね..。
たとえば特定の条件下で正しく1手詰めが判定されずに落ちるようなバグがあるとして、その条件に合致する局面に遭遇する確率が一定だとすると、ランニング時に落ちる確率は探索した局面数におおよそ比例して上がっていきます。
つまり、1分切れ負け×50回やっても探索局面数が少なければ、あまり適切なテストにはなっていないわけです。1分切れ負け×50回で落ちなかったのでバグがとれたのかと思ってfloodgateに参戦させると1回目で落ちたりするわけです。
次に、デバッグビルドとリリースビルドとでnpsが2桁ぐらい違うというのがあります。落ちたときにデバッガでアタッチして調べるためにはデバッグビルドでテストしたいのですが、そうしますとnpsが2桁少ないです。要するに落ちる確率も2桁ぐらい少ないです。これではなかなか落ちません。
私の今回の並列化では置換表絡みのバグで複数のスレッドから同時に更新されたときにまずい書き方をしている部分があったのですが、開発環境とfloodgateへ参戦しているマシンとでは置換表サイズが異なります。そうしますと、開発環境では落ちないのにfloodgateへ参戦しているマシンだとすぐに落ちるだとか、その逆とかも存在します。
あと開発環境は2コア2スレッドですが、floodgateへ参戦しているマシンは4コア8スレッドです。スレッド間で競合が起きる確率も全然違ってきます。
「floodgateに参戦させているマシンでランニングしろよ!!」と言われるとまったくもってそうなのですが、このマシンで落ちることがわかってもデバッグのために何の役にも立たないのでこのマシンではランニングしてなかったんですよね…。
とりあえず、バグがとれたと思うので、いまfloodgateに参戦させているマシンで自己対戦×100回をしています。100回完走したらfloodgateに投入します。