如何在程序集级别分析c++函数

How to profile a C++ function at assembly level?

本文关键字:c++ 函数 程序集      更新时间:2023-10-16

我有一个函数,它是程序的瓶颈。它不需要访问内存,只需要计算。它是一个内循环,被多次调用,所以这个函数的任何小收益都是我的程序的大胜利。

我的背景是在PS3上优化SPU代码,您使用SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在自己的列中,并最大限度地减少函数所需的循环次数。然后你叠加循环,这样你就可以最小化管道依赖。有了这个程序和每条汇编指令的循环列表,我可以比编译器更好地优化它。

在不同的平台上,它有我可以注册的事件(缓存丢失,周期等),我可以运行该函数并跟踪CPU事件。那也很不错。

现在我正在做一个业余项目在Windows上使用Visual Studio c++ 2010 w/a Core i7英特尔处理器。我没有足够的钱来支付VTune的大笔费用。

我的问题:

如何对Windows上的英特尔处理器的汇编级功能进行配置?

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

有一些很棒的免费工具可用,主要是AMD的CodeAnalyst(从我在i7和我的phenom II上的经验来看,它在英特尔处理器上有点缺陷,因为它不能访问直接的硬件特定计数器,尽管这可能是糟糕的配置)。

然而,一个鲜为人知的工具是英特尔架构代码分析器(它像CodeAnalyst一样免费),它类似于您描述的spu工具,因为它详细描述了延迟,吞吐量和端口压力(基本上是请求调度到ALU, MMU等)逐行为您的程序汇编。Stan Melax在今年的GDC上做了一个关于它和x86优化的演讲,题目是"热点,失败和失败:到金属cpu优化"。

英特尔也有一些与IACA相同的工具,可以在他们的实验/假设代码网站的性能调优部分获得,例如PTU,它是(或曾经是)VTune的实验进化,从我看来,它是免费的。

在深入研究这个问题之前,最好先阅读一下英特尔优化手册。

编辑:正如Ben指出的那样,对于较旧的处理器,时间可能不正确,但这可以通过Agner Fog的优化手册轻松弥补,该手册还包含许多其他精华。

您可能想尝试valgrind中包含的一些实用程序,如callgrind或cachegrind。

Callgrind可以做分析和转储程序集。

和kcachegrind是一个很好的GUI,将显示转储,包括汇编和每条指令的点击数等。

从你的描述听起来你的问题可能是令人尴尬的平行,你考虑过使用ppl的parallel_for吗?