要精確測量,你需要:這是對所有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時間);因此如果你的代碼需要這種精確同步的時機,那麼你的代碼的設計可能是有缺陷的。
爲什麼除了'CLOCK_MONOTONIC_RAW'的實現者之外,任何人都會感興趣?他們給你一個全球性(非核心),未經調整的單調時鐘。他們擔心需要製造它的任何魔法,所以你不必這樣做。如果TSC不穩定或同步,他們會使用其他的東西。 –
@ n.m。我想我可以更好地提出我的問題。知道'CLOCK_MONOTONIC_RAW'的結果在所有內核上都是相同的,這對我來說已經足夠了。從你的評論我明白,這是。你能不能指出一些確認它的文件?我會在工作中使用我的技術報告。 – OlivierLi
「CLOCK_MONOTONIC_RAW的結果在所有內核上都是一樣的」---它甚至不清楚這個語句可能意味着什麼。讓我重申:只有一個原始的單調時鐘,而不是每個核心。這與例如完全相同實時時鐘。你是否擔心實時時鐘取決於同期的核心? –