EIST-智慧降頻技術,它能夠根據不同的系統工作量自動調節處理器的電壓和頻率,以減少耗電量和發熱量。它的引入,大大節省了CPU在低工作量的能耗,受到極大歡迎,從此每一代Intel CPU上都有了它的身影。本文介紹了它的歷史和工作原理

理論基礎

CPU耗電量可以用下面這個公式來衡量:

CPU省電的秘密(一):EIST

CPU省電的秘密(一):EIST

很像質能方程有沒有?其中C代表電容率(Capacitance),與CPU的製程和工藝等相關,在CPU出廠時就已經確定下來,是個常數(吐槽下,中文版的Wikipedia解釋是錯誤的)。P是能耗(Power),F代表頻率(frequency),V是電壓(Voltage)。當CPU在很高的頻率上執行時,效能很高但耗電量很大。如果我們能在CPU運算量不大時,讓它降頻執行,這樣我們就可以減少公式中P的消耗,同時我們可以降低電壓,從而更大的節約能耗,同時降低風扇等的噪音。如果這個降低不會降低使用者使用體驗,或者說使用者幾乎感覺不到,那何樂而不為呢?當然實際情況遠比這個複雜,如果給定任務,更快的算完,CPU可以進入更省電的C state,而不會傻等,實際省電不會像這個近乎三次方的關係,但是在大多數情況下還是可以極大的節省耗電。這就是EIST能省電的理論基礎。

歷史

1.史前時代

它的由來很有一段歷史了。話說,在很久很久以前,在遙遠的地方,有一個古堡。。。。。咳咳,對不起,穿越了。在Intel的奔騰晶片早期時代(I, II),CPU開機就以固定頻率執行,從不停歇。而人們大部分時間實際上是用不到CPU全部的算力的。因為膝上型電腦的特殊性,耗電問題尤為嚴重。

2.省電技術的引入

需求帶來了研發的動力,在1999年後期,一項代號為Geyserville (GV)的技術被引入奔騰M系列CPU。在2000年1月,這項技術有了官方的名字:SpeedStep。從此它就開始了一段不平凡的演化之路:

· SpeedStep (GV1.1)

最早被引入奔騰M III,也就是膝上型電腦版奔騰。原理十分簡單:雙模式工作——全功率模式和省電模式。插上電源時,全速工作;電池供電時,已幾乎一半主頻工作(當然可以手動切回全速模式)。

· Enhanced SpeedStep (GV2.1)

加入了根據工作量自動在兩個主頻間切換的功能。實際上CPU就可以工作在三種模式下了:省電模式,效能優先模式和自動模式。

· Enhanced SpeedStep (GV2.2)

加入了Deep Alert mode。可以已更低的電壓工作在省電模式下。

·EIST(Enhanced Intel SpeedStep Technology,GV3)

這版做出了巨大的改進,從此不再是隻有兩種頻率可以選擇了,而是有一個範圍可以選擇,通常以100MHz為一個步進(Step)。舉個例子,奔騰M 1。5GHz可以有1。5,1。4,1。3,1。2,1。1,1。0,0。9,0。8和0。7GHz可以選擇。

從此EIST進入了穩定期,改進主要集中提供在更多的步進,和進入多核CPU後,降頻的粒度上的改進。在後面原理部分有詳細的介紹。

作業系統在接受EIST上也經歷了一個過程,從最早的OS透明,全部由SMM完成(意味著延遲很大);到由硬體供應商(IHV)提供驅動;最後現代的OS已經全部自帶全部支援,無需使用者操心。而韌體中EIST也從預設的關閉,到預設開啟,SMM模式的EIST程式碼也已經從韌體裡面消失了。EIST功能現在不但出現在筆記本CPU中,在臺式機和伺服器CPU中也變成了必不可少的關鍵功能。

工作原理

首先我們要明白,OS主導了在整個EIST在的各個頻率的切換,只有它最瞭解工作量。同時EIST要工作,硬體,韌體和OS三方缺一不可。我們也就從這三個方面介紹它的工作原理。

1.硬體

Intel CPU是EIST可以工作的硬體基礎。它透過一系列暫存器保證韌體和OS可以得到足夠的資訊,有足夠的手段控制EIST的工作模式。

2.韌體

說到韌體,不得不提到ACPI。ACPI全稱Advanced Configuration and Power Interface,我們以後再詳細介紹它,這裡只需要知道它是韌體和OS的電源管理介面和模型。其中ACPI規範定義了CPU的工作狀態,包含S-States(這個是整個系統)、C-States和P-States三種,其中S-States(Sleeping states)指系統睡眠狀態,C-States(CPU Power states)指CPU電源狀態,而P-States(CPU Performance states)則指CPU效能狀態。當然除了這三種外,還有G-States(全域性狀態)和D-States(裝置狀態)。整個關係如下圖:

CPU省電的秘密(一):EIST

CPU省電的秘密(一):EIST

而EIST各個工作頻率是透過在C0(C-states以後再介紹)下的各種P-states表現出來的。韌體要支援EIST,至少需要做以下工作:

1)檢測和開啟/關閉EIST

韌體可以透過CPUID來檢測CPU是否支援EIST,如果不支援就沒什麼事了。如果支援的話,主要的步驟就是使用WRMSR去寫IA32_MISC_ENABLES開啟EIST。

2)計算各種EIST引數

當韌體開啟CPU EIST以後就需要計算出該CPU支援的各種引數,如MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize和NumStates,所有這些資訊都可以透過CPU MSR直接或者間接的獲得,其中MinRatio MaxRatio都可以從PLATFORM_INFO中獲得(不同的bits),NumStates就是二者的差。CPU的工作頻率 = BCLK * Ratio,舊架構的CPU BCLK通常是由clock gen給出的,通常上是100/200 MHZ。新架構下CPU clock gen是內建的,BCLK固定是100MHZ。

