ARM架構(gòu)的蘋果處理器為什么性能更強(qiáng)
蘋果在2008 年4 月23 日,冒著極大風(fēng)險硬著頭皮發(fā)表初代iPhone 的隔年,耗費2 億7,800 萬美元,購并了專注開發(fā)高效能Power 處理器的PA Semi,組成其處理器研發(fā)團(tuán)隊的骨干,然后在2012 年9 月發(fā)表的iPhone 5,其心臟「A6」處理器,終于不再使用來自ARM 授權(quán)的核心,采用自家的「Swift」微架構(gòu)(Micro Architecture)。
再以世界上首款搶灘登陸智慧型手機(jī)與平板的64 位元ARM 處理器「A7」(Cyclone 微架構(gòu))為起點,蘋果自家SoC 開始逐漸展現(xiàn)壓倒ARM Cortex 家族(與躺著中槍的Qualcomm 自有核心)效能優(yōu)勢,且隨著時間演進(jìn),差距越拉越開。
接著,每代iPhone 發(fā)表后,各大科技媒體網(wǎng)站的報導(dǎo),與底下的讀者回應(yīng),只會有兩種制式的單細(xì)胞生物反應(yīng):
文章高高掛著「眾人都驚呆了,連開發(fā)效能測試軟件的人都不知道發(fā)生了什么事」如內(nèi)容農(nóng)場般的標(biāo)題,再來繼續(xù)機(jī)械化的炒作「蘋果會不會用自家芯片取代Intel處理器」的多年冷飯。
底下的讀者留言雞同鴨吵成一團(tuán),上演「Android 自由主義」和「蘋果神權(quán)政治」信徒大對決,沒有人講到任何值得注意的重點,連一絲一毫的學(xué)理成分都沒有,宗教信仰就是如此奇妙。
筆者不啰唆,直接在這里講結(jié)論:
藉由牢牢把持軟硬件平臺的「封閉性」先天優(yōu)勢,蘋果掌握了ARM 指令集邁向64 位元帶來的機(jī)會,打造出一系列同時間能夠有效處理更多指令的先進(jìn)微架構(gòu)。
看起來好像微言大義到接近廢話的程度?如果你真的這樣想,那你就更有繼續(xù)讀下去的必要。
撥亂反正:做為電腦語言的「指令集架構(gòu)」vs. 執(zhí)行語言載具的「處理器核心微架構(gòu)」
近年來拜ARM 為首的授權(quán)IP 商業(yè)模式之所賜,越來越多人搞不懂這兩者的差別,完全混在一起,這些年來筆者已經(jīng)聽過太多讓人完全笑不出來的笑話,所以在此特別重述一次。
支配智慧型手機(jī)市場的ARM 又是怎么一回事呢?以32 位元ARMv7-A 指令集為例,在手機(jī)上常見的微架構(gòu)(核心),總計有:
ARM 本家賣IP 授權(quán)給別人的Cortex-A5 / A7 / A9 / A12 / A15 / A17 這幾種核心微架構(gòu)。
Qualcomm 自行打造的Scorpio / Krait。
蘋果并購PA Semi 后關(guān)起門來搞出的A6「Swift」,iPhone 5 的心臟。
換成64 位元ARMv8-A,就變成以下場景:
ARM 本家賣IP 授權(quán)給別人的Cortex-A35 / A53 / A57 / A72 / A73 這幾種核心微架構(gòu)。
增加半精度浮點支援和系統(tǒng)可靠度機(jī)能的ARMv8.2-A 指令集:Cortex-A55 / A75。
Qualcomm 自行打造的Kyro。
nVidia 的Project Denver。
蘋果繼續(xù)關(guān)起門來搞出的A7「Cyclone」,與之后的眾多芯片,如A8「Typhoon」、A9「Twister」、A10「Fusion」(Hurricane + Zephyr)、A11「Bionic」(Monsoon + Mistra) 。
為了伺服器而量身訂做的特殊微架構(gòu),如Qualcomm Centriq 2400 的「Falkor」,和Cavium Thunder X 系列的核心。
只要作業(yè)系統(tǒng)相同(如同版本Android 或iOS),這些核心微架構(gòu)應(yīng)當(dāng)正確執(zhí)行使用ARM 指令集撰寫或編譯出來的軟件,講的更專業(yè)或更假掰一點,它們擁有相同的應(yīng)用程式二進(jìn)位執(zhí)行檔介面(ABI,Application Binary Interface),如同Intel 與AMD 的x86 處理器都應(yīng)可正確安裝Windows 作業(yè)系統(tǒng),理所當(dāng)然執(zhí)行Office 等應(yīng)用軟件和Battlefield 等套裝游戲。
至于Qualcomm、蘋果和nVidia,是否根本自身特殊需求,自行定義「非官方」ARM 指令,那就后頭有空再討論了。
高效能之路:讓核心微架構(gòu)同時間內(nèi)能夠有效處理更多的指令
在執(zhí)行相同指令集「語言」的前提之上,相容處理器的效能要能夠勝出,只有微架構(gòu)設(shè)計能否比競爭對手有效處理更多的指令。方向不外乎:
更高的時脈: 雖然往往計算機(jī)概論會教你「指令管線階段越多,代表處理器同時執(zhí)行更多的指令,只是這些指令位處于不同的階段」,但實際上最多還是一個時脈周期「吐出」一個被執(zhí)行完畢的指令,所以現(xiàn)實層面的「加深指令管線」,實際上跟「提高運行時脈」講的是同一件事。很不幸的,智慧型手機(jī)因嚴(yán)格的功耗限制,透過積極追求高時脈以提高效能,是比較不切實際的方向。
更寬的管線: 一個便當(dāng)吃不夠,你可以吃第二個,嫌執(zhí)行一個指令不夠看,你也可以同時執(zhí)行第二個,這就是源自1966年CDC6600的「超純量」(Superscalar)架構(gòu)。另外也有純軟件方式、讓編譯器去一個蘿卜一個坑塞指令到不同執(zhí)行單元的「超長指令集」(VLIW),這就不在本文的討論范圍內(nèi)了。
足以喂飽嗷嗷待哺執(zhí)行單元的高效能記憶體子系統(tǒng): 包含系統(tǒng)主記憶體、快取記憶體、連結(jié)多個處理器核心的匯流排、舉足輕重的快取記憶體資料一致性協(xié)定(Cache Coherence Protocol) ,甚至可以非循序的存取記憶體位址(Memory Disambiguation),都是不可或缺的「基礎(chǔ)建設(shè)」。
天底下沒有白吃的午餐:兩種該死的「相依性」
但「指令管線化」與「指令執(zhí)行平行化」也帶來了新的挑戰(zhàn)。
控制相依性: 電腦有別于計算器的最重要特征在于「條件判斷」的能力,根據(jù)不同的條件執(zhí)行不同的指令流,處理器如碰到分支(Branch)或跳躍(Jump),就須改變指令執(zhí)行的流程,清除已經(jīng)進(jìn)入管線的指令,從另一個記憶體位址擷取指令,重新執(zhí)行并存取相關(guān)的資料(或稱為「運算元」,意指運算的目標(biāo),如特定資料暫存器或記憶體位址),而具備條件判斷的分支,造成的傷害更大,因為需要管線停下來等待其結(jié)果、或著事先預(yù)測并「先斬后奏」。
解決方案: 分支預(yù)測(Branch Prediction),與后面會提到、釜底抽薪減少分支指令的「條件執(zhí)行」(Conditional Execution)。
資料相依性: 當(dāng)同時執(zhí)行多個指令,最忌諱遭遇「撞衫」同時存取相同的資料暫存器與記憶體位址,特別是當(dāng)指令集定義可操作的資料暫存器越少,軟件手段可以盡量排除的空間越少,發(fā)生的機(jī)率也越高。[!--empirenews.page--]
解決方案: 以暫存器重新更名機(jī)制(Register Rename)為中心的非循序指令執(zhí)行(Out-Of-Order Execution)。
然后根據(jù)分支預(yù)測結(jié)果而先斬后奏「預(yù)測性執(zhí)行指令」(Speculative Execution),是分支預(yù)測與非循序指令執(zhí)行的結(jié)合體??傊?,我們盡其所能的讓管線「順暢」的像生產(chǎn)線不停的運轉(zhuǎn),實現(xiàn)最高的指令執(zhí)行效率。
理所當(dāng)然的,指令管線越深,一旦「筊杯」失敗,要復(fù)原管線并恢復(fù)指令執(zhí)行的代價,也越像火燒摩天樓一樣恐怖,這也是高時脈深管線近年來不太受歡迎的另類主因,因為現(xiàn)實世界的應(yīng)用程式,其實有很多難以預(yù)測的分支行為,越高的「代價」,更意味著更差勁的「效能/功耗」比。
LLVM 開發(fā)環(huán)境參數(shù)透露的神秘訊息
講了那么多原理,蘋果從來不公開自主微架構(gòu)的技術(shù)細(xì)節(jié),那該如何掌握他們追求高效能的設(shè)計方向?
2014 年初,當(dāng)多數(shù)世人正「驚呆」A7 的64 位元與驚人的性能表現(xiàn)時,有人注意到蘋果提交的LLVM 原始代碼,不僅透露了微架構(gòu)代號是「Cyclone」,更包含眾多重要的規(guī)格參數(shù):
指令發(fā)出寬度(Issue Width):6
非循序指令執(zhí)行緩沖區(qū)(Reorder Buffer):192
記憶體載入延遲(Load Latency):4
分支預(yù)測錯誤代價(Misprediction Penalty):16(一般介于14~19)
在當(dāng)時,這是非常驚人的規(guī)格,就算擺在今天也是同樣駭人,可同時處理的指令是同時期ARM 核心足足兩倍(即使64 位元的Cortex-A57 也只能3 個指令),非循序指令執(zhí)行引擎的「深度」則是Intel Haswell 等級,指令管線深度則中規(guī)中矩的維持在16 階這一般水準(zhǔn)。
相信有些讀者早已從其他網(wǎng)站看過相關(guān)的報導(dǎo),但有個「江湖傳言」倒是值得注意:部分開發(fā)iOS 應(yīng)用程式的程式設(shè)計者,做了一些指令輸出率的實驗,察覺到「A7 一旦執(zhí)行32 位元程式碼,指令輸出率就腰斬了」,這個「特性」一路延續(xù)到A10,直到A11 根本沒有32 位元應(yīng)用程式可執(zhí)行為止。
后來蘋果當(dāng)然就沒有繼續(xù)「規(guī)格大放送」,Wiki上蘋果處理器的規(guī)格表,一路從A7到A11,都是維持這些數(shù)字,有沒有經(jīng)過實測考驗也不得而知,反正就大家一起無限回圈繼續(xù)驚呆,蘋果持之以恒的甩開和其他競爭者的差距。
唯一可以確定的是,筆者在自己的iPad Pro 9.7 吋A10X 上,透過配對簡單指令,測出每個時脈周期可同時輸出「4 個整數(shù),2 個浮點,2 個記憶體載入」的可怕性能。此外,A10X 與A11 放棄第三階4MB 快取記憶體,而以大型化第二階8MB 取而代之,也暗示了蘋果極可能在快取記憶體技術(shù)有了重大的突破,可兼顧高容量與低延遲。
A11?筆者沒有iPhone 8 和iPhone X 可用,有機(jī)會再測測看。
讓我們重新畫出命案現(xiàn)場的人形粉筆圈,歸納出蘋果的產(chǎn)品設(shè)計取向:
微架構(gòu)以64 位元效能為優(yōu)先設(shè)計考量。
既然行動處理器受制于低功耗需求,難以透過提高時脈追求效能,索性以「更寬」的指令管線取勝。
同時執(zhí)行更多指令,代表要耗費更多心思去解決暫存器相依的問題。
更強(qiáng)力的非循序指令執(zhí)行引擎。
寄望指令集本身就定義更多的資料暫存器,降低「強(qiáng)碰」機(jī)率。
ARM 指令集走向64 位元帶來的重大改革
讓ARM 指令集邁向64 位元的ARMv8-A,并非只有「將整數(shù)邏輯暫存器寬度延長到64 位元」和「提供64 位元記憶體定址空間」這么簡單,拋棄昔日專注于嵌入式應(yīng)用的遺產(chǎn),更加的簡潔優(yōu)雅,更利于打造高效能微架構(gòu),引領(lǐng)ARM 榮登高效能的天堂,是這次指令集改版最神圣不可侵犯的絕對使命。
ARMv8-A 修訂項目極多,但就筆者的角度,除了取消「加速重建儲存CPU 狀態(tài)的Context Switch 相關(guān)機(jī)制」(一堆就今日觀點實在很小家子氣的技術(shù)),和簡化例外處理與執(zhí)行特權(quán)階層外,最重大的改革,只有兩項:
倍增通用暫存器(GPR)數(shù)量,這件事在當(dāng)年AMD 讓x86 邁向64 位元時也發(fā)生過,意義重大。
取消涵蓋整套指令集的「條件執(zhí)行」(Conditional Execution),這和前者互為表里,因為總算擠出了珍貴的指令編碼空間去增加暫存器數(shù)量。
其中又稱為「引述式執(zhí)行」(Predicated Execution,或Guarded Exectuion)的后者,目的在于減少程式中的分支,指令集提供簡單扼要的條件執(zhí)行指令,一次做完所有事情。
直接舉例比較快。原本一個簡單的If-Then-Else 循序條件判斷,會需要等待確認(rèn)條件結(jié)果,或著強(qiáng)行進(jìn)行分支預(yù)測,管線才會繼續(xù)動作:
if condition
then do this
else
do that
就變成這樣:
(condition) do this
(not condition) do that
有沒有感覺簡潔多了?講的玄一點,條件執(zhí)行的中心精神在于「將控制相依性轉(zhuǎn)化為資料相依性」。
然后有鑒于過去的應(yīng)用程式,在這種If-Then-Else 的條件判斷中,有60% 都是資料搬移指令,這也是為何指令集「事后」擴(kuò)充條件執(zhí)行功能,如DEC Alpha、MIPS、甚至x86,都以「條件搬移」(Conditional Move)為主。
以Alpha 為例,其指令格式統(tǒng)一為cmovxx(xx 代表條件),一個簡單的條件搬移:
beq ra, label // if (ra) = 0, branch to ‘label‘
or rb, rb, rc // else move (rb) into rc
可以透過新指令,簡化如下:
cmovne ra, rb, rc
在ARMv8 之前,整套ARM 指令集每道指令,都包含了4 位元的條件碼,必須符合「某個條件」才會執(zhí)行指令。如條件成立,執(zhí)行此指令并寫回運算結(jié)果。反之,指令執(zhí)行結(jié)果無效,或不予執(zhí)行。
回到原點,條件執(zhí)行的優(yōu)點很明顯:
加速實際條件判斷的效率,因為實際上只要比較0 與1(Bitwise)。
減少簡單條件判斷的分支,可以提升指令平行化執(zhí)行的潛力。這也是為何很多VLIW 指令集普遍支援條件執(zhí)行。甚至定義存放引述碼(Predicate)的專用暫存器,以因應(yīng)更復(fù)雜多樣的條件判斷,如攤平回圈的軟件管線(Software Pipeline)。[!--empirenews.page--]
但為何ARM 要取消看似完美的條件執(zhí)行?
占用4 位元指令編碼,實在是太浪費了,所以用「條件選擇」(Conditional Select)取而代之。
舉個范例:「CSEL W1, W2, W3, Cond」,如條件符合,W2 暫存器資料搬移到W1,如非,就W3 到W1。缺點是會稍微增加程式碼體積,但絕對劃算。
提高打造高效能非循序指令執(zhí)行引擎的復(fù)雜度,在管線前端就要「預(yù)鎖」后面所需要的相關(guān)資源,也增加后方需要「更名」的暫存器,更不利提升時脈。
A11「極可能」是純64 位元的微架構(gòu)
可確保處理器正確執(zhí)行所有軟件的指令集回溯相容性,是商業(yè)上的「資產(chǎn)」,但也是設(shè)計處理器微架構(gòu)的「包袱」。
我們有非常充分的理由相信,蘋果急著驅(qū)離「32 位元低階應(yīng)用程式」,就是為了其處理器全力針對64 位元最佳化造橋鋪路,而A11 如此驚世駭俗的效能表現(xiàn),除了它根本是純64 位元處理器,所有電晶體預(yù)算都砸在提升效能的刀口上,沒有其他合理的解釋了(新的異質(zhì)多處理器排程也有影響,但沒那么絕對)。「就算」A11 具備32 位元相容性,其性能表現(xiàn)恐怕也僅聊勝于無,不足掛齒。
無獨有偶,Qualcomm 企圖搶攻伺服器市場的Centriq 2400,也是純64 位元的設(shè)計,這就是ARM 制定64 位元指令集擴(kuò)充時,最希望看到的結(jié)果:雨后春筍般的高效能產(chǎn)品。
同場加映:Mac 改用自家芯片的可能性
關(guān)于這個「年經(jīng)」(每年發(fā)表一支新iPhone)議題,筆者不會賭上爺爺?shù)拿u(yù)做不負(fù)責(zé)任的推論,但只留下兩個留待讀者思考的問題:
蘋果能否承擔(dān)轉(zhuǎn)移的成本,尤其當(dāng)Mac 用戶已非弱勢族群的當(dāng)下。
蘋果是否仍希望「吸收」Windows PC 的使用者。
Mac 是否改用蘋果自家芯片這檔事,并不只是「效能夠好」就可以一筆輕松帶過的大哉問,請各位多多考量商業(yè)層面的因素。
蘋果同時掌握軟硬件的「不公平競爭」
最后,再重新貼出本文標(biāo)題的答案:
「藉由牢牢把持軟硬件平臺的『封閉性』先天優(yōu)勢,蘋果掌握了ARM 指令集邁向64 位元帶來的機(jī)會,打造出一系列同時間能夠有效處理更多指令的先進(jìn)微架構(gòu)?!?/strong>
這「一體成形」的絕對優(yōu)勢,在可見未來的深度學(xué)習(xí)之路上,會更加的牢不可破,這就是蘋果在iPhone 前景未明之際,就膽敢購并PA Semi 投資未來,所得到的豐碩成果,就算你不喜歡「果粉」,你也不能不佩服喬布斯的遠(yuǎn)見。
至于PA Semi 究竟干過哪些值得蘋果冒險的好事,等以后有機(jī)會,再好好談?wù)劊绻娴倪€有機(jī)會。