我想在指令级别统计我的C代码。 我需要知道我正在执行多少次加法,乘法,除法等。追查/分析说明
这不是您平时运行的磨机代码分析要求。我是算法开发人员,我想估计将代码转换为硬件实现的成本。为此,我在运行时被要求指令调用细分(解析编译后的程序集是不够的,因为它没有考虑代码中的循环)。
环顾四周后,似乎VMware可能提供了一种可能的解决方案,但我仍然无法找到能够追踪我的流程的指令调用流的特定功能。
您是否知道任何可以启用此功能的性能分析工具?
我想在指令级别统计我的C代码。 我需要知道我正在执行多少次加法,乘法,除法等。追查/分析说明
这不是您平时运行的磨机代码分析要求。我是算法开发人员,我想估计将代码转换为硬件实现的成本。为此,我在运行时被要求指令调用细分(解析编译后的程序集是不够的,因为它没有考虑代码中的循环)。
环顾四周后,似乎VMware可能提供了一种可能的解决方案,但我仍然无法找到能够追踪我的流程的指令调用流的特定功能。
您是否知道任何可以启用此功能的性能分析工具?
我最终使用了一个简单而有效的解决方案。
display/i $pc
配置一个简单的gdb在我需要分析的功能中断开的脚本,并且继续按指令分步指令:
set $i=0
break main
run
while ($i<100000)
si
set $i = $i + 1
end
quit
执行的GDB与我的脚本倾销输出到日志文件:
gdb -x script a.out > log.txt
分析日志来计算具体的指令调用。
粗糙,但它的工作原理...
valgrind工具cachegrind可用于获取已编译程序集中每行的执行计数(第一列中的Ir
值)。
您可以使用pin-instat这是一个PIN工具。由于它记录了比指令数更多的信息,所以它有点过分了。它仍然应该比你的gdb方法更有效率。
声明:我是pin-instat的作者。
作为一名计算机架构师,这款小软件确实可以帮助我理解我的设计,感谢您做这项工作! – 2017-04-19 01:49:26
Linux工具perf
将为您提供大量的性能分析信息;具体来说,perf annotate
会给你每指令的相对数量。
可以使用perf annotate
深入到指令级别。为此,您需要调用perf annotate
与命令的名称进行注释。所有样品的功能将被拆卸,每个指令将有样本的相对百分比表示:perf record ./noploop 5 perf annotate -d ./noploop ------------------------------------------------ Percent | Source code & Disassembly of noploop.noggdb ------------------------------------------------ : : : : Disassembly of section .text: : : 08048484 <main>: 0.00 : 8048484: 55 push %ebp 0.00 : 8048485: 89 e5 mov %esp,%ebp [...] 0.00 : 8048530: eb 0b jmp 804853d <main+0xb9> 15.08 : 8048532: 8b 44 24 2c mov 0x2c(%esp),%eax 0.00 : 8048536: 83 c0 01 add $0x1,%eax 14.52 : 8048539: 89 44 24 2c mov %eax,0x2c(%esp) 14.27 : 804853d: 8b 44 24 2c mov 0x2c(%esp),%eax 56.13 : 8048541: 3d ff e0 f5 05 cmp $0x5f5e0ff,%eax 0.00 : 8048546: 76 ea jbe 8048532 <main+0xae> [...]
在我看来,你想不仅要看这样的指令执行计数,但在时间的整体分数,他们例如,假设他们占用了50%的时间,并且可以将该部分减少到可以忽略的程度,那么您只能得到2倍加速的因素。 – 2010-06-04 16:17:11
执行时间在这个特定情况下并不重要。 我没有分析代码优化。 – LeChuck2k 2010-06-06 16:55:56