Kernel

如何手動測量我的電腦的時鐘脈衝?

  • December 15, 2018

我的 PC 有兩個處理器,我知道每個處理器都執行在 1.86 GHz。

我想手動測量我的 PC 處理器的時鐘脈衝,我的想法只是計算程序具有的彙程式序行數與我的電腦執行它所花費的時間之間的商,所以我有數字CPU 每次處理的彙編指令數(這就是我所理解的“時鐘週期”)。我想通過以下方式做到這一點:

  1. 我編寫了一個 C 程序並將其轉換為彙編程式碼。
  2. I do: $gcc -S my_program.c,它告訴 gcc 編譯器完成整個編譯過程,除了最後一步:將 my_program.c 轉換為二進制對象。因此,我有一個名為 my_program.s 的文件,其中包含翻譯成彙編程式碼的 C 程序的原始碼。
  3. 我數了數我的程序有多少行(我們稱這個數字為 N)。我做到了:

$ nl -l my_program.s | tail -n 1我獲得了以下資訊:

1000015     .section    .note.GNU-stack,"",@progbits

也就是說,程序有一百萬行程式碼。 4. 我這樣做:$gcc my_program.c以便我可以執行它。 5. 我這樣做:($time ./a.out“a.out”是my_program.c的二進制對象的名稱)用於獲取執行程序所花費的時間(我們稱之為T),我獲得:

real    0m0.059s
user    0m0.000s
sys     0m0.004s

假設我正在搜尋的時間 T 是列表中表示的第一個時間:“真實”時間,因為其他時間指的是在我執行的同一時間在我的系統中執行的其他資源./a.out

所以我有 N=1000015 行和 T=0.059 秒。如果我進行 N/T 除法,我得到頻率接近 17 MHz,這顯然是不正確的。

然後我想,也許我的電腦上執行著其他程序並消耗硬體資源(無需進一步說明,作業系統本身)這一事實使得處理器“分裂”了它的“處理能力”並且它確實時鐘脈衝去了較慢,但我不確定。

但我認為,如果這是正確的,我還應該找到我的程序消耗的 CPU 資源(或記憶體)的百分比,因為這樣我真的可以渴望獲得關於我的真實 CPU 速度的(很好的)近似結果。

這讓我想到瞭如何找出我的程序的“資源消耗價值”的問題。我想過$ top命令,但由於我的程序執行時間很短(0.059 秒),它立即被丟棄;在這短短的時間內,不可能通過簡單的視覺來區分記憶體使用的任何峰值。

所以,對於這個你有什麼想法?或者你建議我做什麼?我知道有一些程序可以完成我嘗試做的這項工作,但我更喜歡使用原始 bash 來完成它,因為我有興趣通過盡可能“通用的方式”來完成它(似乎更可靠)。

那是行不通的。每條指令執行所需的時鐘週期數(它們需要很多,而不僅僅是一個)在很大程度上取決於圍繞它的指令的確切組合,並且因確切的 cpu 型號而異。你也有中斷進來,核心和其他任務與你的指令混合在一起執行。最重要的是,頻率會隨著負載和溫度而動態變化。

現代 CPU 具有特定於模型的寄存器,用於計算確切的時鐘週期數。您可以閱讀此內容,並使用高解析度計時器,在固定時間段後再次閱讀,然後比較兩者以找出該時間段內的(平均)頻率。

引用自:https://unix.stackexchange.com/questions/72873