2012-11-20 333 views
8

我對MONITOR-MWAIT和HLT說明提出了一個疑問。 兩者都暫停處理器,都在各種外部觸發器(中斷等)喚醒。MWAIT vs HALT在效率方面

在我的實驗,HLT和MWAIT功能幾乎一樣,在賬戶時服用:

  • 如果 OS調度器,一個簡單的循環與上述指示,將相當中斷而且由於MWAIT要求重新檢查MONITOR和MWAIT之間的狀況,有什麼區別? (我問的是,爲什麼不首先使用HLT,並節省了分配跟蹤區域的痛苦(如果不仔細配置,它會避免mon/mwait機制並將其變爲NOP)不是操作系統的調度程序,沒有機會你不會迅速醒來,只是檢查一個HLT循環中的值... ???

(當然,MWAIT可能會更高分辨率,我避難所雖然測量的分辨率,但它似乎通過(我認爲)中斷等喚醒了)..所以我不能看到很大的優勢。

謝謝, 任何想法在這種方式會很大讚賞

回答

11

性能;最重要的是無論何時等待(等待HLT的IRQ,或IRQ或寫入MWAIT的內存),CPU都會從「等待」狀態中退出所需的時間。這會影響延遲 - 例如在中斷處理程序啓動之前或實際發生任務切換之前需要多長時間。 CPU等待狀態所花費的時間對於不同的CPU而言是不同的,對於同一CPU上的HLT和MWAIT也可能稍有不同。

這同樣適用於功耗 - 等待時消耗的功率在不同CPU之間可能會有很大差異(特別是當您開始考慮超線程等問題時)。而HLT與MWAIT的功耗在同一個CPU上也可能略有不同。

對於使用情況,它們適用於不同的情況。 HLT用於等待IRQ,而MWAIT用於等待內存寫入發生。當然,如果您正在等待內存寫入發生,那麼您需要確定IRQ是否應該中斷您的等待(例如,如果您只想等待內存寫入,則可以執行CLI然後MWAIT)。

但是,對於多任務系統,大多數情況下它們都只用於相同的事情 - 在CPU空閒的調度程序中。在引入MONITOR/MWAIT之前,調度人員將在等待工作時使用HLT(稍微降低功耗)。這意味着如果另一個CPU解鎖任務,它不能只將該任務放入調度程序的隊列中,並且必須向HLTed CPU發送(相對昂貴的)「處理器間中斷」以將其從HLT狀態中除去(否則當它可以/應該做的工作時,CPU將保持不動)。對於MWAIT,這種「處理器間中斷」(可能是不必要的) - 您可以將MONITOR設置爲監視寫入調度程序的隊列,以便將任務放入隊列足以導致等待的CPU停止等待。

還有一些關於使用MONITOR/MWAIT來處理自旋鎖和同步等問題的研究(例如等待爭用鎖被釋放)。這項研究的最終結果是,CPU退出「等待」狀態的時間太長,使用MONITOR/MWAIT會導致性能損失太多(除非存在設計缺陷 - 例如使用自旋鎖當你應該使用互斥體)。

我想不出任何其他原因(超出調度程序和鎖定/同步)使用HLT或MWAIT。

+0

布倫丹,非常感謝這非常豐富的概述,你肯定清除了我周圍的霧。 我正在考慮使用mon/mwait在線程和硬件之間進行同步(以避免每次中斷來自硬件後DPC出現setEvent)。 WaitForSingleObj和SetEvent的等待時間似乎比等待線程(和全局變量)中的自旋鎖要高得多,所以mwait看起來像是一箇中間點。 –

3

MONITOR/MWAIT 應該「可用於諸如自旋鎖和同步的事物(例如等待爭用鎖被釋放)」。但是,MONITOR/MWAIT(a)對於一個令人驚訝的愚蠢和令人討厭的原因必須被限制爲僅用於0內核代碼,而不是用戶代碼,並且(b)被微碼加載下來以進入低強大的睡眠狀態。

一些公司已經實施了類似或相當的指令,例如MIPS的LL/PAUSE大致等同於MONITOR/MWAIT。

+0

KNL有一個環3實現: https://software.intel.com/zh-CN/blogs/2016/10/06/intel-xeon-phi-product-family-x200-knl-user-mode-ring-3-monitor-and-mwait – Jeff

+0

感謝KNL中關於用戶模式MWAIT的新聞。我期待看到表現數據。我的猜測是,除非他們已經實現了微碼分支預測,否則它會很慢。 –

+0

同事告訴我的是,一個經過精心調整的帶有暫停指令的旋轉循環比monitor-mwait快,但是如果有人願意交易一點延遲,那麼monitor-mwait應該是可行的。即使沒有直接的好處,但在許多超級計算機所處的功耗受限的環境中,停車硬件線程也會帶來巨大的間接收益。如果您有基準,請隨時與我私下聯繫,我會盡力爲您提供一些數據。 – Jeff

7

HLT指令實現可用於單個線程的最淺空閒電源狀態(C狀態),而MWAIT指令允許您請求所有可用的空閒電源狀態以及子狀態。

在硬件層面,執行HLT相當於執行狀態提示爲0的MWAIT。這使處理器進入C1狀態,這是核心的時鐘門控。如果您想要進入更深的C狀態以便對核心進行供電,並有可能關閉封裝,則必須使用MWAIT。

對於各種電源狀態,在節能和退出延遲之間總是存在權衡。 C狀態越深,功率節省越多,但退出C狀態所需的時間越長。您還應該注意到,現代x86處理器將根據中斷頻率限制電源狀態的深度(即,如果您每隔1秒收到一次中斷事件,硬件將不會嘗試進入具有2 us退出的C狀態潛伏)。

除了禁止進入的C狀態的硬件之外,一些C狀態只能通過線程之間的協調進入。例如,在具有超線程的英特爾x86處理器上,內核中的兩個線程都必須請求電源門控C狀態以在內核級別進行電源門控,同樣,封裝中的所有內核都必須請求封裝 - 用於電源門控在封裝級別發生的高級電源門控C狀態。硬件通常遵循最淺的請求,所以如果1個線程請求C1並且另一個請求C3,則處理器進入C1。

如果您不控制操作系統,那麼它確實是一個爭議點(因爲MWAIT僅在CPL0上可用)。如果您「擁有」操作系統,那麼使用MWAIT而不是HLT幾乎總是有意義的,因爲它在很多情況下可以節省更多的電量,並提供與HLT相同的閒置電源狀態。