我正在嘗試在基於Linux的英特爾奔騰上運行一個軟件的基準測試。問題是,在使用RDTSC指令時,在連續測試運行期間,我得到了相當大的性能變化。完全相同的軟件運行時間在500萬到1000萬個時鐘週期之間變化,所以在最壞的情況下,我的開銷爲100%。我知道有緩存爭用導致的性能變化,但是,有沒有辦法可以消除其他潛在問題,如中斷,其他進程等?降低Linux上的性能變化
感謝任何有用的提示如何正確地做到這一點。
非常感謝, 肯尼
我正在嘗試在基於Linux的英特爾奔騰上運行一個軟件的基準測試。問題是,在使用RDTSC指令時,在連續測試運行期間,我得到了相當大的性能變化。完全相同的軟件運行時間在500萬到1000萬個時鐘週期之間變化,所以在最壞的情況下,我的開銷爲100%。我知道有緩存爭用導致的性能變化,但是,有沒有辦法可以消除其他潛在問題,如中斷,其他進程等?降低Linux上的性能變化
感謝任何有用的提示如何正確地做到這一點。
非常感謝, 肯尼
一些通用的東西:提高測試進程的優先級(人1很好),停止其他許多工藝越好,卸載未使用的內核模塊,刷新磁盤緩存(這樣的背景內核線程有更少的工作),在單用戶模式下重啓?
在這個面積一般常見的問題有:在多CPU /多核系統
解決方案:
如果你在一個多CPU /多核系統上運行單線程程序,然後使用CPU親和力的過程中鎖定到特定的核心。 (使用命令行中的taskset或從代碼中調用sched_setaffinity()。)
確保您沒有其他進程需要CPU時間,禁用屏幕保護程序或其他桌面動畫,並確保沒有屏幕更新你的代碼正在運行。也不要使用例如在您的代碼時間內將printf添加到GUI控制檯窗口中 - 保存任何結果輸出,直到收集完上次的時間戳記爲止。 (如果可能的話,你甚至可以考慮完全殺死GUI)。
使用比RDTSC更可靠的定時方法(我通常在Linux上使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...))。
禁用自動時鐘頻率縮放(例如Linux操作系統:CPU頻率集)
在一個循環中運行的代碼,用於說Ñ重複,優選地重複使用相同的內存分配用於任何大的數據結構(以擺脫虛擬機頁面錯誤等的影響)。忽略第一次測量並平均餘下的N - 1次測量。
我知道RDTSC有多核時有問題!爲此,我在啓動過程中禁用了其中一個內核,以確保這不會成爲我測量的問題。所有其他的事情我已經考慮了很多。感謝您的幫助 – Kenny 2010-01-26 09:56:10
請確保在BIOS和操作系統中禁用頻率縮放。此外,它聽起來像你正在使用一個P4,所以確保你關閉超線程。
由於這種情況,我遇到過像以前描述的性能變化。
This page介紹如何將它打開在,這應該給你你需要關掉它。
您還需要重新啓動機器並查看BIOS設置,以確定它是否自動執行,而無需操作系統知道。
感謝您的線索。那麼你是否說我應該先檢查BIOS,如果我可以在操作系統級別解決這個問題之前禁用頻率調整?或者我還需要在操作系統中進行更改?乾杯 – Kenny 2010-01-26 10:22:29
修復BIOS比較容易,如果你不修復它,你不會在操作系統上取得任何進展 - 所以先做。 – 2010-01-26 11:49:18
您是否考慮過運行valgrinds cachegrind或callgrind工具中的代碼? 這些應該能夠通過valgrinds「VM」運行代碼爲您提供準確的指令計數。
mio =百萬(對不起,我感到困惑) – Kenny 2010-01-26 10:15:04