2012-03-08 17 views
4

我成功使用cuda-memcheck获取有关错误内存访问的错误。编译CUDA代码-g -G给了很好的源位置是这样的: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开关也让内存泄漏信息。然而,在这里,我只获得地址:

========= 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++通过为每个分配分配序列号来处理它,然后在出口处输出该序列号以及泄漏摘要。通过使用相同的数据运行相同的代码两次,可以首先查找泄漏的分配的序列号,然后查找分配发生的位置。 – 2012-03-08 17:18:05

+1

为了跟进我之前的评论,你可以为cudaMalloc()创建一个包装器,它增加一个静态声明的序列号,并将序列号和分配的内存地址写入标准输出或文件。程序结束后,查看cudaMalloc()包装器打印的泄漏地址,以查找泄漏分配的序列号。然后修改cudaMalloc()包装器,使其在序列号出现时中断并重新运行程序。 – 2012-03-08 23:41:19