2010-04-06 115 views
4

我已經用C編寫了一個程序。它是一個作爲研究結果而創建的程序。我想計算程序消耗的確切CPU週期。確切的週期數。 任何想法我怎麼能找到它?測量進程消耗的CPU時鐘

+0

確切的。那些優化指令流並可能重疊指令的處理器呢?這算什麼? http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts/ – 2010-04-06 21:06:37

回答

1

不,你不能。 「CPU週期」的概念沒有明確定義。現代芯片可以以多種時鐘速率運行,並且它們的不同部分可以在不同的時間做不同的事情。

在某些情況下,「總共有多少管道步驟」可能會有意義,但不太可能有辦法解決。

0

對不起,但沒有,至少不是爲了大多數實際目的 - 對於大多數正常的操作系統來說這是不可能的。舉例來說,不少操作系統並沒有進行完整的上下文切換來處理中斷,因此花費在中斷服務上的時間往往會花費時間花費在中斷髮生時正在執行的任何進程上。

「不是用於實際目的」將指示在循環精確模擬器下運行程序的可能性。這些都是可用的,但主要是針對主要用於實時嵌入式系統的CPU,而不是像全面的PC。更糟糕的是,他們(通常)不是爲了運行像完整的操作系統,而是運行在「裸機」上的代碼。

從理論上講,您可能可以通過運行諸如Windows或Linux之類的虛擬機來完成某些操作 - 但我不知道任何現有的虛擬機試圖嘗試哪種虛擬機,而且這絕對是不平凡的,在表現上可能會有相當嚴重的後果(說得溫和)。

10

valgrind工具cachegrindvalgrind --tool=cachegrind)會給你一個詳細的輸出,包括執行指令的數量,緩存未命中和分支預測未命中。這些可以歸結爲單獨的彙編程序線,因此原則上(知道您的確切架構),您可以從此輸出中獲得精確的循環計數。

知道由於緩存效應,它會從執行變爲執行。

cachegrind tool is here的文檔。

1

我不完全相信我確切知道你在做什麼,但是現代x86處理器可以做什麼就是在你感興趣的代碼塊前後讀取time stamp counter(TSC) 。在彙編層面,這是通過使用RDTSC指令完成的,該指令爲您提供edx:eax寄存器對中TSC的值。

但是請注意,這種方法有一定的注意事項,例如,如果你的進程在CPU0上開始,並在CPU1上結束,你從RDTSC得到的結果將指向執行該指令的特定處理器內核,因此可能無法進行比較。 (也有缺乏指令序列化與RDTSC,但在這方面,我不認爲這是一個問題。)