ai65536's blog

将棋とかプログラムとか

AperyをVisual Studioでビルドして動作させる。

AperyをVisual Studio2013でビルド、動作させた時のメモ

 

ソースはaperyからforkして修正したものが以下のところにあります。

github.com


 

エラーになるところを変更

文字コードUTF-8 (!= UTF-8N)に統一

constexprを使用しないように変更、constexprを使う一部インライン関数はマクロに変更

 

この変更でビルドは通りますが、起動すると正常に動作しません。

 

動作の不具合箇所修正

デバッガで追ってみるとスレッド関連で不具合が起こってそう。

ぱっと見のコードは正しい(gccで動作しているのであたりまえだけど)ので、

さらにデバッガで追うとThreadを継承しているMainThreadでThreadのidleLoopが呼び出されている。

Aperyはスレッドの作成をTheradクラスのコンストラクタ内で行っているけれど、

これがどうも悪さをしてそうな感じ。

stockfishの該当部分のコードを参考にnewした後にスレッドを作成するように変更、あわせて破棄する部分のコードも変更をいれる。

 

これで直ったかとおもったら、quit後にAperyが正常終了しない。

デバッガで止めてみるとスレッドをjoin()したところでふんづまってる。

Aperyはスレッドの破棄をスレッドプールのデストラクタで行っているけれど、このスレッドプールはグローバル変数、スレッドの破棄はmain関数を抜けたあとに行われていることになる。

考えるのが面倒だったので、この部分もstockfishを参考にmain関数の最後に行うように変更すると、正常に終了するようになった。

追記

Hashのサイズを小さくすると、メモリ確保に失敗するという変な現象がでていて、調べるとfirstOneFromMSB()で使われている_BitScanReverse64()関数はgcc系の__builtin_clzll()と戻り値が逆なので、MSB側からカウントした値に変換する必要があります。

さいごに

AperyをVisual Studio2013でビルド、動作させることができた。

素晴らしい将棋エンジンのソースコードを公開してくれた平岡さんに感謝。

 

ShogiGUIでの対局の様子

f:id:ai65536:20150321120525p:plain