我想在指令級別統計我的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