Arm Cortex A78微架構評測(上):中核奠基之作。
前言
A78的故事得從2018年講起,彼時Arm Austin團隊接過了微架構設計的接力棒,帶來了影響深遠的A76。A76在我眼中是Arm A系列步入現代高性能處理器領域的第一款微架構,其諸多的先進特性和良好的功耗、性能表現為時至今日的Arm微結構演進打下了良好的基礎。
次年的A77是一步堅實的迭代,引入了更合理的后端配置和micro op cache等部件;采用了A77的驍龍865也堪稱一代傳奇。在A78世代,同期的X系列接過了wider、deeper的任務向最高性能發起沖擊;而A系列的定位悄然由大核變為了中核,在X1的映襯下似乎黯然失色。那么A78的表現究竟如何呢?我們來一探究竟。
基準測試
在這一部分我們使用SPEC06、SPEC17、Coremark以及Verilator對處理器進行測試。注意,我們并不執著于fine-tune以獲得某一微架構的最高分數,而是以合理、統一的編譯參數帶來可比的分值數據。SPEC06、SPEC17等的分值受系統環境、編譯器版本、編譯參數、BIOS調教、頻率穩定性、具體SKU的Cache配置、具體平臺的內存參數等因素影響巨大,且無法通過任何簡單線性縮放進行分數推演。
頻率
我們使用的平臺是Microsoft windows dev kit 2023;處理器為高通8cx Gen3。在多次更新后處理器已經能夠穩定運行在2.4GHz,以下的測試都基于2.4GHz的頻率進行,但是A78微架構本身是可以運行在更高頻率的。
SPEC06
SPEC06是已經退役的SPEC測試集但是仍然被廣泛使用;其負載特性與SPEC17并不相同,因此仍然具有相當的測試價值。
A78擁有這三款處理器核中最高的IPC性能;考慮到其較小的浮點后端規格,其浮點性能也十分優秀。在mcf等重訪存項目上,A78絲毫不遜于Gracemont;考慮到8cx Gen3相對較小的Cache規模,A78的極限應遠不止于此。Icestrom受制于E核簇較小的可訪問L2 Cache容量,在諸多子項上都落后明顯,絕對性能并不是其強項。
SPEC17
SPEC17是現役的SPEC測試集,被廣泛用于微結構性能評估。
A78擁有這三款處理器核中最高的IPC性能,考慮到A78也可以運行至3GHz,與Gracemont相比擁有相當的競爭力。Icestorm以極低的能耗著稱,但是在絕對性能上并不是其他兩款處理器核的對手。A78最令人驚奇的是其相較A76(本圖并未列出)的提升十分全面,在幾乎所有子項上都有正向提升而非“取舍的藝術”。
Coremark
Coremark是一款嵌入式基準測試程序,其受下級Cache子系統、內存等的影響極小,主要考察核內流水線以及L1 Cache的性能表現。
可見A78的表現十分優秀,充分發揮了mop cache供指時6發射的前端優勢;Icestorm則受制于較弱的后端執行單元規格,落后于其他兩款CPU。
Verilator
以上三款測試集對處理器的前端壓力較小,仿真大規模設計的verilator則恰恰相反,海量的分支與數MB的代碼足跡能夠輕松壓垮ICache、BTB等組件,導致巨大的性能下降。
在這一項目中,盡管Icestrom頻率最低但仍然勝出。采用分離式前端的A78與Gracemont受制于較小的前端規模,發生了海量的BTB miss;采用傳統設計的Icestorm則將ICache視為下級BTB,因此取指效率更高。A78本身也并沒有為前端bound負載優化的跡象,表現較為普通,甚至不敵較老的源于A76的N1。與Skylake相比更因為巨大的目標頻率差異而被遠遠甩開。
前端
隨著現代程序體量的膨脹,處理器面臨越發巨大的前端壓力;為了應對巨大的程序代碼段帶來的海量跳轉指令,大部分高性能處理器核心的BTB容量、分支預測器容量不斷擴展,分支預測算法不斷演進。
BTB
對于A78這樣的分離式前端設計,BTB是前端的絕對核心組件。其負責在譯碼之前識別指令流中的跳轉指令,并提供相應的跳轉目標地址。頻繁的BTB miss會造成嚴重的性能損失。
可見,A78的L0 BTB容量為64項,疑似全相連;L1 BTB為4096項,組相連。對于現今的分離式前端設計而言,這樣的BTB配置并不算大;但是考慮到A78的定位,4K項也算是誠意十足,與常青的傳奇架構Skylake規模相當。但是決定BTB性能的遠不止有效容量,其吞吐率、預測速度也十分重要。當分支指令數量小于64條時,平均每條分支指令的執行延遲僅有0.5 cycle,即A78支持每周期2 taken分支。
現如今的其他消費級處理器中僅有Intel的新產品12代、13代酷睿(GoldenCove等)擁有與之匹敵的特性。當分支指令大于64條小于4096條時,平均每條分支指令的執行延遲僅有1-2 cycle;即此時A78每周期預測1條taken分支的代價在0-1間波動。如此低的下級BTB延遲也實屬不易。
作為參照,12K項的Intel GoldenCove BTB延遲為2,7K項的AMD Zen4 BTB延遲為1.5-2。總體而言A78的BTB表現十分驚艷,受制于其定位,A78在BTB容量方面有所保留,火力全開的X1則更為亮眼(容量相較A78倍增)。
RAS
指令流中的call、return指令是較為特殊的分支指令,其棧形式的行為特征催生了專門用于預測此類場景的RAS(Return Address Stack)。簡而言之,call指令壓棧,return指令彈棧;而硬件棧(RAS)結構的深度就影響了處理器在復雜函數調用場景中的性能表現。
可見A78的RAS容量為16項,與X1相比并沒有被閹割??赡軐τ贏rm而言,16項的RAS已經足以覆蓋常見場景了;但是為服務器優化的Zen3則擁有著32項的RAS。
BP
分支預測器是當代高性能處理器前端中的又一核心組件,負責在流水線早期給出分支指令跳轉與否的猜測,引導指令流的方向。在推測執行的超標量處理器中,分支預測器的準確率會極大影響處理器的性能和能效表現。
本測試考察分支預測器在不同歷史pattern長度、不同分支數量(需要預測)情況下的準確性表現。A78在4條分支、32條分支時經歷了一定程度的性能衰減。A78總體性能表現與Intel Goldencove相似,但是在追蹤海量分支指令時與Zen3仍有一定差距。
IJP
IJP(Indirect Jump Predictor)作為BP(Branch Predictor)的一部分,負責預測間接跳轉的目標地址。與預測跳轉與否的BP不同,IJP需要在多個可能的跳轉目標中選擇本次的跳轉目標,并引導指令流。
首先考察A78 IJP在不同歷史pattern長度(但是可能目標均只有2個)、不同間接跳轉指令數量(需要預測)情況下的準確性表現。A78在64條間接跳轉指令時經歷了一定程度的性能衰減,但是這種衰減可能并非IJP失效導致的,因為其并沒有導致跳轉地址錯誤而回滾,只是增加了少量的延遲。這可能是cascading預測的特征,IJP系統內某種規模更大但是速度相對較慢的結構修正了前級預測器的結果,導致taken延遲小幅增長。
另外注意到,2條間接跳轉指令時,A78 IJP內部可能發生了某種Hash沖突導致性能顯著降低;對于Hash算法而言,類似的corner case是難以完全避免的。與X1相比,A78的IJP規模被小幅減少了;不過考慮到間接跳轉指令在一般程序指令流中占比極少,這樣的取舍是完全合理的。
接下來,考察A78 IJP在不同可能跳轉目標數量、不同間接跳轉指令數量(需要預測)情況下的準確性表現。A78在64條間接跳轉指令時經歷了一定程度的性能衰減。其間接跳轉預測器的容量約為2048-4096項,相較X1減少了一半(4096-8192)。在SPEC06中間接跳轉較多的perlbench子項中,A78的表現尚可但也談不上優秀,還有一定的進步空間;但是不可否認,A78已經擁有了堅實的間接跳轉預測機制。
ITLB
TLB是現代處理器中容易被忽視的一個部件,其負責虛擬地址至物理地址的翻譯。在一般情況下TLB并不會成為瓶頸,但是隨著現代程序體量的膨脹,TLB承受的壓力也與日俱增,這一點在服務器負載中尤為明顯。由A系列衍生的Neoverse N系列會被用于服務器負載,因此TLB設計也不可忽視。
A78的ITLB容量為48項,取值時可以訪問的L2 TLB容量為1024項。在一般用戶程序中這樣的TLB規模并不會成為瓶頸;但是已經顯著落后于當今的其他競品。
取指
處理器對程序的執行始于取指,前端的指令供給能力至關重要;一旦前端無法提供足夠的指令,縱使后端的亂序執行能力再強也無力回天。對于A78這樣的4發射處理器,我們期望其每周能夠取指至少4條指令。
由于A78配備了mop cache,我們可以看到當指令足跡在4KB-8KB時,mop cache能夠提供每周期6條指令的吞吐;mop cache的有效容量在1.5K左右。當指令足跡溢出至ICache時,取值帶寬下降至4條/周期;這樣的帶寬是完全夠用的,ICache的有效容量在32KB左右。A78的L2 Cache取指帶寬相較ICache取指帶寬并未嚴重下滑,仍然保持著~3.4條/周期的良好表現。
而在一些早期處理器上此時的取指帶寬甚至會下降至2條/周期。對于取指而言L2 Cache的有效容量在256KB左右;A78似乎有意限制了代碼段可以占據的L2 Cache容量,指令只能使用到一半左右的空間。當代碼段溢出到LLC后A78的取指帶寬下降到了2條/周期;同樣的,指令似乎只能最多使用一半的LLC空間??紤]到A78的應用場景,這樣的取指能力是可圈可點的。
A78的mop Cache對于nop指令進行了壓縮優化;倘若使用nop指令測試取指,mop cache每周能夠供給超過10條指令。?
后端
處理器的后端負責指令的執行,當代高性能處理器普遍配備了亂序超標量機制,后端的設計也是紛繁復雜。
流水線寬度
在超標量處理器中我們著重關注前端與mid-core部分的寬度。
流水級寬度
當指令流能夠被mop Cache容納時,A78能夠提供其最大吞吐:6條指令/周期;此時處理器bypass了譯碼級以及以前的部分,因此只要重命名級擁有足夠的寬度即可。較少的decoder有利于降低功耗,緩解流水線寬度增加時前端的膨脹。但是A78的mop Cache放在當代是顯著偏小的,面對不算很大的代碼段時也會退化至4發射,這對同源的Neoverse N系列是很不利的(雖然A78并沒有對應的產品)。
執行單元
A76首代只配備了3組ALU,在隨后的A77中補齊為4組,A78延續了A77的設計。簡單ALU并不占據過多的面積,難度來自物理寄存器堆讀寫端口的設計,這在更寬的處理器上會更加棘手。A78配備了2組BRU,在密集跳轉應用中能夠保證吞吐量,符合現代應用程序發展的趨勢。乘除法單元上A78選擇了非對稱配置,由于除法指令使用較少,這一選擇是合理的。其乘法器延遲符合預期但是除法器算法則顯得較為普通;除法器支持提前退出,當被除數變為0時算法可以立即結束。
A78擁有3個AGU(訪存地址生成單元),但是AGU load與AGU store并非分離式設計;3個AGU中2個支持load/store操作,1個只支持load操作。對于一款4發射處理器而言,這樣的訪存單元配置不可謂不豪華;在memory wall越發明顯的趨勢下,重訪存也是我個人十分欣賞的設計哲學。但是我個人更喜歡Intel式的AGU load與AGU store分離的設計,但是這也會顯著增加發射隊列、物理寄存器堆設計的復雜度,也許這樣的設計蘊藏著Arm自己的取舍哲學。
由于A78的定位其只配備了兩條浮點流水線,但是在基準跑分中其浮點成績十分優秀,這也是重訪存設計的優勢。其FMADD延遲表現優異僅需4周期,FADD延遲表現優異僅需2周期,但是A78本身的目標頻率也較低,因此在這方面Intel似乎更勝一籌。Arm的特點便是提供足額的FMA單元,且FMA單元均支持較快的獨立FADD操作。
Arm在浮點寄存器堆的設計上也有所取舍,并沒有提供足額的讀端口;這一點在浮點執行單元較少的A78上并無大礙,但是會限制更寬的設計(如X1)在某些場景下的吞吐量。
總體而言A78的后端執行單元配置較為均衡,偏重訪存和分支,弱浮點向量。當然,其相對較多的訪存、分支單元也是為了兼顧mop Cache供指模式下6發射的吞吐量。