簡體   English   中英

我如何知道匯編指令被擊中的次數

[英]How do I know the number of times an assembly instruction is hit

我目前正在開發一個項目,我在程序集級別修改一些程序。 程序轉換非常簡單,我只是在代碼中的特定位置插入一些屏蔽操作。

我想知道執行掩碼指令多少次才能准確了解程序轉換成本。

目前我正在使用GDB,並設置了我的屏蔽指令所在的硬件斷點 之后我可以通過信息斷點獲得斷點的命中數。

然而,GDB速度非常慢,即使經過一夜的計算,通常也不會超過10秒。

我很確定我使用的是硬件斷點,我總是設置不到4個(我在帶有4個調試寄存器的Intel處理器上運行)。

我的GDB版本是8.0。

我正在考慮使用分析器,我已經快速瀏覽了valgrindgcovgprof,但它似乎並不適合我的需求。

有誰知道任何可以幫助我的工具? 或者有人知道如何加快我對GDB的想法嗎?

謝謝

編輯:我在linux x86-64上運行

有誰知道任何可以幫助我的工具?

您可以嘗試perf annotate perf教程中有一個例子:

可以使用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> [...] 

第一列報告在該指令中為函數== noploop()==捕獲的樣本百分比。 如前所述,您應該仔細解釋這些信息。

每當它遇到其中一個斷點時,它必須停止程序並開始在GDB中執行某些操作。 所以自然需要永遠。

我會使用GDB而不是斷點。 我只是手動隨機停止它(或者你可以使用計時器)。 每次停止時,您都可以准確地看到它的指令。 如果這樣做10或20次,您可以輕松估計每條指令花費的時間(換句話說,指令負責的總時間),並且您可以看到它隨着屏蔽的變化。

你不會以這種方式得到非常精確的時間分數,除非你得到大量的樣本,但你得到的是非常可靠的。

然后, gprof也應該做你想要的 ,因為我討厭承認:)

gdb與它無關,你必須依賴硬件/芯片提供的東西。 首先,你不計算裝配指令的次數,因為處理器不直接理解裝配,他們理解機器代碼,盡管並非所有裝配指令都映射到一個機器指令,但你必須根據具體情況進行處理。 因此,除了術語之外,您必須依賴硅。

接下來定義命中,根據設計需要很多時鍾周期來處理和執行指令,因此許多指令開始看到管道的早期階段,直到處理器發現分支正在發生,比如條件陰影中的指令科。 我假設你對那些不感興趣(斷點和停止程序的流程與運行程序不一樣,它改變了程序運行的方式,你強迫斷點的陰影中的指令被擊中至少兩次正如他們通常會基於命中術語的定義一樣。

斷點只有在處理器支持它們時才有效,你通常總是會在那里放一個未定義的指令,並且如果處理器支持那么它有一個未定義的處理程序(這是通用的,你具體使用的處理器是不相關的,特別是因為它似乎是x86,這意味着此時有許多不同的實現,而x86-64並沒有開始描述完整答案所需的詳細信息)

有些處理器根本沒有提供調試支持,最好是未定義的指令,希望它能正常工作。 一些有很多,其余的有一些在中間,一些提供你要求觀察特定地址和計數器“執行”的功能。 通常答案是斷點,恢復和計算多少次是你唯一的選擇。 當然,這就是為什么,計算一個指令被擊中的次數與循環的整體性能沒有直接關系,有時如果它是唯一一個觸及指令中的內存,但有時會對齊該指令或循環的對齊一個比機器代碼本身更大的角色...所以想知道你是如何達到需要計算特定指令的“命中”的那一點。 (你也應該只通過分析代碼來做)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM