2010-06-04 24 views
11

我想在指令级别统计我的C代码。 我需要知道我正在执行多少次加法,乘法,除法等。追查/分析说明

这不是您平时运行的磨机代码分析要求。我是算法开发人员,我想估计将代码转换为硬件实现的成本。为此,我在运行时被要求指令调用细分(解析编译后的程序集是不够的,因为它没有考虑代码中的循环)。

环顾四周后,似乎VMware可能提供了一种可能的解决方案,但我仍然无法找到能够追踪我的流程的指​​令调用流的特定功能。

您是否知道任何可以启用此功能的性能分析工具?

+0

在我看来,你想不仅要看这样的指令执行计数,但在时间的整体分数,他们例如,假设他们占用了50%的时间,并且可以将该部分减少到可以忽略的程度,那么您只能得到2倍加速的因素。 – 2010-06-04 16:17:11

+0

执行时间在这个特定情况下并不重要。 我没有分析代码优化。 – LeChuck2k 2010-06-06 16:55:56

回答

7

我最终使用了一个简单而有效的解决方案。

  1. 配置GDB通过调用以显示下一个指令(每次停止时间)的拆卸:

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

  • 分析日志来计算具体的指令调用。

  • 粗糙,但它的工作原理...

    4

    valgrind工具cachegrind可用于获取已编译程序集中每行的执行计数(第一列中的Ir值)。

    4

    您可以使用pin-instat这是一个PIN工具。由于它记录了比指令数更多的信息,所以它有点过分了。它仍然应该比你的gdb方法更有效率。

    声明:我是pin-instat的作者。

    +0

    作为一名计算机架构师,这款小软件确实可以帮助我理解我的设计,感谢您做这项工作! – 2017-04-19 01:49:26

    3

    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> [...]