CUDAとデバッガを使うときは、オプティマイズにご用心

CUDA SDKに付属のビルドルールファイルを適用して、デフォルト設定でビルドすると、オプティマイズが"Maximum Speed(/02)"になっている。これは、debug版でも同じである。

VisualC++の普段の開発では、debug版はデフォルトではオプティマイズは「無効」なので、そのつもりでいると上記に気付かない。上記オプティマイズはnvccでビルドするCPU側のコードにも適用されるので、特にデバッガを使うときは注意が必要である。

というのも、上記のようにオプティマイズ有効でビルドしたコード(ホスト処理部分)をステップ実行すると、変数メモリの内容が正しくウォッチできない場合があるからである。オプティマイズにより、オート変数等も高速化のためレジスタ上で処理されて、毎回デバッガが見ている変数メモリ領域へ書き戻されない場合があるようだ。するとステップ実行中、変数値が変化することを期待して変数ウォッチを見ていても値が変化せず、「バグか?」と悩むことになる。

というわけで、デバッガで変数値をチェックする際は、CUDAのビルドルールのオプティマイズの項目も"Disabled (/Od)"にしておくのが、一番確実である。