這裡需要特別說明,在開啟Turbo Mode(官方名字:睿頻或智慧加速技術,Intel Turbo Boost Technology),最高頻率(即P0)要留給Turbo Mode。CPU會自動判斷該使用什麼樣的頻率。關於睿頻和它的原理,不在本文的範圍內。

3)填充各種ACPI的table

l. _OSC & _PDC

_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比較接近,基本上供OSPM(

Operating System-directed configuration and Power Management,作業系統電源管理模組 )和OS驅動呼叫和韌體傳遞一些關於P-state是否支援和實現方式的一些設定;另外關於_PSD Coordination Type也是有_PDC提供的。

II . _PSS

Performance Supported States用於回報OSPM 該平臺所支援的Processor Performance States的數量 並且透過一個packaged list的形式回報出該P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0個package表示該平臺所支援的最高的P-state,第n個package表示最低的P-state。Packaged lists的格式如下所示,其中需要說明的是關於Control和Status這兩個引數,其中Control表示要寫到 MSR IA32_PERF_CTRL中的值,Status用於當OSPM透過WRMSR 寫完IA32_PERF_CTR之後再讀取IA32_PERF_STATUS中的值並和Status做比較 以確定P-state切換是否已經完成。

前面部分已經提到如何計算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我們就可以將這些值填入_PSS packaged lists之中了。下面是一個_PSS的具體的例子,這個例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。

Name (_PSS, Package()

{

Package(){1600, 21500, 10, 10, 0x0010, 0x0010},

Package(){1500, 14900, 10, 10, 0x000F, 0x000F},

Package(){1400, 8200, 10, 10, 0x000E, 0x000E} ,

Package(){1300, 14900, 10, 10, 0x000D, 0x000D},

Package(){1200, 8200, 10, 10, 0x000C, 0x000C}

}) // End of _PSS object

另外當該平臺支援Turbo Mode時 P0將會report為Turbo Mode。

需要說明的是一般的做法是在SSDT中填入空的_PSS佔位表,而當正式啟動時,再根據前面的計算結果修改(Patch)入正確的值。

III._PCT

Performance Control用於將P-state MSR interface 報告給OSPM,OSPM透過_PCT 報告出來的操作切換P-states(OSPM不止執行在Intel CPU上),在過去,這裡往往返回一個IO埠,用於陷入(trap)SMM,由韌體來透過MSR切換不同的狀態。在新近的CPU架構下_PCT通常report native mode也就是FFH的方式,然後OSPM就透過CPU 驅動(它知道要操作哪些MSR)來切換。

lV. _PPC

Performance Present Capabilities用於動態的告知OSPM該平臺當前所支援的最高級別的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支援_PSS中report的所有的P-state [p0,pn]; return 1就表示支援[p1,pn]之間的P-state。

上面的邏輯透過程式看可能會更加直觀。大家可以訪問在Github上的Minnow3專案的源程式。

1)和2)的程式碼在

https://

github。com/tianocore/ed

k2-platforms/blob/devel-MinnowBoard3/Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Dxe/PerformanceStates。c

3)的程式碼在tianocore/edk2-platforms

3.OS

如前所述,OS知道現在的工作量,由它來決定是不是要在各個P-states之間遷移。對Windows來說,其維護一個叫做電源策略管理器(power policy manager)的模組,在使用者選擇了不同的執行場景(可以呼叫powercfg。exe檢視修改)情況下,根據目前工作量來呼叫processr。sys,這是個通用驅動,它再呼叫不同的CPU廠商的特有驅動來切換,Intel的EIST驅動是intelppm。sys,在Win10裡你還可以找到它。需要指出的是,intelppm。sys並不是Intel產出的,他是微軟為Intel CPU寫的驅動,這和很多板卡驅動由硬體供應商來提供不同。Linux的支援始於Linux 2。6,由cpufreq來提供支援。

後記

所有的知識點都介紹完了,下面就是彩蛋部分了。前面提到的降頻在粒度上的改進,是指每次降頻的作用範圍。過去一次降頻需要整個Package裡的所有core都進入同一頻率,從而最高的可以下降的頻率決定了最後頻率(進入C-state的除外)。而在引入了內嵌的電壓管理器後,不同的core可以進入不同的pstate(per core pstate),從而更加省電。這項技術需要韌體對Domain等做一些調整,而對OS是透明的。

一些有意思的分支話題我們可以深入思考一下:

1。 CPU在C0狀態下有兩種手段降低功耗的方法,其一是之前介紹過的P-state,另一個就是T-state。T-sate全稱就是Processor Throttling States,它為OSPM提供另一種降低系統負載和溫度的能力,聽上去可能和P-state很像,其實是有區別的,你知道是在哪裡嗎?

2。 AMD提供了類似技術:Cool ‘n’ Quiet。俗稱冷又靜,它和EIST的區別在哪裡呢?

其他CPU電源管理文章:

CPU省電的秘密(二):CStates - 知乎專欄

睿頻:榨乾CPU所有的潛力(CPU電源管理系列番外篇) - 知乎專欄

歡迎大家關注本專欄和用微信掃描下方二維碼加入微信公眾號“UEFIBlog”,在那裡有最新的文章。同時歡迎大家給本專欄和公眾號投稿!

CPU省電的秘密(一):EIST

CPU省電的秘密(一):EIST

用微信掃描二維碼加入UEFIBlog公眾號