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
我怎样才能从这个实际的代码位置?
VC++通过为每个分配分配序列号来处理它,然后在出口处输出该序列号以及泄漏摘要。通过使用相同的数据运行相同的代码两次,可以首先查找泄漏的分配的序列号,然后查找分配发生的位置。 – 2012-03-08 17:18:05
为了跟进我之前的评论,你可以为cudaMalloc()创建一个包装器,它增加一个静态声明的序列号,并将序列号和分配的内存地址写入标准输出或文件。程序结束后,查看cudaMalloc()包装器打印的泄漏地址,以查找泄漏分配的序列号。然后修改cudaMalloc()包装器,使其在序列号出现时中断并重新运行程序。 – 2012-03-08 23:41:19