誤ったメモリアクセスに関するエラーを取得するために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
実際のコードの場所はどのように取得できますか?
VC++は、実行時の各割り当てにシリアル番号を割り当て、出口でリークサマリーとともにそのシリアル番号を出力することでこれを処理します。同じデータを同じコードで2回実行すると、最初に漏れた割り当てのシリアル番号を見つけてから、その割り当てがどこで発生したのかを見つけることができます。 –
私の前のコメントをフォローアップするために、静的に宣言されたシリアル番号を増やし、シリアル番号と割り当てられたメモリアドレスをstdoutまたはファイルに書き込むcudaMalloc()のラッパーを作成できます。プログラムが終了した後、cudaMalloc()ラッパーによって出力されたもののうち漏れたアドレスを調べ、漏れた割り振りのシリアル番号を探します。その後、cudaMalloc()ラッパーを修正して、そのシリアル番号が現れたときにブレークさせ、プログラムを再実行します。 –