2012-02-06 8 views
3

私はCUDAプログラムを持っています。このプログラムを-g -Gオプションでコンパイルすると、正しい出力が得られます。 -g -Gオプションを付けずにコンパイルすると、正しい出力が得られるとは限りません。私の推測では、-g -Gオプションを指定しないと、コンパイラはプログラムを最適化し、競合状態を引き起こします。誰もがこれを確認し、-g -Gオプションなしでプログラムをコンパイルしても、プログラムが正しい出力を生成するためにはどうすればいいのか教えてください。ありがとうオプションの有無にかかわらずCUDAプログラムをコンパイルするときの違い-G

オペレーティングシステム:x86_64 GNU/Linux CUDAバージョン:4.0 デバイス:Geforce 200、これはマシンに接続されたGPUSの1つで、表示デバイスではないと私は思います。

答えて

4

-Gは、デバッグシンボルを生成することによってデバッグデバイスコードをイネーブルにし、デバイスコードの最適化をディセーブルにします。 -gは、ホストコードのデバッグシンボルの生成を可能にするホストコンパイラのオプションです(ホストコードの最適化を無効にすることもあります)。

これは、最適化が無効になっているときに排除される競合状態を示している可能性があります。たとえば、デバイスコードに__syncthreads()がないと、コードが正しくなります。それがなければ、コンパイラは、間違った結果を生成する原因となるロードまたはストアを移動させている可能性があります。バリア(__syncthreads())が交差していない場合、そのようなコードの動きは完全に有効な最適化です。 -Gを指定すると、このような最適化はおそらく無効になるため、競合状態は明示されません。

まず、GPUデバッグを無効にして(-Gを削除する)、CPUのデバッグを有効にして(-gを放置する)、CPUコードではなく失敗したGPUコードであることを確認します。

次に、失敗している特定のカーネルに絞り込みます(これを絞り込むプロセスはプログラムによって異なります)。このカーネルを調べて、同期が必要な場所を探してください(共有メモリの依存関係は一般的な状況です)。しかし、持っていません。

見つからない場合は、間違った結果を得ている特定のカーネルに絞り込むことができます。可能であれば、ここでカーネルコードを共有してみてください。

+3

別の可能性(必ずしもCUDA特有ではない)は、デバッグコード対リリースコードの結果として異なる値を取る初期化されていない変数の存在です。これはプログラムの動作にも影響する可能性があります。 –

+0

はい、それを含めなかったとは思えません。これは「デバッグビルドでのみ動作する」バグの最も一般的な原因です... – harrism

関連する問題