Jan*_*egg 5 c++ memory-leaks memory-management cuda memcheck
我成功使用了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
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用-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
Run Code Online (Sandbox Code Playgroud)
如何从中获得实际的代码位置?
为泄漏提供的地址不是代码地址,而是数据位置。不幸的是,要了解这些位置的分配位置并不容易。
鉴于内存可以在任何地方分配(请记住,指针可以传递、别名等),检查泄漏(即分配的内存未释放)的唯一方法是在程序退出时。因此,当您的程序退出时,cuda-memcheck 会检查已分配但未释放的内存块,并为您提供该内存块的地址,但它无法将其与分配时的地址联系起来。
相反,最简单的方法是手动检查代码以检查所有cudaMalloc()调用是否都有匹配的cudaFree()调用。然而,这可能是一个相当费力的过程......