GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

デバッグ完了?

 http://d.hatena.ne.jp/Gasyou/20120225/1330175123 で書いたバグの件。

 http://d.hatena.ne.jp/Gasyou/20120229/1330512343 の「「4番目の合議クライアントが探索中」かつ「飛び利きが伸びる手*1」」って条件は間違ってました。正確には昨日書いた「5番目のクライアントが行動選択する時」でした。

 んで、原因。1インスタンスが2.6GBほどのクラスを作ると、メモリ上での配置がおかしくなるのが原因みたいです。

 こういうコードでインスタンスのメンバ変数のアドレスを、ヘッダファイルの上から順に出力してみます。

printf( "positions==        0x%p\n", &this->positions );
printf( "poloicies==        0x%p\n", &this->policies );
printf( "evaluators==       0x%p\n", &this->evaluators );
printf( "gameCount==        0x%p\n", &this->gameCount );
printf( "samplingCount==    0x%p\n", &this->samplingCount );
printf( "maxDerIndexArray== 0x%p\n", &this->maxDerIndexArray );
printf( "selectedMoveArray==0x%p\n", &this->selectedMoveArray );
printf( "pvArrays==         0x%p\n", &this->pvArrays );
printf( "scoreArrays==      0x%p\n", &this->scoreArrays );
printf( "finalTargetTurn==  0x%p\n", &this->finalTargetTurn );
printf( "piArrays==         0x%p\n", &this->piArrays );
printf( "returnArrays==     0x%p\n", &this->returnArray );

 結果はこうなります。(Windows 7 Home Premium x64、Visual Studio 2008、WIN32コンソールアプリケーション x64バージョン。)

positions==        0x000000007FFF0048
poloicies==        0x000000008251E008
evaluators==       0x00000000E9015448
gameCount==        0x00000000E9015488
samplingCount==    0x00000000E9015490
maxDerIndexArray== 0x00000000E9015498
selectedMoveArray==0x00000000E90154D8
pvArrays==         0x00000000E90164D8
scoreArrays==      0x000000001C9164D8
finalTargetTurn==  0x000000001EE964D8
piArrays==         0x000000001EE964E0
returnArrays==     0x00000000214164E0

 どうも、scoreArrays以降はアドレスの上位32ビットが0で埋められているっぽいです。

 結局、policiesとpiArraysの2つのメンバ変数を配列から配列へのポインタに変更し、1インスタンスで2GBを超えない様にすると治りました。

 …コンパイラの仕様なのかバグなのか知らないですが、警告なりエラーなり出して欲しかったな〜、コンパイル時に。

 あと、このバグは合議+方策勾配法固有のバグでした。方策勾配法のバグだったら、状況改善したかもしれないのに。残念。