2012-03-08 28 views
4

誤ったメモリアクセスに関するエラーを取得するためにcuda-memcheckをうまく使用しました。cuda-memcheck、アドレスからソースコードを取得する方法は?

========= Error: process didn't terminate successfully 
========= Invalid __global__ read of size 1 
=========  at 0x00000710 in /some/path/somefile.cu:117:some_function 
=========  by thread (0,14,0) in block (1,16,0) 
=========  Address 0x00abac20 is out of bounds 

今、私はまた、メモリリークの情報を取得するために-lスイッチを使用しようとしました:-g -GとCUDAのコードをコンパイルすると、このような素敵なソースの場所を与えました。ただし、ここでは住所のみを取得します:

========= CUDA-MEMCHECK 
========= Leaked 3630 bytes at 0x007d2800 
========= 
========= Leaked 14740 bytes at 0x008e0700 
... 
========= 
========= LEAK SUMMARY: 11122140 bytes leaked in 39 allocations 
========= ERROR SUMMARY: 0 errors 
400 bytes at 0x005d2000 

実際のコードの場所はどのように取得できますか?

答えて

3

リークのために提供されるアドレスは、コードアドレスではなくデータの場所です。残念ながら、これらの場所が割り当てられた場所を確認することは容易ではありません。

メモリがどこにでも割り当てられている可能性があることを考えれば(ポインタは回り込み、エイリアスなどを渡すことができることを覚えておいてください)、プログラムが終了するとリーク(つまり解放されない割り当てられたメモリ)あなたのプログラムが終了すると、cuda-memcheckは割り当てられていて解放されていないメモリのチャンクをチェックし、メモリのチャンクのアドレスを与えますが、割り当てられた時点に戻す方法はありません。

最も簡単なのは、すべてのcudaMalloc()コールに一致するコードがcudaFree()コールであることを手動で検査することです。しかし、これは非常に面倒なプロセスです...

+0

VC++は、実行時の各割り当てにシリアル番号を割り当て、出口でリークサマリーとともにそのシリアル番号を出力することでこれを処理します。同じデータを同じコードで2回実行すると、最初に漏れた割り当てのシリアル番号を見つけてから、その割り当てがどこで発生したのかを見つけることができます。 –

+1

私の前のコメントをフォローアップするために、静的に宣言されたシリアル番号を増やし、シリアル番号と割り当てられたメモリアドレスをstdoutまたはファイルに書き込むcudaMalloc()のラッパーを作成できます。プログラムが終了した後、cudaMalloc()ラッパーによって出力されたもののうち漏れたアドレスを調べ、漏れた割り振りのシリアル番号を探します。その後、cudaMalloc()ラッパーを修正して、そのシリアル番号が現れたときにブレークさせ、プログラムを再実行します。 –

関連する問題