跟踪GPU内存泄漏的专业方法(分配而不释放)

本文关键字:分配 释放 方法 内存 GPU 泄漏 跟踪 | 更新日期: 2023-09-27 17:50:48

我正在寻找如何在源代码内跟踪GPU内存泄漏起源的建议。

我有一个大型的多线程c#/c++应用程序,当重复一些特定的操作时,它会出现小的但确定的内存泄漏问题。我还在这个应用程序旁边运行内存扫描仪,这样我就可以实时跟踪内存使用统计数据。因为我知道哪些操作会导致内存使用量的增长,所以我能够勾勒出发生这些问题的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪内存被分配,但从未释放,从而导致泄漏的区域。

我的调查方式真的很糟糕(同时由于代码复杂性和多线程的影响而很难)。有什么专业的方法来跟踪和解决这些问题吗?

跟踪GPU内存泄漏的专业方法(分配而不释放)

我使用的工具很少,但我发现以下这些工具最能满足我的需求,也许它们也能满足你的需求:

    来自AMD的CodeXL: http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/
  • Nvidia NSight: https://developer.nvidia.com/gameworks-tools-overview
  • Nvidia Visual Profiler: https://developer.nvidia.com/nvidia-visual-profiler
  • gDebugger: http://www.gremedy.com/

根据我正在做的事情以及我需要跟踪/跟踪和配置文件的内容,我使用上述所有4个包。它们还有一个额外的好处:免费;B:保养得很好;c:免费;D:定期更新;艾凡:免费的。

如果你还没有猜到我喜欢免费的部分:)

关于对象管理,我将推荐一个古老的c++编码原则:一旦你创建了一个对象,添加了删除它的行,每个new应该总是(最终)有一个delete。这样你就知道你正在销毁你创建的对象,但是它不会使你免于孤立的内存块内存泄漏,因为你改变了指针指向的位置,例如:

myclass* firstInstance = new myclass();
myclass* secondInstance = new myclass();
firstInstance = secondInstance;
delete firstInstance;
delete secondInstance;

您现在将创建一个小的内存泄漏,其中实际firstInstance的数据现在没有被任何指针指向。当这种情况在大型代码库中发生时,很难检测到,而且应该更常见。

一般来说,这些是您需要注意的对,以确保您正确地处理所有对象:

new -> delete
new[] -> delete[]
malloc() -> free() // or you can use realloc(0) instead of free()
calloc() -> free() // or you can use realloc(0) instead of free()
realloc(nonzero) -> free() // or you can use realloc(0) instead of free()

如果你是从一个有垃圾回收的语言过渡到c++,这可能需要一段时间来适应,但它很快就会成为习惯:)