我有一个函数,它是我的程序的瓶颈。它不需要访问内存,只需要计算。它是内部循环,调用了很多次,所以这个函数的任何小收益都是我的程序的大胜利。
我有在PS3上优化SPU代码的背景,在那里,您可以将SPU程序通过管道分析器运行,在流水线分析器中,您可以将每个汇编语句放在它自己的列中,并最大限度地减少函数所需的周期。然后覆盖循环,这样就可以进一步最小化管道依赖。有了这个程序和每个汇编指令所占用的所有周期的列表,我可以比编译器更好地进行优化。
在不同的平台上,它有我可以注册的事件(缓存未命中、周期等)。我可以运行函数并跟踪CPU事件。这也很不错。
现在,我正在做一个业余爱好项目,使用的是采用i7英特尔核心处理器的Visual Studio2010 C++。我没有足够的钱来证明支付VTune的巨大成本是合理的。
我的问题:
如何在汇编级别评测Windows上英特尔处理器的函数?
我想编译,查看反汇编,获得性能指标,调整我的代码,并重复。
发布于 2011-10-03 03:11:43
有一些很棒的免费工具可用,主要是AMD的CodeAnalyst (从我在我的i7和我的phenom上的经验来看,它在英特尔处理器上有一点障碍,因为它不能访问直接的硬件特定计数器,尽管这可能是糟糕的配置)。
然而,一个鲜为人知的工具是Intel Architecture Code Analyser (它像CodeAnalyst一样是免费的),它类似于你所描述的spu工具,因为它逐行详细地描述了延迟,吞吐量和端口压力(基本上请求被分派到ALU,MMU等),用于你的程序组装。Stan Melax在今年的GDC上给出了一个很好的talk和x86优化,标题是“热点,失败和失败:到金属的cpu优化”。
英特尔还有一些与IACA相同的工具,在their experimental/what-if code site的性能调优部分,例如PTU,它是(或曾经) VTune的实验性演变,在我看来,它是免费的。
这也是一个好主意,已阅读英特尔优化手册之前,潜心于此。
编辑:正如Ben指出的,对于较老的处理器,计时可能不正确,但使用Agner Fog's Optimization manuals可以很容易地弥补这一点,它还包含许多其他的gem。
发布于 2011-10-03 16:43:29
您可能希望尝试valgrind中包含的一些实用程序,如callgrind或cachegrind。
发布于 2011-10-03 05:41:04
从你的描述听起来你的问题可能是embarrassingly parallel,你有没有考虑过使用ppl的parallel_for
https://stackoverflow.com/questions/7628476
复制相似问题