2014-03-24 43 views
8

我想寫一些代碼來確定與CLOCK_MONOTONIC_RAW一起使用會給我來自不同內核上相同硬件的結果。如何判斷我的機器上的每個內核是否使用相同的計時器?

據我所知,每個核心可以生產independent results,但是not always。我被賦予了以40納秒的精度獲得所有內核時序的任務。

我不使用CLOCK_REALTIME的原因是我的程序絕對不能受到NTP調整的影響。

編輯:

我已經找到了unsynchronized_tsc功能,試圖測試是否TSC是所有內核是相同的。我現在試圖找到如果CLOCK_MONOTONIC_RAW是基於TSC。

最後編輯

事實證明,CLOCK_MONOTONIC_RAW總是在多核系統上使用,並且不依賴於TSC甚至在Intel的機器。

+2

爲什麼除了'CLOCK_MONOTONIC_RAW'的實現者之外,任何人都會感興趣?他們給你一個全球性(非核心),未經調整的單調時鐘。他們擔心需要製造它的任何魔法,所以你不必這樣做。如果TSC不穩定或同步,他們會使用其他的東西。 –

+0

@ n.m。我想我可以更好地提出我的問題。知道'CLOCK_MONOTONIC_RAW'的結果在所有內核上都是相同的,這對我來說已經足夠了。從你的評論我明白,這是。你能不能指出一些確認它的文件?我會在工作中使用我的技術報告。 – OlivierLi

+0

「CLOCK_MONOTONIC_RAW的結果在所有內核上都是一樣的」---它甚至不清楚這個語句可能意味着什麼。讓我重申:只有一個原始的單調時鐘,而不是每個核心。這與例如完全相同實時時鐘。你是否擔心實時時鐘取決於同期的核心? –

回答

4

要精確測量,你需要:這是對所有CPU執行

  • 代碼,一旦「事件」的發生
  • 一些方法來創建一個矚目的「事件」讀取CPU的時間戳計數器,並將其存儲在由所有CPU
  • 一些方法來防止因的IRQ,任務切換定時的問題,等等,同時

爲事件的各種可能性包括:

  • 輪詢在一個循環中的存儲器位置,其中一個CPU寫入新的值,並且其它CPU停止輪詢時,他們看到使用本地APIC廣播的IPI(處理器間中斷)到所有的CPU的新值

對於這兩種方法,CPU之間存在延遲(特別是對於較大的NUMA系統) - 寫入內存(緩存)可能會在立即寫入的CPU上可見,並且可由CPU上的稍後將有不同的物理芯片(在不同的NUMA域中)。爲了避免這種情況,您可能需要找到在所有CPU上啓動事件的平均值。例如。 (對於2個CPU),一個CPU啓動並進行測量,然後另一個CPU啓動並進行測量,然後合併結果以消除任何「事件傳播延遲」。爲了解決其他計時問題(IRQ,任務切換等),我希望在啓動過程中進行這些測試,否則沒有其他任何事情可以搞砸了。否則,您需要防止出現問題(確保所有CPU以相同的速度運行,禁用IRQ,禁用線程切換,停止任何PCI設備總線主控等)或應對問題(例如,多次運行相同的測試並查看是否大多數時候你會得到類似的結果)。

還要注意,以上所有內容只能確保時間戳計數器在測試完成時同步,並且不能保證在測試完成後它們不會失去同步。爲確保CPU保持同步,您需要依靠CPU的「單調時鐘」保證(但較老的CPU不能保證)。

最後;如果你試圖在用戶空間(而不是在內核代碼中)做到這一點;那麼我的建議是以一種並不那麼脆弱的方式設計代碼。即使不同CPU上的TSC始終保持完全同步,也無法避免在讀取TSC之前或之後馬上中斷IRQ(並且無法自動執行某些操作並在相同的時間讀取TSC時間);因此如果你的代碼需要這種精確同步的時機,那麼你的代碼的設計可能是有缺陷的。

+0

是否有任何原因執行,因爲內核模塊會比引導過程中執行的差嗎?你也可以在內核模塊中禁用你需要的所有東西。 – Shahbaz

+0

@VisaisRacism:當操作系統可能處於加載狀態時,是否要禁用IRQ和PCI總線主控傳輸(基本上是任何類型的IO)? – Brendan

+0

我其實不知道事情會如何發揮作用(因此是問題)。我想如果你在測量時可以暫停啓動,你應該可以暫停內核模塊中的所有內容,不是這樣嗎?我要問的原因是能夠將它作爲內核模塊來執行,這使得實現和調試變得更加容易(因爲您在每次嘗試時都會消除內核編譯,並且可能會節省幾次重啓)。 – Shahbaz

相關問題