2009-02-22 59 views
8

我正在爲C中的一些非常短的操作編寫一些微型基準測試代碼。例如,我測量的一件事是根據傳遞的參數數量調用一個空函數需要多少個週期。排空英特爾Core 2 Duo的指令流水線?

目前,我在每次操作前後使用RDTSC指令計時以獲得CPU的週期數。但是,我擔心在第一個RDTSC之前發佈的指令可能會減慢我測量的實際指令速度。我還擔心在第二個RDTSC發佈之前,整個操作可能沒有完成。

有沒有人知道在發佈任何新指令之前強制執行所有飛行中指令的x86指令?我被告知CPUID可能會這樣做,但我一直無法找到任何說明的文檔。

回答

9

據我所知,沒有具體「消耗」管道的指令。這可以通過使用串行化指令輕鬆完成。

CPUID是一個序列化指令,這意味着你正在尋找什麼。每個指令在CPUID指令之前保證執行之前都會發出。

這樣算下來以下應該得到預期的效果:

cpuid 
rdtsc 
# stuff 
cpuid 
rdtsc 

但是,順便說一句,我不建議你這樣做。你的「東西」仍然可能受到你控制之外的許多其他事物的影響(例如CPU緩存,系統上運行的其他進程等),你永遠無法將它們全部消除。獲得準確的性能統計信息的最佳方法是執行要測量的操作至少幾百萬次並平均批處理的執行時間。

編輯: CPUID的大多數指令參考將提及其序列化屬性,例如NASM manual appendix B

編輯2:也可能想看看this related question

+1

你是對的圍欄說明。 CPUID實際上暗示了它們(我刪除了我的答案)。請注意,當CPUID序列化時,它不會清除緩存,這也可能會影響性能。緩存可以用WBINVD清除。您可能想將其添加到您的答案中。 – 2009-02-22 19:54:48