【问题标题】:C++ Code profiling/analysis for Mac and MPI适用于 Mac 和 MPI 的 C++ 代码分析/分析
【发布时间】:2013-03-16 21:01:53
【问题描述】:

我正在寻找适用于 MacOS 上的 C++ 的代码分析/分析工具。我知道有关于这个线程的帖子,但是我需要的应用程序非常具体,所以也许有人可以给我一些更具体的建议。

所以这是我的问题:我正在用 C++ 编写科学代码(硕士项目),所以它是一个纯控制台应用程序,没有提供交互性。该代码应该在大规模并行计算机上运行,​​因此我使用 MPI。但是,现在我还没有针对可扩展性进行优化,而只是针对单核性能。由于我不想将整个程序重写为串行程序,因此我只使用带有 1 个线程的 MPI。它工作正常,但优化器显然需要能够处理这个问题。

我要分析什么?好吧,从某种意义上说,代码并不是很复杂,因为它具有非常简单的结构,因此我所需要的只是程序在某些功能上花费多长时间的列表,这样我就知道它在哪里浪费了最多的时间,我可以测量我的优化加速。

感谢所有的想法

【问题讨论】:

    标签: c++ macos profiling mpi code-analysis


    【解决方案1】:

    您应该使用 Instruments.app,其中包括 CPU 采样器和线程活动查看器...等等。 (在 Xcode 中选择“Product > Profile...”)

    如果您想要更细粒度的东西,您可以检测您的代码。巧合的是,我专门为这种场合写了一组分析宏:)

    https://github.com/nielsbot/Profiler

    这将显示在检测例程中花费的时间很好的嵌套打印。 (该页面上的说明)

    【讨论】:

      【解决方案2】:

      你试过 kcachgrind: http://kcachegrind.sourceforge.net/html/Home.html 和 valgrind 吗?

      【讨论】:

        【解决方案3】:

        我可以推荐http://www.scalasca.org/。之后您也可以将其用于并行性能。

        【讨论】:

          【解决方案4】:

          不要寻找“慢功能”,也不要寻找衡量不同部分使用的时间。这些概念非常间接,几乎无法告诉您要优化什么。

          取而代之的是,在挂钟时间拍摄一些频闪 X 光片,了解整个程序在做什么,然后研究每一个,看看为什么程序会花费那个时间。 之所以效果更好,是因为它不是用功能性有色眼镜看的。它戴着有色眼镜,你可以判断程序是否需要做它正在做的事情。 定位大问题非常准确。 测量它们是不准确的,也不需要如此。

          当您只进行测量时会发生以下情况:您会在一堆例程中得到一堆数字。你看着他们说“这是什么意思?”。 如果它没有告诉你应该修复什么,你就拍拍自己的后背,说程序必须是最佳的。 实际上,您可能可以修复某些问题,但您无法从探查器中弄清楚。 更重要的是,如果您确实找到并修复它,它可能会暴露您可以修复的其他问题,从而获得更大的加速。

          这就是random pausing 的意义所在。

          【讨论】:

          • 感谢您的想法,但毕竟您需要一些工具来实际对您的性能进行基准测试 - 您对此有什么用?
          • @Chris:我可以用来计时的任何东西。超过百分之几的性能变化不需要原子钟。如果您可以找到多个要修复的问题,那么它们各自的加速因素就会相乘,并且有可能获得超过一个数量级的加速。 Here's an example of 43x. 从 43 秒到 1 秒不需要花哨的测量工具。从12 minutes to 1 second?出发怎么样?
          • 我明白 Mike 的观点,尽管我想指出 Instruments 中的分析器是一个统计采样器..(每 _x_ms 记录您的程序调用堆栈)..这与您的非常相似我相信是在提倡。
          • @nielsbot:在分析器中,恕我直言,最好的是那些(如Zoom)1)对堆栈进行采样,2)挂钟时间(不仅仅是CPU时间),3)报告% 代码行级别的堆栈存在(不仅仅是函数)。也就是说,任何人使用分析器获得的典型加速因素是什么? Here's 43x with this method. 只有在不错过问题的情况下才能做到这一点。这种方法虽然可能很粗糙,但可以找到分析器发现的问题的超集。这就是为什么在加速结果方面存在巨大差异的原因。
          • 是的,Instruments 中的采样器按照您的描述进行。此外,您可以监视线程活动以诊断调度停止/资源冲突。在使单个例程更快的情况下,例如绘图循环,我发现我链接到的老式分析器更有用。
          猜你喜欢
          • 1970-01-01
          • 2013-03-01
          • 2010-09-20
          • 2011-09-25
          • 2012-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多