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 回答