7

cuda-memcheck を使用して、間違ったメモリアクセスに関するエラーを取得することに成功しました。-g -Gを使用して cuda コードをコンパイルすると、次のような適切なソースの場所が得られました。

========= 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スイッチを使用してメモリ リーク情報も取得しようとしました。ただし、ここではアドレスのみを取得します。

========= 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

これから実際のコードの場所を取得するにはどうすればよいですか?

4

1 に答える 1

4

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

メモリがどこにでも割り当てられている可能性があることを考えると (ポインターが渡されたり、エイリアスが作成されたりする可能性があることに注意してください)、リーク (つまり、解放されていない割り当てられたメモリ) をチェックする唯一の方法は、プログラムが終了するときです。したがって、プログラムを終了すると、 cuda-memcheck は割り当てられたが解放されていないメモリのチャンクをチェックし、メモリのチャンクのアドレスを提供しますが、割り当てられたときにそれを結び付ける方法はありません。

代わりに、コードを手動で調べて、すべてのcudaMalloc()呼び出しに一致する呼び出しがあることを確認するのが最も簡単ですcudaFree()。ただし、これはかなり面倒なプロセスになる可能性があります...

于 2012-03-08T16:11:07.053 に答える