我成功使用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 </ em>开关来获取内存泄漏信息。然而,在这里,我只获得地址:
========= 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
如何从中获取实际的代码位置?
答案 0 :(得分:3)
为泄漏提供的地址不是代码地址,而是数据位置。不幸的是,要查看这些位置的分配位置并不容易。
鉴于内存可以在任何地方分配(记住指针可以传递,别名等),检查泄漏的唯一方法(即未释放的已分配内存)是程序退出时。因此,当你的程序退出cuda-memcheck检查已分配但未释放的内存块时,会为你提供内存块的地址,但它无法将其重新绑定到分配时。
最简单的方法是手动检查代码,检查所有cudaMalloc()
个来电是否匹配cudaFree()
。然而,这可能是一个非常费力的过程...