ARM在今年5月份新推出的Cortex A77架構,采用TSMC 7nm工藝,3GHz峰值頻率,性能提升20%。之前一篇文章介紹過X86最強處理器ZEN的架構,詳見。本文基于同樣原則來分析ARM架構最強處理器A77,深入探討其設計方案以及和X86架構的異同。
首先簡要介紹下ARM指令集架構。目前通用處理器基本上分為2個陣營,一個是以INTEL,AMD為首的CISC(Complex Instruction Set Computer)指令集,另一個是以ARM為首的RISC(Reduced Instruction Set Computer)指令集。兩者之間的主要區別是指令的功能單一性。RISC ISA通常一條指令完成簡單獨立的一種運算或控制,指令長度固定,格式較為統一。而CISC ISA指令的功能要復雜的多,指令長度可變,格式復雜。由于RISC指令編碼和功能上非常有利于硬件實現,處理器發展到今天,不論X86還是ARM,其硬件執行核心已經都是RISCV架構了,而X86多了一層將CISC指令 翻譯成RISC類微指令的步驟,因此譯碼部分不但增加了額外的流水線級,實現上也復雜許多,這也是X86處理器功耗大于同級別的RISC處理器的一個重要因素。
Cortex A77面向移動高性能領域,采用ARMv8.2 64位指令集架構。硬件設計上和A76一脈相承,都采用了7nm工藝,峰值頻率也沒有變化。從這點來看,A77的流水線結構應該和A76是一致的,20%的提升主要在微架構的細節方面,用來提高IPC和并行執行的能力。隨著工藝進展到7nm,其單芯片的功耗密度在很大程度上制約著主頻的提升。ARM主要面向移動市場,并沒有在頻率控制上向INTEL看齊,而更加追求單位功耗下的性能比。因此很多設計上并不以頻率為首要目標,可以看到其L1 cache size達64KB,甚至超過了ZEN2的32K。其他的如DynamIQ,big.LITTLE等基本都是ARM的標配。
A77的流水線結構沒有太大變化,還是標準的physical register Out-of-Order machine。其中有幾個值得注意的點。第一個是1.5K entry的Mop Cache。這個在X86上存在了很久的結構終于出現在ARM的處理器中。X86是復雜指令集,引入Mop Cache可以存儲解碼后的微指令,這樣能夠直接bypass fetch和decode的流水線,獲得更大的dispatch寬度。我們看到這個Mop cache是放在fetch級的,和Icache的結果mux后,統一送給decode模塊。如果這個結構正確的話,這個Mop cache的主要目的就是功耗控制和減少branch penalty。Decode級增加到了6條指令,同時拓寬了issue寬度,增加了1個AlU和1個BRU。這樣A76的執行單元有4個ALU,2個BRU,2條Load-store pipe。可以看到Apple的處理器設計對ARM還是有很大影響的。在大家都在大幅提高并發能力,推高單核峰值性能的趨勢下,ARM也沒辦法獨善其身,繼續其極致能耗比的設計。另一個原因可能也和ARM服務器的再次興起有關,隨著華為、amazon推出自行設計的ARM服務器芯片,冷卻了幾年的ARM服務器市場似乎又熱鬧了起來。在這種形式下,ARM也需要一款單核性能能和X86陣營較量的處理器,能夠推動更多的廠家進入,向X86發起挑戰。A77的配置,可以說是兼顧了高端移動市場和入門級服務器市場的需求。
前端流水線,最重要的改動就是增加了Mop cache。假設其寬度和decode數目一致,1.5K的entry就可以存儲9千條32位指令,應該可以覆蓋大多數移動領域的應用場景。在Mop cache warmup后,指令可以不經Icache通路,直接從Mop cache發送到decode級,這樣整個fetch單元都可以進入低功耗狀態。同時其中存儲指令譯碼后的信息,包括分支和循環的預測結果,可以實現zero cycle的hardware loop,進一步提高了循環的執行效率。第三,從Mop取指相當于減少了fetch流水線的長度,這樣出現branch misprediction之后,如果新的target也在Mop中,flush流水線的penalty也會降低不少。這里還提了一個Dynamic code的優化手段,似乎是學習了code sequence的相關特征來提高后級執行的能力,具體不知道ARM是怎么做的。
Branch prediction是另一個重點優化的手段。可以看出和ZEN2的方向如出一轍,這也是前端流水線最重要的性能指標。A77拓寬了branch prediction的bandwidth到64B,這樣理論上可以同時預測16條32位指令的分支結果。同時也和ZEN一樣,大幅增加了BTB的size。可以看到,A77相對于ZEN少了一個L0 BTB,只有2級BTB。由于沒有具體的數據,很難說哪個方案更好,應該是根據各自面對的應用場景測試后選擇的方案。共同的趨勢都是更大的預測器和預測寬度。
Decode級主要是增加了50%的dispatch寬度,6條指令的并發理論上可以提供更大的并行執行能力。隨之ROB的entry數也增加到160個。這里提到了加快renaming table在branch misprediction后的update速度。通常renaming table會在相應branch retire時,恢復到actual renaming的狀態。這里提到的accelerate,有可能是提供了多個branch recovery點,可以不等retire,直接恢復到最近的recovery點上。這樣硬件復雜度和面積都會增加。由于沒有更詳細的信息,也只能做上述合理的推測。
執行單元,主要是數量的增加,向Apple看齊。注意ARM一直保持了single cycle的ALU,這在單核IPC性能上至關重要,ZEN2也保持了這一點。A77采用了Unified Issue Queue,這和ZEN分離式的設計有所不同。一體化的IQ可以帶來更好的schedule效果,但會在很大程度上制約頻率的提升。這里體現了ARM并不以頻率為首要目標,而更多的考慮綜合的能耗。另外的變化是增加了crypto流水線,提高AES編解碼的能力。對于這一點,作者還是持保留態度。目前對于crypto的加速通常采用專用加速器實現,因為 算法確定,ASIC能獲得非常高的加速比,同時硬件代價較小。并且ASIC實現的crypto加速器可以和處理器完全隔離,做到純硬件的加解密,這樣安全級別很高。而用處理器實現,首先性能和功耗有數量級上的差距,其次是指令實現,軟件參與度較高,安全性上難以保證。
Load-store流水線,同樣采用了統一的Issue Queue。可以看到A77有2個address的path和2個st-date的path,可以同時執行2條存儲指令。組合可能是2條load,2條store,1 load+1 store。這里采用了2條store pipe的方案還是比較激進的,應該為了更高的內存搬運的性能。對于通常的應用,這額外的一條store data估計是起不到多大作用的。
這里ARM著重介紹了其pre-fetching的機制。數據的prefetch可以很好的隱藏系統內存的訪問延遲,在高性能處理器上非常重要。通常的prefetch都是根據數據執行的特征,支持1維或多維的stride形式預取。A77提出了一種system-aware的prefetching,號稱針對存儲子系統的特征提供更高的prefetch能力。由于信息有限,不知道這個system aware是怎么實現的,可能是根據內存延遲的不同,以及L3 cache 各核心的使用率,動態調節了prefetch的數目和策略。
從ARM給出的性能指標來看,A77的能效比還是很高的,尤其是功耗,這也是ARM最核心的競爭力。
從A77的技術指標來看,通用處理器的設計呈現出以下趨勢:首先,和在“ZEN2”一文中解釋的那樣,通用處理器的微架構已經趨于穩定,大的方面玩不出新的花樣了,都在細節上做進一步的提升,比如更寬的發射通路,更多的執行單元,更大的預測器等。這給了后來者一個很好的追趕機會。其次,ARM的移動處理器的設計正在逐步趨同于INTEL和AMD在桌面處理器的結構,除了核心頻率較低以外,其他的指標已經差距不大了,很多X86上獨有的技術正在逐步出現在ARM的設計中。隨著工藝逼近其物理極限,ARM和INTEL的差距在快速的縮小,很可能不遠的將來,ARM處理器會具有和X86在服務器市場一戰的資本。第三,工藝尺寸的縮小帶來功耗密度的大幅增加,成為制約核心頻率的重要因素。可以看到A77并沒有支持更高的頻率,并且按之前SOC設計來看,最終的芯片估計只能維持在2.5G左右。由于移動端散熱條件更為苛刻,可能通常的應用會采用多核心工作在較低頻率,而對于游戲等大型應用,會提高單核的頻率,其他核心降頻或進入低功耗,保持整個芯片的功耗在可控范圍內。INTEL的睿頻技術也是差不多的方式。功耗將在很長一段時間里成為處理器性能提升的瓶頸,對設計者能否根據具體的應用場景來提供靈活的執行方式提出了更高挑戰。
因此,領先者制約重重,后來者可以奮起直追。現在可能是國內處理器發展的大好時機。比如前幾天平頭哥宣布的玄鐵910,綜合性能已經可以和ARM A72持平,這是國產處理器和世界一流水平差距最小的一次。可能用不了多久,我們就能在移動市場追上ARM的腳步。不過ARM的優勢更多的在于生態,新興的RISCV能否打破這個限制,以開源為核心建立起自己的生態體系,就成為國產處理器商業化道路上的關鍵因素。期待這一天早日到來。