分析我的代码(开源)和第三方代码(闭源)的内存使用情况的最佳策略

时间:2011-05-31 19:27:43

标签: c++ memory-management profiling cuda

我很快将负责使用C / C ++编写的代码的正确内存配置文件,并使用CUDA来利用GPU处理。

我最初的想法是创建宏和运算符重载,这将允许我在源代码中跟踪对malloc,free,delete和new调用的调用。我只能包含一个不同的头,并使用__FILE__ and __LINE__宏来打印日志文件的内存调用。此类策略可在此处找到:http://www.almostinfinite.com/memtrack.html

在链接的第三方库中跟踪该用法的最佳方法是什么?我假设我几乎只能在函数调用之前和之后跟踪内存使用情况,对吗?在我的宏/过载场景中,我可以简单地跟踪请求的大小,以确定要求的内存量。我怎样才能知道第三方lib正在使用多少?我的理解是,跟踪“免费”并不能真正让您了解代码在任何特定时间使用了多少,因为它不一定返回到操作系统。我很感激对此事的任何讨论。

我真的不想使用任何内存分析工具,如Totalview或valgrind,,因为它们通常会执行许多其他操作(边界检查等),这似乎会使软件运行速度非常慢。另一个原因是我希望这有点线程安全 - 软件使用MPI我相信产生进程。我将尝试实时分析这个,以便我可以转储到日志文件或其他进程可以读取的内容,以便在软件运行时可视化内存使用情况。这也主要是在linux环境中运行。

由于

7 个答案:

答案 0 :(得分:1)

也许valgrind和Massif工具?

答案 1 :(得分:1)

要跟踪我在Linux上的程序的实时内存消耗,我只需阅读/proc/[pid]/stat。这是一个相当轻松的操作,如果你想要跟踪的第三方库做了后续工作,在你的情况下可以忽略不计。如果要在第三方库工作期间获取内存信息,可以将stat文件读入独立线程或其他进程。 (内存峰值很少在函数调用之前或之后追加!...)

对于CUDA / GPU,我认为gDEBugger可以帮到你。我不确定,但内存分析器不会影响性能。

答案 2 :(得分:1)

您可以尝试使用Google的PerfTools的Heap-Profiler:

http://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html

非常轻巧;它实际上取代了malloc / calloc / realloc / free来添加检测代码。它主要在Linux平台上进行测试。

如果您使用调试符号编译,并且您的第三方库带有调试版本变体,PerfTools应该做得很好。如果您没有调试符号库,那么无论如何都要使用调试符号构建代码。它会为您的代码提供详细的数字,所有剩余的都可以作为第三方库的属性。

答案 3 :(得分:1)

如果您不想使用“外部”工具,可以尝试使用以下工具:

  • mtrace

    它为malloc,realloc和free安装处理程序,并将每个操作记录到文件中。请参阅我在内容中列出的维基百科代码用法示例。

  • dmalloc

    这是一个可以在代码中使用的库,可以发现内存泄漏,逐个错误和无效地址的使用。您也可以在编译时使用-DDMALLOC_DISABLE禁用它。

无论如何,我宁愿不采用这种方法。相反,我建议您尝试在valgrind(或任何等效工具)下的测试服务器上运行它时对应用程序进行压力测试,并确保正确进行内存分配,然后让应用程序运行而不在生产中进行任何内存分配检查最大化速度。但实际上,这取决于您的应用程序的功能以及您的需求。

答案 4 :(得分:1)

也许链接器选项--wrap = symbol可以帮到你。在这里可以找到非常好的例子: man ld

答案 5 :(得分:0)

您可以使用Visual Studio 2010 Premium和Ultimate中包含的分析器。

它允许您在不同的性能测量方法之间进行选择,对您来说最有用的可能是CPU采样,因为它会以任意时间间隔冻结您的程序并确定它当前正在执行哪些功能,从而不会使您的程序大量运行慢。

答案 6 :(得分:0)

我相信这个问题有两个非常单独的答案。一个用于C / C ++的土地。还有第二个用于CUDA的土地。

在CPU上:

我已经为new和delete编写了自己的替代品。他们非常缓慢,并没有多大帮助。我用过totalview。我喜欢OpenMP调试的全视图,但我同意内存调试非常慢。我从未尝试过valgrind。我听说过类似的事情。

我遇到的唯一内存调试工具是Intel Parallel Inspector's Memory Checker。 注意:由于我是学生,我能够以便宜的价格获得教育许可证。那说,这太棒了。我花了十二分钟才找到埋在五十万行代码中的内存泄漏 - 我没有发布一个抛出的错误对象,我抓住并忽略了它。我非常喜欢这个软件,当我的raid失败/ Win 7吃掉我的电脑时(想想autoupdate和raid重建同时),我停止了一切并重建了电脑,因为我知道重建双重电脑会花费更少的时间启动(48小时),而不是以另一种方式找到内存泄漏。 如果你不相信我的异乎寻常的主张,download an evaluation version

在GPU上:

我觉得你运气不好。对于CUDA中的所有内存问题,我基本上不得不在cudaMalloc等周围发展我自己的工具和包装器。它并不漂亮。 nSight确实给你带来了一些东西,但是在这一点上,并不仅仅是“现在你已经分配了多少riiiight。在这个悲伤的说明中,几乎所有与CUDA有关的性能问题都直接依赖于我的内存访问模式(或我的线程块大小)。