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

C++ 分析我的代码(开放源代码)和第三方代码(封闭源代码)内存使用情况的最佳策略,c++,memory-management,profiling,cuda,C++,Memory Management,Profiling,Cuda,我很快就要承担起为一段用C/C++编写并使用CUDA利用GPU处理的代码编写一个适当的内存配置文件的任务 我最初的想法是创建宏和操作符重载,允许我在源代码中跟踪malloc调用、free调用、delete调用和新调用。我只需要包含一个不同的头,并使用\uuuu FILE\uuuuuuuuuuuuuuuuuuuuuu和uuuuuuuuuuu行宏来打印对日志文件的内存调用。这类策略可在此处找到: 在链接的第三方库中跟踪该使用情况的最佳方法是什么?我假设我几乎只能跟踪函数调用前后的内存使用情况,对吗?

我很快就要承担起为一段用C/C++编写并使用CUDA利用GPU处理的代码编写一个适当的内存配置文件的任务

我最初的想法是创建宏和操作符重载,允许我在源代码中跟踪malloc调用、free调用、delete调用和新调用。我只需要包含一个不同的头,并使用
\uuuu FILE\uuuuuuuuuuuuuuuuuuuuuu和uuuuuuuuuuu行
宏来打印对日志文件的内存调用。这类策略可在此处找到:

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

我真的不想使用任何内存分析工具,如Totalview或valgrind,因为它们通常会做很多其他事情(边界检查等),这似乎会使软件运行非常缓慢。另一个原因是,我希望它在某种程度上是线程安全的——我认为该软件使用MPI生成进程。我将尝试实时分析它,这样我就可以转储到日志文件或其他可以被另一个进程读取的东西,以便在软件运行时可视化内存使用情况。这也将主要在linux环境中运行


谢谢

您可以使用Visual Studio 2010 Premium和Ultimate中包含的探查器


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

也许还有Massif工具

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


对于CUDA/GPU的事情,我认为可以帮助你。我不确定,但内存分析器对性能影响不大。

您可以试试Google的PerfTools堆分析器:

它非常轻;它从字面上取代了malloc/calloc/realloc/free以添加检测代码。它主要在Linux平台上测试


如果您已经使用调试符号进行了编译,并且您的第三方库附带了调试版本变体,那么PerfTools应该做得很好。如果没有调试符号库,请使用调试符号构建代码。它将为您的代码提供详细的编号,所有剩余的代码都可以作为第三方库的属性。

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

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

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


不管怎么说,我宁愿不要这种方法。相反,我建议您在valgrind(或任何等效工具)下的测试服务器上运行应用程序时,尝试对其进行压力测试,并确保正确执行内存分配,然后让应用程序在生产环境中运行,而不进行任何内存分配检查,以最大限度地提高速度。但是,事实上,这取决于你的应用程序的功能和需要。

我相信这个问题有两个非常不同的答案。一个用于C/C++land。第二个是CUDA land

在CPU上:

我已经为new和delete编写了自己的替换。他们的速度非常慢,帮不了什么忙。我用过totalview。我喜欢使用totalview进行OpenMP调试,但我同意内存调试的速度非常慢。我从来没有试过valgrind。我也听到过类似的事情

我遇到的唯一值得一试的内存调试工具是内存检查器注意:作为一名学生,我能够以低廉的价格获得教育许可证。尽管如此,这还是很了不起的。我花了12分钟找到了一个隐藏在50万行代码中的内存泄漏——我没有释放一个抛出的错误对象,我捕获并忽略了它。我非常喜欢这一款软件,以至于当我的raid失败/Win 7吃掉我的计算机时(想想自动更新和raid重建),我停止了一切并重建了计算机,因为我知道重建双启动(48小时)所需的时间比用另一种方法查找内存泄漏所需的时间要少。如果你不相信我古怪的说法

在GPU上:

我想你运气不好。对于CUDA中的所有内存问题,我基本上不得不在
cudamaloc
等周围自行开发工具和包装器。这并不漂亮。nSight确实为您买了一些东西,但在这一点上,除了“这是您现在分配RiiLight的数量”之外,并没有太多。在这一点上,我对CUDA遇到的几乎所有性能问题都直接依赖于我的内存访问模式(或线程块大小)。

也许吧