2010-06-04 26 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> [...]