我有一个功能,这是我的程序的瓶颈。它不需要访问内存,只需要计算。它是内循环并被多次调用,所以这个函数的任何小增益都是我程序的大胜利。
我来自PS3优化SPU代码的背景,您可以在其中使用SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在其自己的列中,并最小化函数所需的循环量。然后重叠循环,以便最大限度地减少管道依赖性。使用该程序和每个汇编指令所需的所有循环列表,我可以比编译器更好地优化。
在另一个平台上,它有我可以注册的事件(缓存未命中,循环等),我可以运行该功能并跟踪CPU事件。那也很不错。
现在我正在使用带有Core i7 Intel处理器的Visual Studio C ++ 2010在Windows上做爱好项目。我没有钱来支付VTune的巨额费用。
我的问题:
如何在Windows的英特尔处理器的汇编级别分析函数?
我想编译,查看反汇编,获取性能指标,调整代码并重复。
答案 0 :(得分:11)
有一些很棒的免费工具,主要是AMD的CodeAnalyst(根据我在i7和我的Phenom II上的经验,它在英特尔处理器上有点不利,因为它无法访问直接硬件专用计数器,尽管如此可能是糟糕的配置)。
然而,一个较少知道的工具是Intel Architecture Code Analyser(它像CodeAnalyst一样免费),它类似于你描述的spu工具,因为它详细说明了延迟,吞吐量和端口压力(基本上是请求发送到ALU,MMU等)逐行为您的程序组装。 Stan Melax在今年的GDC上给出了一个很好的talk和x86优化,标题为“热点,触发器和uops:到金属cpu优化”。
英特尔还有一些与IACA相同的工具,在their experimental/what-if code site的性能调整部分下的avaibale,例如PTU,它是(或者是)VTune的实验演变,我可以看,它是免费的。
在深入研究之前阅读英特尔优化手册也是一个好主意。
编辑:正如Ben指出的那样,旧处理器的时序可能不正确,但使用Agner Fog's Optimization manuals可以轻松弥补,{{3}}也包含许多其他宝石。答案 1 :(得分:1)
您可能想尝试valgrind中包含的一些实用程序,如callgrind或cachegrind。
答案 2 :(得分:0)
从您的说明中听起来您的问题可能是embarrassingly parallel,您是否考虑过使用ppl的parallel_for
?