4

我正在尋找在多核處理器上執行微基準測試的方法。如何在多核處理器上進行基準測試

語境:

大約在介紹的同時桌面處理器亂序執行的是做出業績很難預測,他們,也許不是巧合,還推出了特殊的指令來得到非常精確的計時。這些指令的示例是x86上的rdtsc和PowerPC上的rftb。這些指令給出了比系統調用所允許的更精確的時序,允許程序員將他們的心微觀化,無論好壞。

在具有多個內核的更現代的處理器上,其中一些內核會休眠,但內核之間的計數器不會同步。我們被告知,rdtsc已不再適用於基準測試,但是當我們解釋替代解決方案時,我一定會打瞌睡。

問:

一些系統可以保存和恢復的性能計數器,並提供一個API調用來讀取正確的總和。如果您知道此通話適用於任何操作系統,請在回答中告訴我們。

某些系統可能允許關閉核心,只剩下一個正在運行。我知道Mac OS X Leopard會在開發人員工具中安裝正確的首選項窗格時執行此操作。你認爲這使得rdtsc再次安全使用?

更多背景:

請假設我知道努力做一個微基準當我在做什麼。如果你認爲,如果一個優化的漲勢無法通過定時整個應用程序進行測量,這是不值得的優化,我同意你的看法,但

  1. 我不能一次全部應用程序,直到替代數據結構完成,這將需要很長時間。事實上,如果微基準不是很有希望的話,我現在可以決定放棄實施;

  2. 我需要一個數字來提供出版物的截止日期,我無法控制。

回答

2

在OSX(ARM,Intel和PowerPC),要使用mach_absolute_time()

#include <mach/mach_time.h> 
#include <stdint.h>  

// Utility function for getting timings in nanoseconds. 
double machTimeUnitsToNanoseconds(uint64_t mtu) { 
    static double mtusPerNanosecond = 0.0; 
    if (0.0 == mtusPerNanosecond) { 
     mach_timebase_info_data_t info; 
     if (mach_timebase_info(&info)) { 
      // Handle an error gracefully here, whatever that means to you. 
      // If you do get an error, something is seriously wrong, so 
      // I generally just report it and exit(). 
     } 
     mtusPerNanosecond = (double)info.numer/info.denom; 
    } 
    return mtu * mtusPerNanosecond; 
} 

// In your code: 
uint64_t startTime = mach_absolute_time(); 
// Stuff that you want to time. 
uint64_t endTime = mach_absolute_time(); 
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime); 

注意,有沒有必要限制到一個核心這一點。操作系統在後臺處理mach_absolute_time()所需的修復,以在多核(和多插座)環境中提供有意義的結果。

+0

謝謝,我應該可以從http://developer.apple.com/mac/library/qa/qa2004/qa1398.html中找到它,儘管我對'man mach_absolute_time'的結果非常失望。 – 2010-05-08 16:09:09

+0

@帕斯卡爾:這將是一個很好的錯誤報告。我發佈了一些示例代碼,以避免在該筆記中投射指針。 – 2010-05-08 16:11:05

+0

請注意,此解決方案將受到探測效應的影響,遠遠超過將進程固定到單個內核並使用兩次rtdsc(在x86上,不能用於PowerPC)。編譯器可能不會內聯你的函數,他們會佔用更多的指令緩存,並且你正在做乘法和除法,我相信他們可以根據它們的操作數完成多長時間。 'rtdsc'只是讀取一個寄存器,因此便宜得多,並且會減少您的結果。 – 2012-08-22 01:31:13

1

內核正在返回「rtdsc」的正確同步值。如果你有一個多插口機器,你必須將這個進程固定到一個插座上。這不是問題。

主要問題是調度程序使數據不可靠。 Linux Kernel> 2.6.31有一些性能API,但我沒有看過它。 Windows> Vista在這裏做得很好,使用QueryThreadCycleTime和QueryProcessCycleTime。

我不確定OSX,但AFAIK「mach_absolute_time」不調整預定時間。

相關問題