【问题标题】:How to profile a C++ function at assembly level?如何在汇编级别分析 C++ 函数?
【发布时间】:2011-11-29 12:27:15
【问题描述】:

我有一个功能是我的程序的瓶颈。它不需要访问内存,只需要计算。它是内部循环并且被调用了很多次,所以这个函数的任何小收获对我的程序来说都是巨大的胜利。

我有在 PS3 上优化 SPU 代码的背景,您可以在其中获取 SPU 程序并通过管道分析器运行它,您可以将每个汇编语句放在自己的列中,并最大限度地减少函数所花费的周期数。然后你覆盖循环,这样你就可以进一步减少管道依赖。有了这个程序和每个汇编指令所花费的所有周期的列表,我可以比编译器更好地优化。

在不同的平台上,它有我可以注册的事件(缓存未命中、循环等),我可以运行该函数并跟踪 CPU 事件。那也不错。

现在我正在使用带有 Core i7 Intel 处理器的 Visual Studio C++ 2010 在 Windows 上做一个爱好项目。我没有足够的钱来证明支付 VTune 的巨额费用是合理的。

我的问题:

如何在 Windows 上的英特尔处理器的汇编级别分析函数?

我想编译、查看反汇编、获取性能指标、调整我的代码并重复。

【问题讨论】:

  • 我很想看看一些实际的代码并提出建议。但是,目前投票以只是重复结束...
  • @Mysticial 当然,获得反汇编很容易,但获得与处理器相关的指标与汇编相关的是棘手的部分。每个平台都有自己独特的一套做事方式。
  • @AlanStokes 谢谢 Alan - 我确实看到了该链接,但我已经确定了哪个函数是我的瓶颈,现在我想要关于如何在装配级别进行基准测试的建议。就像我在帖子中给出的关于在 SPU 和流水线分析器上使用具有循环计数的指令表的示例。
  • 另一票不关闭。

标签: c++ windows optimization


【解决方案1】:

有一些很棒的免费工具可用,主要是 AMD 的 CodeAnalyst(根据我在 i7 与我的 phenom II 上的经验,它在英特尔处理器上有点缺陷,因为它无法访问直接的硬件特定计数器,尽管可能是错误的配置)。

但是,一个鲜为人知的工具是 Intel Architecture Code Analyser(它像 CodeAnalyst 一样免费),它类似于您描述的 spu 工具,因为它详细说明了延迟、吞吐量和端口压力(基本上是请求分派到 ALU, MMU 等)逐行为您的程序汇编。 Stan Melax 在今年的 GDC 上给了一个很好的 talk 和 x86 优化,标题为“hotspots, flops and uops: to-the-metal cpu optimization”。

英特尔还有一些与 IACA 相同的工具,可在their experimental/what-if code site 的性能调整部分下获得,例如 PTU,它是(或曾经是)VTune 的实验演进,据我所知,它是免费的。

在深入研究之前阅读英特尔优化手册也是一个好主意。

编辑:正如 Ben 指出的,时间可能不适合旧处理器,但使用 Agner Fog's Optimization manuals 可以轻松弥补,其中还包含许多其他宝石。

【讨论】:

  • 谢谢!我将查看演示文稿和工具,看看它有多大帮助。
  • 除非 IACA 为不存在的处理器生成配置文件数据。
  • @Ben:我的 i7 支持 AXV(其他任何 Sandybridge CPU 也是如此),所以我不确定您指的是什么不存在的处理器。 IACA 也不仅仅适用于 AXV 处理器。
  • @Necrolis:从英特尔的网站上看,为旧架构生成时序信息的能力非常不明显。您确定在处理器真正匹配发布的产品之前很久就发布的模拟器生成的时序?
  • @Ben:嗯,那部分有点晦涩难懂,但它们适用于 i3/i5/i7 处理器,这些处理器现在很常见。
【解决方案2】:

从你的描述看来你的问题可能是embarrassingly parallel,你有没有考虑使用ppl的parallel_for

【讨论】:

  • 我的代码设置为使用多个内核,我永远不会使用 ppl 的 parallel_for(不是它的粉丝)。尽管如此,即使在多个内核上运行,并且很快会在 GPU 内核上运行,我的程序仍然会从优化此功能中受益匪浅。最重要的是,这个问题是让我学习如何正确优化 Windows 上的功能。我很欣赏这个建议,因为它很好,谢谢。
【解决方案3】:

【讨论】:

  • 抱歉,没有注意到您在 Windows 上。我不认为 valgrind 在 Windows 上运行。
  • 遗憾的是,像这样的免费工具不会轻易出现在 Windows 上 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2020-08-11
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多