使用性能分析工具对C++多线程应用程序进行性能测试。

10

您使用过像Intel Vtune analyzer这样的性能分析工具吗?

对于在Linux和Windows上运行的C++多线程应用程序,您有什么建议?我主要关注缓存未命中,内存使用,内存泄漏和CPU使用率。

我通常只在UNIX上使用valgrind来查找内存错误和泄漏。


我最近看到了这篇关于性能分析的论文:http://www.iop.org/EJ/article/1742-6596/119/4/042030/jpconf8_119_042030.pdf?request-id=6fb45e59-676f-4728-86bd-f324abdc5053 。igprof https://twiki.cern.ch/twiki/bin/view/CMS/IgProfAnalysis 看起来是一个很棒的工具(虽然我还没有尝试过)。 - amit kumar
7个回答

10

以下是适用于多线程应用程序的优秀工具。您可以尝试评估副本。

  1. 运行时健全性检查工具
    • 线程检查器 - Intel线程检查器/ VTune,这里
  2. 内存一致性检查工具(内存使用,内存泄漏) - Memory Validator,这里
  3. 性能分析。(CPU使用率) - AQTime,这里

编辑: Intel线程检查器可用于诊断数据竞争、死锁、停滞线程、放弃的锁等问题。请在分析结果时保持耐心,因为很容易感到困惑。

一些提示:

  1. 禁用不需要的功能。(在确定死锁时,可以禁用数据竞争,反之亦然。)
  2. 根据需求使用仪器级别。"所有函数"和"完整图像"这样的级别用于数据竞争,而"API导入"可用于死锁检测)
  3. 经常使用上下文敏感菜单“诊断帮助”。

5
在Linux上,可以尝试使用oprofile,它支持各种性能计数器。
在Windows上,AMD的CodeAnalyst(免费,不像VTune)值得一试。但它只支持在AMD硬件上进行事件分析(在Intel CPU上,它只是一个方便的基于定时器的分析工具)。
最近,有个同事尝试了Intel Parallel Studio(测试版),并给出了好评(它发现了一些代码中有趣的并行性问题)。

3
你可以尝试使用AMD CodeXL的CPU分析器。它是免费的,适用于Windows和Linux系统。
AMD CodeXL的CPU分析器取代了不再支持的CodeAnalyst工具(timday在上面的回答中提到过)。
欲了解更多信息和下载链接,请访问: AMD CodeXL网页

3

VTune可以为您提供处理器正在执行的详细信息,但有时我发现很难从中看到重点。 VTune不会报告内存泄漏。要查找内存泄漏,您需要使用Purify Plus,或者如果您可以在Linux上运行,Valgrind对于内存泄漏也是一个好的且价格实惠的选择。

VTune显示两个视图,一个有用的是表格视图,另一个我认为只是为了让销售人员给人留下印象,但没有多大用处。

对于快速和廉价的选项,我会选择Valgrind。 Valgrind还有一个CacheGrind部分,但我没有使用过,但认为它也非常好。

谢谢, 马丁。


2
我为 valgrind 提供另一个答案,特别是带有UI的callgrind部分。它可以通过对每个线程进行缓存未命中等性能分析来处理多个线程。他们还有一个名为helgrind的多线程错误检查器,但我从未使用过,不知道它有多好。

2
Helgrind非常擅长发现潜在的线程问题,例如互斥锁顺序不一致、竞态条件等。但它只能与pthread一起使用,因此使用其他线程库的用户可能会运气不佳。然而,在我的机器上,它的运行速度比valgrind要慢得多,因此使用时需要耐心等待! - Soo Wei Tan

1

Rational PurifyPlus 套件包括一个经过充分验证的泄漏检测器和相当不错的分析器。我不确定它是否能够到达缓存未命中的级别,你可能需要使用 VTune。

PurifyPlus 可在各种 Unix 和 Windows 上使用,因此它应该符合您的要求,但不幸的是,与 Valgrind 相比,它不是免费的。


1

对于简单的性能分析,gprof 是相当不错的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接