【问题标题】:cuda-memcheck, how to get from address to source code?cuda-memcheck,如何从地址到源代码?
【发布时间】:2012-03-25 19:02:58
【问题描述】:

我成功地使用 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

如何从中获取实际的代码位置?

【问题讨论】:

    标签: c++ memory-management memory-leaks cuda memcheck


    【解决方案1】:

    为泄漏提供的地址不是代码地址,而是数据位置。不幸的是,要查看这些位置的分配位置并不容易。

    鉴于内存可能已分配到任何地方(请记住,指针可以传递、别名等)检查泄漏(即未释放的已分配内存)的唯一方法是程序退出时。因此,当您的程序退出时,cuda-memcheck 会检查已分配但未释放的内存块并为您提供内存块的地址,但它无法将其与分配的时间联系起来。

    最简单的方法是手动检查您的代码以检查所有cudaMalloc() 调用是否有匹配的cudaFree() 调用。然而,这可能是一个相当费力的过程......

    【讨论】:

    • VC++ 处理这个问题的方法是,在每次分配执行时为其分配一个序列号,然后在退出时将该序列号与泄漏摘要一起输出。通过使用相同的数据两次运行相同的代码,可以首先找到泄漏的分配的序列号,然后找到发生分配的位置。
    • 要跟进我之前的评论,您可以为 cudaMalloc() 创建一个包装器,该包装器增加一个静态声明的序列号,并将序列号和分配的内存地址写入标准输出或文件。程序结束后,在 cudaMalloc() 包装器打印的内容中查找泄漏的地址,以找到泄漏分配的序列号。然后修改 cudaMalloc() 包装器,使其在序列号出现时中断并重新运行程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多