徐少卿
最近華為Mate 9以及其所采用的麒麟960處理器吸引了不少目光,其中后者的性能和功耗表現都令人滿意。在它出色表現的背后,離不開Cortex-A73架構的支持。那么究竟Cortex-A73有哪些改善和進步?它和Cortex-A72又有什么不同呢?今天本文就要帶你一起深入了解Cortex-A73。
Cortex-A73,這個代號“Artemis”的架構是ARM最新推出的處理器核心架構。從實際產品的角度來看,Cortex-A73相比之前就已經比較成功的Cortex-A72而言,在性能和功耗表現上繼續改善,尤其是性能功耗比有極為顯著的提升。那么,為什么ARM要在Cortex-A72發布后沒多久就發布Cortex-A73呢?要了解這個問題,不妨先來簡單回顧一下ARM最近數年的產品發展史,讓歷史告訴我們答案。性能?功耗?亦或性能功耗比?回顧ARM近期發展史
在Cortex-A73出現之前,ARM的Cortex-A72在性能和功耗上的表現已然比較出色了。但Cortex-A72從Cortex-A57那里繼承來的“問題”依舊存在——它還是太“大”了一點。Cortex-A72整體性能功耗比的表現受制于架構問題,除非工藝再次進化,否則很難有更進一步的改善。為了更清楚地解釋這個結論,我們不妨回頭看TARM之前幾款產品的發展歷史。
對ARM架構發展歷史比較熟悉的用戶應該還記得,Cortex-A9是一款非常成功的移動CPU架構,它在當時的制程下很好地平衡了功耗和性能,相當一大批移動設備都基于Cortex-A9研發,其中有名的處理器包括三星Exynos 4412、Exynos 4210以及TI OMAP4430/4460、英偉達Tegra 3等。
Cortex-A9的成功,讓ARM在追求性能的道路上越走越遠,并在不久之后推出了Cortex-A15。從性能角度來看Cortex-A15的表現的確令人滿意,它的IPC得到了顯著提升。但隨之而來的是更高的功耗和較低的性能功耗比(當然也有受制于工藝的原因)。與此相應的是,基于Cortex-A15架構的初代SoC芯片,比如Exynos 5250和Exynos5410在功耗方面表現不佳。
在這種情況下,ARM設計出了創新的big.LITTLE架構,希望通過高性能高功耗的大核心搭配高性能功耗比但是整體性能較差的小核心來提高系統整體的性能功耗比,最終實現降低功耗、延長設備使用時間的目的。big.LITTLE的推出,很快得到了移動處理器廠商的歡迎,大量使用Cortex-A15搭配cortex-A7的處理器出現,包括華為麒麟920和三星的Exynos 5422。
ARM此時還沒有深刻地認識到處理器的性能功耗比實際上是移動設備的核心競爭力,畢竟此時工藝尚有更多潛力可挖。于是,ARM按部就班地發布了全新的ARMv8指令集,這是ARM第一個支持64位計算的指令集,與此同時還有支持64位的Cortex-A57大核心和高效能的小核心Cortex-A53。本來在ARM的計劃中,cortex-A57會用上16nm甚至更好的工藝,不過蘋果憑借Cyclone架構帶來的64位A7處理器讓業界風向為之一轉,大量廠商不得不在提前使用cortex-A57和cortex-A53來“抵抗”蘋果突然來襲的64位處理器。
結果在當時28n m/20n m工藝下,Conex-A57的性能功耗比非常糟糕。在初步的嘗試中,高功耗等問題使得很多廠商不得不棄用cortex-A57,包括華為麒麟930、聯發科Helio X10都只使用了Cortex-A53。凡是使用了cortex-A57的核心,比如驍龍810或者驍龍808、Eynxos 5433等,實際表現均相比前代產品有一定退步,尤其是在功耗效率方面甚至大幅度倒退。
在這種情況下,ARM不得不繼續修修補補,推出了更為重視性能功耗比的Cortex-A72核心,高通等廠商則自行研發了Kyro架構,不再使用ARM能耗比較低的公版架構。CortexoA72的推出以及16nm/14nm等先進工藝的使用,才使得移動處理器拜托了之前“大火爐”危機。
實際上,我們在討論的時候,忽略了兩個重要的型號:Cortex-A12和Cortex-A17。其中前者是Cortex-A9的改進型產品,后者則是Cortex-A12的深入改進型,原因是Cortex-A12不支持當時ARM主推的big.LITTLE技術,Cortex-A17支持了新技術并可以和Cortex-A7搭配成大小核心。按理來說,如果蘋果沒有那么快推出64位A7處理器,Cortex-A17應該會被諸多廠商接納并發布不少新品。從當時的狀況來看,Cortex-A17是比較符合當時的工藝發展的。市面上相應的產品有Rockchip RK3288、海思Hi3536,以及聯發科的MT6595等。從一些測試結果來看,MT6595在當時的頻率和工藝下都給出了相當出色的性能、功耗表現,甚至超過了高通那顆著名的驍龍800處理器(當然也遠勝驍龍810)。
Cortex-A17能夠在工藝小幅度落后的情況下還提供更高的性能功耗比,顯然這是一個不尋常的事件。事出反常必有妖。在這里,還需要梳理一下多年來ARM這些處理器架構的來源,看看是否能找到一些苗頭。
從ARM的發展歷史中可以看出,ARM擁有多個CPU架構設計中心,面向不同的用戶推出不同的架構家族。其中,位于美國德克薩斯州的奧斯丁設計團隊發布了cortex-A15、Cortex-A57、CoRex-A72,從本刊之前的介紹和實際架構來看,奧斯丁家族的架構具有一脈相承的特性。另外一個地方則是英國劍橋,ARM劍橋設計團隊在這里設計了打造了著名的小核心產品,包括Cortex-A5、Cortex-A7和Cortex-A53。最后一個地方就沒那么有名了——位于法國的索菲亞·安迪波斯利,歐洲科技中心,推出了Cortex-A12、Cortex-A17和Cortex-A73。如果從血緣關系來看的話,索菲亞家族的處理器架構才是之前大獲成功的Cortex-A9的正統繼承人。
現在終于真相大白,Cortex-A73和之前的處理器都不太一樣。ARM在Cortex-A9后數代產品都選擇了奧斯丁家族,現在終于回到了索菲亞家族。下面我們就一起來看看,索菲亞家族的Cortex-A73優勢在哪里,憑什么能壓倒奧斯丁家族,被ARM選中而“上位”。
CorteX-A73架構——為實現更高的性能功耗比而努力
從上面的回顧中可以看到,ARM在處理器發展的過程中一度更為偏向性能,對功耗的重視程度并沒有放在首要位置,尤其是在早期制程尚能“抵消”更大的核心帶來的更高功耗時。不過現在這樣的情況已經發生了變化(尤其是制程進步遠沒有之前那樣容易),ARM不但更重視功耗,而且還提出了一種全新的性能考量方法,那就是“可持續性能”。
所謂可持續性能,是指處理器在較高性能輸出狀態時所能持續的時間。目前很多SoC芯片的峰值性能表現都非常好,但是這些峰值性能的功耗表現甚至超過5W,而一些極端SoC則超過10W,這顯然是一個完全無法持續的狀態,大部分手機在峰值性能下只能維持幾分鐘就必須降頻甚至關閉數個大核心,無法提供持續的性能輸出。這樣一來,更高性能產品存在的意義就被嚴重削弱了,尤其是設備商為了更好看、更吸引人的設計還在努力將手機造得更加輕薄。所以讓手機擁有高可持續性能就變得極為重要,Cortex-A73的意義就在于此,ARM通過這個全新的架構在降低功耗、提升能耗效率和維持較高峰值性能的同時還能保持和之前Cortex-A72基本相當的IPC。
在解析Cortex-A73之前,我們先來回顧一下Cortex-A72的架構情況。Cortex-A72是一個擁有超過15級流水線、亂序執行能力的處理器。在指令端,Cortex-A72設計了一個128bit提取單元和一個三發射解碼級。每個周期將有最多3個指令被解碼為uops(微指令),然后將這些指令送入Rename/Dispatch(重命名,調度)階段,調度單元每個周期能夠實現5個uops的調度,最終通過IsQ單元派送7個隊列并安排排序后的uops進入8個執行管道。在這8個執行管道中,有2個執行諸如加法和位移這類基本操作的ALU(Simple Integer |0和Simple Integer|1),整數的乘法、除法和乘法累加運算有專門的多周期整數流水線(Mu…Cycle M),還有專門對ASIMD以DNENO這樣浮點運算進行處理的兩個管線(NENO/FP FO和NENO/FP F1),還有單個分支監視器(Branch B)以及兩個專用的AGU讀取和存儲單元(AGU LD和AGU ST)。
再來看Cortex-A73。從Cortex-A73的架構圖可以發現它和Conex-A17相似度非常高,這和Cortex-A72三發射設計架構完全不同。Cortex-A73微體系結構的特點在于流水線級數較短,只有大約11~12級,較短的流水線主要來自于對整個流程的優化。與Cortex-A72在指令提取端的5級流水線相比,Cortex-A73的指令提取端只有4級。更值得一提的是,Cortex-A73較短的指令解碼端只有一級,這使得絕大多數指令能夠在一個周期內完成,而不是Cortex-A72的三個周期。在指令執行階段,只有浮點指令需要額外增加一個周期,也就是總計需要12級流水線,其余整數部分只需要11個周期就可以完成。
與Cortex-A17相比,Cortex-A73將最大的指令調度能力從4uops提高到了60ps,FP解碼端可以獨立向IsQ單元和NENO單元發出2uops指令,這和Cortex-A17是一致的。但是整數部分卻從Cortex-A17的2uops增加到74uops,經過重命名,調度的指令進入指令排序時,三個IsQ單元每個都可以派送2個隊列,從而進入后端的5個整數執行單元中。
再來看看Cortex-A73的后端,它有兩個FP流水線,這一設計也被Cortex-A72借鑒學習并應用在自己的架構中。其余部分Cortex-A73設計了一個分支檢測器和兩個AGU單元——但是每個AGU單元都可以同時完成讀寫操作,而不是像Cortex-A72那樣只讀或者只寫。此外在整數執行部分,Cortex-A73設計了兩個4級、較復雜的整數單元,其中一個可以執行乘法,另一個可以執行整數除法,這兩個都能夠執行基本的加法和位移操作。乘法累加不再使用專門的ALU,而需要這兩個ALU通力合作。
對比Cortex-A73和Cortex-A72大相徑庭的設計風格,正如ARM宣稱的那樣,Cortex-A73是一個充分優化管道、資源和接口的架構,它的目的是盡可能在最小的功耗下實現最佳的性能。ARM還宣稱它們對AArch32和AArch64 ARMv8做出了平衡,因此在執行不同命令時性能和功耗都不會有太大的劣勢。
說完了核心,再來看看集群。Cortex-A73可以支持四核心配置,每個集群能夠容納一個到四個核心,ARM依舊使用SCU一致性單元來保證集群中核心之間的一致性。集群的包含式L2緩存最高可配置8M B(包括L1緩存的數據),和Cortex-A17一樣,是Cortex-A72的兩倍,當然大部分消費級產品最多配置1MB或者2MB的L2緩存。
附加功能方面,ACP的加速一致性端口是可選配置,移動設備一般不會配備。ACP主要用于附加模塊和CPU核心共同運作,同時也可以利用L2高速緩存。傳統應用中往往和網絡相關,但在移動計算中這一點并不重要。反倒是ARM目前比較關注機器學習和計算機視覺在未來的發展潛力,專門的加速器能夠提高平臺的效能。
由于Cortex-A73主要針對消費市場,因此它不支持AMBA 5 CHI標準,而是僅僅通過雙向128bit的AMBA 4 ACE標準。相比之下,老標準拋棄了那些用不到的功能,為芯片節省了面積和晶體管,降低了復雜性。目前所有支持big.LITTLE架構的SoC都使用了ACE接口相連并保持一致性,比如CCI-400。此外,不針對工業應用標準的另一個問題是無法提供L1緩存的ECC校驗支持,但是L2可以完全實現這個功能,因此這也變得不是那么必要。探尋Cortex-A73更底層的秘密
前面從架構設計角度解釋了Cortex-A73的優勢。下面我們更深入地從指令方面去探尋Cortex-A73的秘密。Cortex-A73的指令端設計為保持對核心的最大吞吐量才能實現最佳的IPc,這是微架構設計最重要的方面;同時,ARM還必須考慮到功耗因素,在設計上有所取舍。ARM稱Cortex-A73的設計為“基于槽的微架構”(Slot-based microarchitectures),這種設計和微架構對不同塊之間處理共享資源的方式有關。正如ARM解釋的那樣,Cortex-A73擁有8個“槽”(slot),每個槽可以獨立處理指令端的所有資源。主要優點是每個“槽”可以通過小環路來檢測之前“槽”的信息,這樣能夠消除對流水線指令端資源的冗余訪問,實現最佳功耗比,并且每個“槽”都擁有大量資源以獲得最佳性能。
指令預取模塊經過優化,提升了其最大吞吐量。其中一項優化是用于去除無用的“氣泡”并可以獲得更高的IPC。所謂“氣泡”,是指那些可能存在的危險導致流水線發生指令停滯或者延遲。在之前的微架構中,即使預測正確,并且指令端能夠向解碼端發送大量的指令,但一旦指令輸入解碼端并被分解成微操作的時候,就有很大可能遇到“氣泡”。但是Cortex-A73的設計可以檢測這種情況,并直接將微指令發送給解碼端,導致ARM中幾乎沒有“氣泡”出現,大大提高了效率。
在分支預測方面,cortex-A73使用了一種“體現最高水準”的分支預測器,實現了比較準確的分支預測。ARM宣稱新架構擁有一個更大的BTAC(分支目標地址緩存,Branch TargetAddress Cache),并引入了全新的64通路(entry)的“micro-BTAC”用于加速分支預測。不過,ARM沒有公布更多的細節,只是含糊說新的分支預測設計能夠預測幾乎所有情況。對于那些發生了錯誤的預測,微架構設置了靜態分支預測器和返回堆棧來進行處理。
ARM有信心在這種雙發射的處理器上保持性能的同時提高效率。在電源管理方面,電源只對當前正在運行資源的邏輯有效。解碼器在指令融合方面也提供了顯著的改進。一般來說,常用習慣用法的指令融合處理對提高整體效能來說是非常重要的,但是檢測它們卻很困難。Cortex-A73能夠通過檢測之前的事件和整個管線的信息,來分辨出這些習慣用法。
在解碼端,將指令分解為更多的微指令有助于時鐘頻率,不過也相應地減少了整體的IPC。Cortex-A73能夠減少被分成的uops數量,并且改進了解碼器性能。正如前文所說,Cortex-A73的解碼器能夠在一個時鐘周期內完成大多數指令解碼,而不是之前Cortex-A72所需的3個周期。另外由于為ASMID/NENO浮點管線增加了流水線級數,因此ARM為其配備了兩個可以直接讀/寫的AGU單元,實現效率最大化。在指令分派端,Cortex-A73保留站的整數部分可以向為ALU、AGU和分支監視器設置的IsQ單元發布隊列,最多分派4個uops(每個IsQ最多接收2個)。
寄存器方面,Cortex-A72以及前代產品最重要的特點是使用物理寄存器而不是在架構類型的,這樣做的優點是重命名階段會簡化,并實現更高的性能、降低功耗。和Cortex-A17類似的是,這種做法允許一個理論上無限亂序指令的窗口,雖然實際中依舊存在限制,但它消除了某些情況下的指令窗口瓶頸。ARM甚至宣稱這種設計為“亂序微架構方法哲學層面的變革”。另外,Cortex-A73還特別優化了從重命名階段到IsQ階段的資源問題。IsQ階段所使用的亂序執行策略和方法對最終性能有很大影響,因此需要特別注意有關指令調度問題,比如隊列的排序可以取決于很多種事件,舉例來說當處在一個流式任務時,最好將昕有的存儲任務依次排列,這樣內存系統中將存在一個完整的緩存數據結構,以方便處理。
在數據端,Cortex-A73的NEN0單元基本還是繼承自Cortex-A72,但依舊做出了不少改進。在Cortex-A73上,NENO指令級單元混雜了FP傳輸和FP移動等功能,并且面積進行了一些優化,更小巧了。實際上,Cortex-A73和Cortex-A72的區別主要在于整數部分,前者使用了一個復雜的、多周期ALU,而后者則使用了簡單ALU。它們能力存在顯著差異:Cortex-A73中,一個ALU做乘法時,另一個可以做除法,但是乘法累積則需要兩個ALU同時出現。在Cortex-A72上,乘法累積有專門的單元操作,ALU則可以解放出來進行其他簡單工作。實際上Cortex-A73的設計對一些并行計算和雜項數據處理還是有意義的,尤其是最大執行吞吐量已經翻倍的情況下,效能會更為出色一些。
最后來看看存儲方面。在數據高速緩存地址轉換上,Cortex-A73已經從物理索引物理標簽(PIPT)切換至虛擬地址物理標簽(VIPT)。在PIPT中,遇到的最大問題是地址轉換產生索引,這是cPu核心的關鍵路徑數據。但是在VIPT中,這個問題不復存在,系統使用擴展的64KB數據緩存(Cortex-A72和Cortex-A17只允許32KB),ARM宣稱較大的緩存帶來了4%的性能提升。另一點需要指出的是,一般VIPT中軟件需要處理重命名的問題,但是ARM稱Cortex-A73使用硬件完成了這一點。在硬件上,緩存實現的是4路關聯性,但是在軟件上則看作PIPT的8路32KB或者16路64KB,這一點是非常特殊的。
在緩存部分,cortex-A73的L1緩存為4路設計且固定為64KB,這是對之前Cortex-A17 1-32KB/64KB可選配置的升級,也多于Cortex-A72的48KB。L1指令緩存的提升是Cortex-A73在性能上得到改善的一個關鍵性因素,ARM表示他們花費了很多時間來優化指令緩存的性能和功耗。其中一個例子是訪問緩存的方式,如果正在執行的一個訪問請求實際上是不需要傳遞數據的,那么這個訪問可以被終止,起到節約能源的作用。在L2方面,ARM改善了CPU之間的資源共享銷量,每個CPU都有自己單獨的資源,單獨的CPU數據流不會為其他cPu核心帶來性能影響,因此并行計算時CPU性能不會發生損失。
在讀寫方面,Cortex-A73的兩個AGU讀寫單元,這個設計對提高系統效能起到了很明顯的作用,尤其是存儲系統。在內存帶寬方面,Cortex-A73對TLB進行了改進。在之前的微架構中,當需要切換到主要TLB時,數據集的存在會導致性能下降,Cortex-A73通過為TLB提供自己的預存器來解決了這個問題,即使對于數據集也能實現可持續的流式傳輸。
Cortex-A73的性能和功耗表現
在架構上說了這么多,最終還是要落在實際的性能和功耗上來。ARM給出了一些官方模擬的數據,展示Cortex-A73可以帶來怎樣的提升。ARM宣稱Cortex-A73在BBench(網站加載基準測試)、SIMD性能以及內存性能方面,比Cortex-A72有著5%-15%的性能提升。
當然,由于Cortex-A73的解碼發射寬度降低至雙發射,因此在某些情況下相比三發射的Cortex-A72,性能可能有所下降,比如在Dhrystone這樣偏重于微觀角度的測試軟件中。但是ARM宣稱Cortex-A73的SPEc性能將和Cortex-A72相當,所以其性能還是值得期待。
功耗方面,這也是Cortex-A73的最大改進。ARM的數據表示Cortex-A73在整數、浮點和L2緩存復制方面都有了顯著下降,綜合下來相比Cortex-A72節約了大約200的功耗。當然這里面還有一些硬件因素,比如時鐘門控技術的更新、硬件控制電路的加強等。
最后ARM還展示了新工藝下的Cortex-A73在面積方面的改善。ARM宣稱在即將到來的10nm工藝下,Cortex-A73相比20nm的Cortex-A57降低了大約70%的面積,相比16nm的Cortex-A72面積減少了46%。在相同的工藝下,相比Cortex-A72降低25%的面積。另外,ARM還比較了目前比較流行的八核心Cortex-A53架構,ARM宣稱在相同的面積下可以實現2個Codex-A73搭配4個Codex-A53,這樣搭配的多核心性能能夠提升30%,單核性能能夠提高最多90%。
寫在最后
可以說,Cortex-A73依靠和Cortex-A72相當甚至更強的性能,但是卻更低的功耗、更高的性能功耗比成功站上了移動世界新王者的地位。目前華為麒麟960已經開始使用Cortex-A73架構,性能表現非常出色。在16nm工藝下,麒麟960能夠運行在2.3GHz,相信未來換用更先進的工藝后,頻率、性能還會進一步拔高。相信接下來諸如高通、聯發科等廠商也會快速跟上,在未來的新處理器中使用Cortex-A73架構。
現在還有一個新問題:依然有cortex-A73如此優秀的公版架構存在,是否還有廠商會花大力氣自研架構呢?我們看到蘋果A系列SoC自從Cortex-A92后就再沒有使用過公版架構,高通有自己的Kyro,三星也研發出了Mongoose。這些內核和Cortex-A73有什么差別呢?孰優孰劣呢?未來我們將進一步研究這些內容,并在合適的時候和大家一起討論。
總的來看,Cortex-A73基本實現了ARM改善移動SoC“可持續性能”的目的,在功耗、性能上實現了新的平衡,法國索菲亞團隊也證明了自己的卓越和成功。從性能到性能功耗比,ARM利用Cortex-A73實現了自己的改變。