簡體   English   中英

如何測量現代 x86 上經過的實際時鍾周期數?

[英]How to measure the ACTUAL number of clock cycles elapsed on modern x86?

在最近的 x86 上,RDTSC 返回一些測量時間而不是時鍾周期的偽計數器。

鑒於此,我如何測量當前線程/程序的實際時鍾周期

就平台而言,我更喜歡 Windows,但 Linux 答案也可以。

這並不簡單。 Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 中描述了這樣的事情。 3B :

這是行為:

  • 對於奔騰 M 處理器; 適用於奔騰 4 處理器、英特爾至強處理器; 對於 P6 系列處理器:時間戳計數器隨每個內部處理器時鍾周期遞增。 內部處理器時鍾周期由當前內核時鍾與總線時鍾的比率決定。 英特爾® SpeedStep® 技術轉換也可能影響處理器時鍾。
  • 適用於奔騰 4 處理器、英特爾至強處理器; 適用於 Intel Core Solo 和 Intel Core Duo 處理器; 適用於 Intel Xeon 處理器 5100 系列和 Intel Core 2 Duo 處理器; 適用於 Intel Core 2 和 Intel Xeon 處理器; 對於 Intel Atom 處理器:時間戳計數器以恆定速率遞增。 該速率可以由處理器的最大核心時鍾與總線時鍾的比率設置,或者可以由處理器啟動時的最大解析頻率設置。 最大解析頻率可能與處理器基本頻率不同。 在某些處理器上,TSC 頻率可能與品牌字符串中的頻率不同。

以下是針對您的用例的建議:

要確定平均處理器時鍾頻率,英特爾建議使用性能監控邏輯來計算需要平均值的時間段內的處理器內核時鍾 有關詳細信息,請參閱第 18.17 節“在基於 Intel NetBurst® 微體系結構的處理器中使用 Intel 超線程技術的系統上計算時鍾”和第 19 章“性能監控事件”。

壞消息是 AFAIK 性能計數器通常不能在 AMD 和 Intel 處理器之間移植。 因此,您當然需要在 AMD 文檔中檢查要使用的性能計數器。 還有一些問題:您無法輕松測量任意代碼所占用的周期數。 例如,處理器可以暫停或進入睡眠模式一小段時間(參見 C 狀態),或者操作系統可以執行一些受保護的代碼,如果沒有高權限(為了安全起見)就無法對其進行分析。 只要你需要測量一個耗時較長(至少幾十個周期)的數值密集型代碼的循環次數,這種方法就可以了。 最重要的是,MSR 的文檔和使用非常復雜,並且有一些限制。

CPU_CLK_UNHALTED.THREADCPU_CLK_UNHALTED.REF_TSC這樣的性能計數器對於你想要測量的東西來說似乎是一個好的開始。 使用庫來讀取這樣的性能計數器通常是一個很好的主意(除非你喜歡至少幾天頭疼)。 PAPI 可能足以完成這項工作。


這是一些有趣的相關帖子:

暫無
暫無

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

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