M1芯片的橫空出世,改變了我們很多人對高效能低功耗CPU/SoC的認知。作為電腦系統結構方向的在讀博士生,迫不及待想要踏上工作崗位的預備役架構師,我對這顆芯片的興趣和圈內眾多老師同學、前輩專家們是一樣濃厚的。
所以MBP 21款釋出的北美時間當天下午,我就下單訂購了一台M1Max 32核GPU + 32GB記憶體的高配版。
在收到機器的11月15號之後,我花費了大量個人時間去搭建自動化測試環境,編譯移植各種benchmark。終於在一個半月後的今天,能夠將功耗測試結果呈現在這裏。
其實我知道業界有幾家頂尖SoC團隊對M1系列芯片的逆向分析和Profiling工作都比我個人做的更早、更系統,但是圈內的前輩專家們受限於職位要求,相關數據和結論都是不方便公開的,希望這一份公開的功耗數據能帶來更多的正面友善的公開討論,為國產SoC/CPU行業做一點微小的貢獻。
場景說明
我根據自己和幾位朋友的日常使用習慣,總結了媒體、日常操作、生產力、遊戲四個大類的21個場景,並在關閉所有後台app、斷開電源電纜、全螢幕化操作的條件下啟動測試指令碼,記錄功耗數據。
功耗測試指令碼的核心是MacOSX內建的Powermetrics命令列工具[1],這個工具公開資料很少,推測其背後可能是蘋果的功耗模型,與Intel RAPL類似[2]。使用Powermetrics本身也會帶來微量功耗,Idle Power和Powermetrics本身帶來的功耗已經從下述數據中扣除。
Package Power
M1Max在Media,Daily和Productivity三大核心場景下,功耗平均僅有2w,其中32GB LPDDR5 6400貢獻了500mW,而CPU平均只有370mW。這再度印證了此前我接觸到的業界手機SoC上的功耗分析結論: 記憶體功耗占比是不能忽視的一環,甚至很多時候高於CPU功耗 。
M1Max的GPU在內部工具裏讀出來的代號是Apple G13X,這顆GPU在三大核心場景下平均功耗僅為133mW,如果去掉抖音這個耗費1500mW GPU功耗的outlier,平均僅為55mW,哪怕是驅動120Hz高刷屏上的重度網頁瀏覽時,功耗也只有78mW。作為對比,我的Geforce 1080Ti,理論浮點峰值和G13X相同,但在Win10完全Idle的狀態下,GPU Core本身就有15w的功耗,板級功耗是23w。Apple G13X的能耗比優勢可見一斑。
蘋果的ANE(Apple Neural Engine)只在Facetime Video Call這一個場景中被喚醒,產生了689mW的功耗,其余場景功耗讀出都基本為0。根據測試,微信視訊也會喚醒ANE,但是其他場景都沒有。看來AI加速器的落地套用對於蘋果來說也是一個很頭痛的問題。
來到遊戲場景,CPU功耗:GPU功耗:記憶體功耗平均下來基本上是1:1:1的狀態 ,也和高通此前公開的【堡壘之夜】測試結果[3]互相印證。有意思的是,遊戲場景下GPU功耗有時還小於CPU,例如【NBA 2022】和【Asphalt 8】上都出現了這一現象。其中【Asphalt 8】從大核上消耗了5w功耗,甚至超過了很多CPU-intensive的benchmark,而GPU功耗只有800mW不到。
來到benchmark這一邊,問題就有意思了。我拿來了整個SPECCPU2006,SPECCPU2017和ARM原生的Geekbencp加入對比,這三者基本都產生了2.5-3.5w的CPU功耗,以及0.5w - 2.5w不等的記憶體功耗(其中浮點類套用的記憶體功耗稍高)。從功耗的角度上來說,這些benchmark與日常核心場景、生產力場景、遊戲場景的功耗分布情況都不太對得上,因此這些benchmark的功耗代表性,我個人會抱持懷疑態度。
CPU大小核分工與負載切分
在真實場景中,M1Max的大小核並不是一直活躍,而是只有10%-30%時間處於活躍狀態,而且活躍狀態下的平均工作頻率也不高,大核平均1075MHz(重度網頁瀏覽時會達到1.8GHz),小核平均1289MHz,這是mobile CPU功耗遠低於Intel設計的一個重要原因。
作為對比,我之前使用Intel i9的MBP 2019,CPU頻率如果低於2GHz就會產生明顯卡頓,低於1GHz就基本沒辦法正常用,所以正常情況下Intel CPU頻率很少低於2GHz,而M1Max在1.2GHz平均頻率的小核上,系統基本感受不到卡頓。
透過把retired instruction的來源進行歸類,可以反推出大小核分別承擔的工作量比重。在這張圖上可以再次看到benchmark和真實場景的巨大區別,真實場景上的小核要分擔30%-70%的工作量,大小核的分工和切換是整個系統中不可缺失的一環,但是在這些流行benchmark中都沒有覆蓋到。
啟示
在釋出這篇文章前,我與一些工業界的前輩專家們討論過文中的功耗數據,除了蘋果低功耗設計的優異以外,大家都驚訝於蘋果的Powermetrics能做到這種程度,上面有些部份的數據(例如大小核的負載切分情況),是用傳統的拆機分析方法無法獲取到的,因此,對於國內的同行們來說,發展一套類似的功耗模型是非常有必要的。
Powermetrics的功耗數據精度未知,具體原理應該是透過監測微架構級別的各種行為來合成一個功耗數值,從RAPL相關論文[4]中公布的情況來看,準確率推測是比較高的,或者說誤差小於run-to-run variation範圍。
(圖為Intel RAPL功耗估計值與實測值的對比)
如何做到蘋果這一級別的gating和DVFS也是一個可以研究的課題,裏面有很多適合研究團隊去探索的地方,比如Intel的論文裏就提到一個現象,不同的場景下,CPU主頻和實際效能並不一定成簡單的線性關系,因為訪存的存在,有時候拉高10%的主頻只能獲取8.6%的效能提高。從架構層面上來說,DVFS應該還存在類似的其他一些挖掘空間。
(圖為Intel論文中展示的主頻與效能的關系,會隨著程式phase變化而變化)
遊戲場景的測試數據出現了CPU功耗高於GPU,甚至高於CPU-intensive benchmark的現象,所以做mobile computing的同學可以考慮跟進分析,具體是什麽樣的程式碼導致了這樣的行為特征。SPECCPU和geekbench這樣的傳統流行benchmark從功耗上來說無法表征真實場景,我們也需要一套更好的benchmark,能夠更加真實地反映真實場景下的大小核負載切分和DVFS帶來的效能/功耗變化。
此外,CPU與作業系統的低功耗設計垂直整合也是我們需要面對的新課題。例如說我觀察到,同一個App從視窗模式下執行時,切換到全螢幕模式下執行後,M1Max的功耗會產生顯著的降低,推測是點選全螢幕按鈕以後,後台任務被挪到了小核上/進一步調低了電壓頻率/直接讓後台任務睡眠導致的。
蘋果的小核已經在500mW的功耗水平上幹到了A76級別的效能,而小核會承擔日常任務的30%-70%,是絕對不能忽視的部份,這對於海思和其他有誌於自研核的團隊來說又是一塊不好啃的硬骨頭了。
最後,我的12900KF也已經躺在新購置的Z690主機板上,正在等待廠家的安裝扣具到貨。下一篇文章中我會加入12900KF的功耗數據,以及Intel最近十年的連續五代微架構的效能對比。
近期的另一項工作是編寫偵錯MacOSX的內核模組,去抓取被蘋果封印起來的M1Max效能計數器數據。如果這一項工作成功,M1Max的一些關鍵效能指標(例如8發射下的分支預測效能損失)也會一同呈現出來。
(本文先發於自己的個人公眾號日常扯破布,知乎同步轉載)
參考資料
[1] Powermetrics Man Page
https://www. unix.com/man-page/osx/1 /powermetrics/
[2] Intel RAPL
https:// 01.org/blogs/2014/runni ng-average-power-limit- –-rapl
[3] Mobile GPU approches to power efficiency
https://www. highperformancegraphics.org /wp-content/uploads/2019/hot3d/mobile_gpu_power_and_performance.pdf
[4] Power-Management Architecture of the Intel Microarchitecture Code-Named Sandy Bridge. IEEE Micro 2012.