我有一个功能,这是我程序的瓶颈。它不需要访问内存,只需要计算。它是内部循环,被调用了很多次,因此对该函数的任何小小的收获对我的程序来说都是大赢家。
我来自优化PS3上的SPU代码的背景,您在其中使用SPU程序并通过管道分析器运行该程序,在管道分析器中,您可以将每个汇编语句放在其自己的列中,并且可以最大程度地减少该功能所花费的周期。然后,您可以覆盖循环,从而可以最大程度地减少管道依赖性。有了该程序以及每个汇编指令所花费的所有周期的 list ,我可以比编译器更好地进行优化。
在另一个平台上,它具有可以注册的事件(高速缓存未命中,周期等),并且可以运行该函数并跟踪CPU事件。那也很好。
现在,我正在使用带有Core i7 Intel处理器的Visual Studio C++ 2010在Windows上进行一个业余项目。我没有足够的钱支付VTune的巨额费用。
我的问题:
如何在Windows上的英特尔处理器的组装级配置函数?
我想编译,查看反汇编,获取性能指标,调整代码并重复。
最佳答案
有一些很棒的免费工具可用,主要是AMD的CodeAnalyst(根据我在i7和phenom II上的经验,它在Intel处理器上有些残障,因为它无法访问直接针对硬件的计数器,尽管那可能是因为配置错误)。
但是,鲜为人知的工具是Intel Architecture Code Analyser(类似于CodeAnalyst,它是免费的),它与您描述的spu工具相似,因为它详细说明了延迟,吞吐量和端口压力(基本上是将请求分派(dispatch)到ALU,MMU等)。逐行进行程序汇编。斯坦·梅拉克斯(Stan Melax)在今年的GDC大会上做了一个很好的talk和x86优化,标题为“热点,触发器和uops:金属化CPU优化”。
英特尔还有更多与IACA相同的工具,在their experimental/what-if code site的性能调整部分下有可用,例如PTU,根据我所见,它是VTune(或曾经是VTune的实验性改进),据我所知,它是免费的。
在深入研究英特尔优化手册之前也是一个好主意。
编辑:正如Ben所指出的,对于较旧的处理器,时间可能不正确,但是可以使用Agner Fog's Optimization manuals轻松弥补,它也包含许多其他gem。
关于c++ - 如何在汇编级别分析C++函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7628476/