蘋果今年最大的亮點(diǎn)也許不是手機(jī),而是一塊小小的芯片。M1發(fā)布會雖然已經(jīng)過去了一陣子,但圍繞著它的討論依然不見平息。不過,對它的討論很多都不在點(diǎn)子上,在技術(shù)方面解釋得既不夠深入也不夠易懂。在這方面,Erik Engheim在Medium上發(fā)表的這篇文章也許是最詳細(xì)最易懂的技術(shù)指南了。閱讀本文,你將了解以下幾點(diǎn):1)為什么M1會這么快?2)蘋果是不是用了什么獨(dú)門絕招才做到這一點(diǎn)?3)英特爾和AMD能不能效仿?原文標(biāo)題是:Why Is Apple’s M1 Chip So Fast?篇幅關(guān)系,我們分兩部分刊出,此為第二部分。
劃重點(diǎn):
CPU提高性能的兩種策略:要么跑快點(diǎn),要么跑多點(diǎn),但跑快點(diǎn)這條路已經(jīng)走到盡頭
跑多點(diǎn)也有兩種策略:增加內(nèi)核,或者亂序執(zhí)行(OoO),蘋果走的是后面這條路
AMD和Intel的亂序執(zhí)行要比M1遜色
因?yàn)轶w系架構(gòu)問題,英特爾和AMD沒機(jī)會趕上蘋果的CPU了
任何CPU想要快速運(yùn)行都要面臨的根本挑戰(zhàn)
所以說,異構(gòu)計(jì)算是部分原因,而不是唯一的原因。M1上面所謂的快速通用CPU內(nèi)核Firestorm確實(shí)很快。跟過去與英特爾和AMD的內(nèi)核相比較弱的ARM CPU內(nèi)核相比,這是一個(gè)重大差異。
在對標(biāo)中,F(xiàn)irestorm擊敗了大多數(shù)的英特爾內(nèi)核,幾乎擊敗了最快的AMD Ryzen內(nèi)核。按照傳統(tǒng)觀點(diǎn)的話,這是不可能的。
在討論是什么導(dǎo)致Firestorm跑得這么快之前,我們先要了解讓CPU跑得快的核心思想是什么。
原則上,你可以結(jié)合以下兩種策略來實(shí)現(xiàn):
串行更快地執(zhí)行更多的指令。
并行執(zhí)行大量指令。
上世紀(jì)80年代的時(shí)候,做到這一點(diǎn)很容易。只需要增加時(shí)鐘頻率,指令就能加快完成。時(shí)鐘周期是CPU工作的最小時(shí)間單位,是計(jì)算機(jī)執(zhí)行某項(xiàng)操作的時(shí)候。不過這想操作可以是很微小的操作。所以,一條指令可能由多個(gè)較小的任務(wù)組成,因此可能需要多個(gè)時(shí)鐘周期才能完成。
但是,現(xiàn)在再想提高時(shí)鐘頻率已經(jīng)幾乎不可能了大家嘴里反復(fù)絮叨的“摩爾定律的終結(jié)”真的來了。
所以,現(xiàn)在其實(shí)就剩下并行執(zhí)行盡可能多的指令這條路了。
多核還是亂序處理器?
這條路也有兩種走法。一種是增加更多的CPU內(nèi)核。從軟件開發(fā)者的角度來看,這就好比增加線程。每個(gè)CPU內(nèi)核就像一個(gè)硬件的線程。如果你還不知道什么是線程,可以把它看作是執(zhí)行任務(wù)的過程。一個(gè)CPU有兩個(gè)內(nèi)核的話,就可以同時(shí)執(zhí)行兩項(xiàng)單獨(dú)的任務(wù):兩個(gè)線程。這些任務(wù)可以描述為兩個(gè)獨(dú)立的程序存儲在內(nèi)存當(dāng)中,或者實(shí)際上也可以是同一程序執(zhí)行兩次。每個(gè)線程都需要做一些記錄,比方說本線程目前在一系列程序指令當(dāng)中的位置。每個(gè)線程都可以存儲臨時(shí)結(jié)果,而且應(yīng)該是獨(dú)立存放的。
原則上,只有一個(gè)內(nèi)核的處理器也能跑多個(gè)線程。不過,在這種情況下,它只是把一個(gè)線程暫停并保存當(dāng)前進(jìn)程,再切換到另一線程運(yùn)行。稍后再切換回來。這種做法并不能帶來太多的性能增強(qiáng),只是在線程可能經(jīng)常要停下來等待用戶輸入,或者網(wǎng)絡(luò)連接速度慢要等數(shù)據(jù)的時(shí)候使用。這些可以稱之為為軟件線程。硬件線程意味著擁有真正的額外物理硬件,比方說額外的內(nèi)核,可以加快處理速度。
問題在于,開發(fā)者得會寫代碼來利用這種優(yōu)勢。其中的部分任務(wù)(比方說服務(wù)器軟件)是很容易寫的。你可以想象分別處理每一位連接用戶。這些任務(wù)互相之間獨(dú)立性太強(qiáng)了,以至于擁有大量內(nèi)核是服務(wù)器(尤其是基于云的服務(wù))的絕佳選擇。
這就是為什么你會看到類似Ampere之類的ARM CPU制造商會制造像Altra Max這樣的CPU的原因,這款處理器有著瘋狂的128核!這種芯片是專門為云計(jì)算準(zhǔn)備的。你不需要瘋狂的單核性能,因?yàn)樵谠贫耍P(guān)鍵是在盡可能節(jié)能的情況下讓盡可能多的線程來處理盡可能多的并發(fā)用戶。
相比之下,蘋果則處在另一端。蘋果制造的是單用戶設(shè)備。多線程并不是優(yōu)勢。他們的設(shè)備主要用來玩游戲,視頻編輯,做開發(fā)等。他們希望臺式機(jī)有漂亮的響應(yīng)性好的圖形和動畫。
桌面軟件一般不會用很多的內(nèi)核。比方說,8核也許能讓計(jì)算機(jī)游戲受益,但是像128核之類的東西完全就是浪費(fèi)。相反,你需要更少但更強(qiáng)大的內(nèi)核。
亂序執(zhí)行的機(jī)制
有趣的來了,亂序執(zhí)行。亂序執(zhí)行可以并行執(zhí)行更多指令但又不用做成多線程的方式。開發(fā)者不必專門寫軟件就能利用這種能力。從開發(fā)者的角度來看,似乎每個(gè)內(nèi)核都跑得更快了。
要想了解其工作原理,你需要先了解一些有關(guān)內(nèi)存的知識。請求訪問內(nèi)存特定位置的數(shù)據(jù)是很慢的。但是,獲取1字節(jié)數(shù)據(jù)的時(shí)延跟獲取128字節(jié)的數(shù)據(jù)的時(shí)延卻沒有分別。數(shù)據(jù)要通過我們所謂的數(shù)據(jù)總線來發(fā)送。你可以把數(shù)據(jù)總線看作是內(nèi)存與數(shù)據(jù)通過的CPU不同部分之間的一條通道或管道,數(shù)據(jù)就是通過這條管道來傳輸?shù)摹?shí)際上,當(dāng)然那只是一些導(dǎo)電的銅線。如果數(shù)據(jù)總線足夠?qū)挼脑挘涂梢酝瑫r(shí)存取多個(gè)字節(jié)。
所以,CPU一次會執(zhí)行一大塊的指令。但是是按照次序一條接一條地執(zhí)行的。現(xiàn)代的微處理器則會做所謂的亂序操作(OoO )。
這意味著他們能夠?qū)χ噶罹彌_區(qū)進(jìn)行快速分析,弄清楚哪些指令依賴于哪個(gè)指令。不妨看看下面這個(gè)簡單的例子:
01: mul r1, r2, r3 // r1 ← r2 × r3
02: add r4, r1, 5 // r4 ← r1 + 5
03: add r6, r2, 1 // r6 ← r2 + 1
乘法往往一般都很慢。可以這么說,乘法需要多個(gè)時(shí)鐘周期來執(zhí)行。第二條指令只能等,因?yàn)樗挠?jì)算要取決于知道了放進(jìn)r1寄存器的結(jié)果才行。
但是,第3行的第3條指令就不需要依賴于之前的指令的計(jì)算。所以,亂序處理器可以并行計(jì)算這條指令。
不過在現(xiàn)實(shí)當(dāng)中我們談?wù)摰氖菙?shù)百條指令。CPU能夠找出這些指令之間的所有依賴關(guān)系。
它會通過查看每條指令的輸入來對其進(jìn)行分析。指令的輸入是否取決于一或多條其他指令的輸出?所謂的輸入和輸出,是指包含有之前計(jì)算結(jié)果的寄存器。
比方說,add r4,r1、5這條指令要依賴mul r1,r2,r3所輸出的r1。我們可以把這些關(guān)系鏈接在一起,形成CPU可以處理的詳細(xì)圖譜。其中節(jié)點(diǎn)是指令,而邊則是連接它們的寄存器。
CPU可以對這樣的節(jié)點(diǎn)圖譜進(jìn)行分析,然后確定可以并行執(zhí)行哪些指令,以及哪些指令中繼續(xù)執(zhí)行之前需要在什么地方等待多個(gè)相關(guān)計(jì)算的結(jié)果。
很多指令會早早就執(zhí)行完畢,但我們沒法對結(jié)果進(jìn)行官宣。我們不能保證結(jié)果;否則的話,我們會以錯誤的順序提供結(jié)果。在外界看來,它得看起來就像是按照發(fā)出的指令順序執(zhí)行的。
就像堆棧一樣,CPU會從頂部彈出已完成的指令,直到找到未完成的指令。
這個(gè)解釋還不夠完善,但應(yīng)該能提供一些線索了。基本上就是,你既可以實(shí)現(xiàn)程序員必須知道的那種并行性,也可以實(shí)現(xiàn)那種CPU假裝是一切都是單線程執(zhí)行的樣子。不過,你知道,在幕后,它正在執(zhí)行亂序的黑魔法。
正是出眾的亂序執(zhí)行能力使得M1的Firestorm內(nèi)核可以狠狠地踢前作的屁股,揚(yáng)名立萬。實(shí)際上,它比英特爾或AMD的任何產(chǎn)品都要強(qiáng)大。可能比主流市場上的任何產(chǎn)品都要強(qiáng)大。
為什么AMD和Intel的亂序執(zhí)行要比M1遜色?
在對亂序執(zhí)行(OoO )的解釋當(dāng)中,我跳過了一些重要的細(xì)節(jié),這里需要談一下。否則的話,就沒法理解為什么蘋果能夠在這場游戲當(dāng)中領(lǐng)先,為什么英特爾和AMD可能沒法趕上。
我所說的“scratchpad”實(shí)際上就是所謂的“重排序緩沖器(ROB)”,里面并不包含常規(guī)的機(jī)器代碼指令。不是那種CPU從內(nèi)存獲取要執(zhí)行的東西。這些是CPU指令集體系結(jié)構(gòu)(ISA)里面的指令。就是那種我們稱之為x86、ARM、PowerPC等的指令。
但是,在內(nèi)部,CPU會用程序員看不到的完全不同的指令集。我們稱之為微指令(micro-ops或μops )。ROB里面都是這些微指令。
對于CPU施展魔法來讓東西并行運(yùn)行來說,這個(gè)地方可以做的事情要實(shí)際得多。原因是微指令的范圍很廣(包含有很多的位),并且可以包含各種元信息。你沒法把那種信息添加到ARM或x86的指令里面,而很多的元信息只有在當(dāng)前執(zhí)行的上下文之中才有意義。
我們可以這么看,就把它看作是你在寫程序的時(shí)候。你有一個(gè)公共API,這個(gè)API需要保持穩(wěn)定并且所有人都能用。ARM、x86、PowerPC、MIPS就是這樣的指令集。而微指令基本上是用來實(shí)現(xiàn)公共API的專用API。
此外,對于CPU來說,微指令往往更易用。為什么?因?yàn)槊恳粋€(gè)微指令都只完成一項(xiàng)簡單的有限任務(wù)。常規(guī)的ISA指令可能更復(fù)雜,導(dǎo)致會發(fā)生很多事情發(fā)生,最終會變成成多個(gè)微指令。
對于CISC CPU來說,往往別無選擇只能用微指令,否則大型復(fù)雜的CISC指令會導(dǎo)致流水線和OoO幾乎沒法實(shí)現(xiàn)。
但RISC CPU就有得選。比方說,小一點(diǎn)的ARM CPU根本不用微指令。但這也意味著做不了類似OoO之類的事情。
但是這又有什么關(guān)系呢?為什么這個(gè)細(xì)節(jié)對于理解為什么蘋果能夠壓倒AMD和英特爾非常重要呢?
那是因?yàn)镃PU能跑多快要取決于往ROB裝填微指令的速度以及數(shù)量。填充得越快,能選擇出可以并行執(zhí)行的指令的機(jī)會就越大,而并行執(zhí)行則意味著性能的提高。
機(jī)器代碼指令被所謂的指令解碼器分解成微指令。如果能夠有更多的解碼器,我們就可以并行分解更多的指令,填充ROB的速度就可以更快。
在這一點(diǎn)上,蘋果的M1跟其他的CPU有很大的差別。英特爾和AMD最大微處理器內(nèi)核有四個(gè)解碼器,也就意味著可以并行解碼四條指令分解出微指令。
但是蘋果卻有著瘋狂的8個(gè)解碼器。不僅如此,它的ROB大概比別人大3倍。基本上相當(dāng)于可容納三倍規(guī)模的指令。其他主流芯片制造商的CPU沒有一個(gè)有這么多解碼器的。
為什么英特爾和AMD沒法多加點(diǎn)指令解碼器?
這就是RISC復(fù)仇的機(jī)會。而M1 Firestorm內(nèi)核采用的是ARM RISC架構(gòu),這一事實(shí)開始變得重要起來。
你看,對于x86來說,一條指令的長度在1到15個(gè)字節(jié)之間。而在RISC芯片上,指令的長度是固定的。這種情況下固定長度為什么很重要呢?
因?yàn)槿绻恳粭l指令的長度都一樣的話,把一連串字節(jié)分解成指令,并行輸入給8個(gè)不同的解碼器這件事就變得微不足道了。
但是,如果是x86 CPU的話,解碼器都不知道下一條指令從哪里開始。它得分析每一條指令才能知道指令的長度。
英特爾和AMD采取的是暴力破解法,也就是在每個(gè)可能的起點(diǎn)對指令進(jìn)行解碼。這意味著會有很多猜錯的時(shí)候,要把錯誤丟棄掉。這會造成解碼器階段十分復(fù)雜,繞來繞去,以至于很難再添加更多的解碼器。但是對于蘋果來說,相比之下增加更多的解碼器根本不算事兒。
實(shí)際上,添加更多解碼器會導(dǎo)致很多的其他問題,以至于對AMD來說,4個(gè)解碼器基本上就是上限了。
其結(jié)果是,在相同的時(shí)鐘頻率下,M1 Firestorm內(nèi)核能處理的指令數(shù)量實(shí)際上是AMD和Intel CPU的兩倍。
有人則認(rèn)為,因?yàn)镃ISC指令可轉(zhuǎn)化為更多的微指令,所以密度更大,這樣一來,解碼一條x86指令就類似于解碼兩條ARM指令。
只是在現(xiàn)實(shí)世界里面,情況并非如此。高度優(yōu)化的x86代碼很少會用復(fù)雜的CISC指令。才能夠某種程度來說,它已經(jīng)有點(diǎn)RISC風(fēng)格了。
但這對英特爾或AMD毫無幫助,因?yàn)榫退?5字節(jié)長的指令很少見,造出來的解碼器也得處理。而這會導(dǎo)致復(fù)雜性,從而阻礙AMD和Intel添加更多的解碼器。
可是AMD的Zen3內(nèi)核還是更快啊,不是嗎?
據(jù)我所知,最新的AMD CPU內(nèi)核,也就是所謂的Zen3內(nèi)核在性能基準(zhǔn)測試是要比Firestorm內(nèi)核快一些。但問題是,這僅僅是因?yàn)閆en3內(nèi)核的時(shí)鐘頻率為5 GHz。而Firestorm內(nèi)核的時(shí)鐘頻率為3.2 GHz。雖然時(shí)鐘頻率提高了近60%,但Zen3也只是勉強(qiáng)比Firestorm快一點(diǎn)。
那蘋果為什么不相應(yīng)提高時(shí)鐘頻率呢?因?yàn)楦叩臅r(shí)鐘頻率會導(dǎo)致芯片發(fā)熱。但那卻是蘋果的主要賣點(diǎn)之一。跟英特爾和AMD的產(chǎn)品不同,他們的計(jì)算機(jī)幾乎不需要制冷。
從本質(zhì)上講,可以說Firestorm內(nèi)核確實(shí)優(yōu)于Zen3內(nèi)核。Zen3只能靠加大電流并變得更熱來讓自己保持領(lǐng)先。而蘋果只是選擇不這么做而已。
如果蘋果想要提高性能的話,他們只只需要多加些內(nèi)核就可以了。這樣一來,他們既可以降低功耗,又能提供更高性能。
未來
似乎AMD和Intel在兩個(gè)方面都陷入了困境:
他們沒有一個(gè)可以輕松從事異構(gòu)計(jì)算和SoC設(shè)計(jì)的商業(yè)模式。
他們傳統(tǒng)的x86 CISC指令集反過來又給他們造成困擾,導(dǎo)致難以提高OoO性能。
當(dāng)然,這并不意味著游戲結(jié)束了。他們是可以提高時(shí)鐘頻率,強(qiáng)化散熱能力,增加更多內(nèi)核,擴(kuò)充CPU緩存等。但這些方面他們也都處于劣勢。英特爾的情況最糟,一方面內(nèi)核似乎已經(jīng)被Firestorm擊敗,而且能跟SoC解決方案集成的GPU也很弱。
引入更多內(nèi)核的問題在于,對于典型的桌面工作負(fù)荷來說,內(nèi)核太多會導(dǎo)致收益遞減。當(dāng)然,大量內(nèi)核非常適合服務(wù)器。
但是在這個(gè)領(lǐng)域,像Amazon和Ampere之類的公司正在用128核的怪獸CPU發(fā)動攻擊。這就像是東線和西線同時(shí)開戰(zhàn)。
不過對于AMD和Intel來說,幸運(yùn)的是,蘋果并沒有直接賣自己的芯片。所以,PC用戶只能接受他們提供的任何產(chǎn)品。PC用戶可能會投奔曹營,但這會是一個(gè)緩慢的過程。用戶不會馬上離開自己自己投入了大量資金的平臺。
但是,那些還沒有在任何平臺上面燒太多錢的年輕專業(yè)人,他們未來可能會慢慢地轉(zhuǎn)向蘋果陣營,擴(kuò)大了后者在高端市場的份額,并因此進(jìn)一步擴(kuò)大其在PC市場所占的利潤份額。
責(zé)任編輯:tzh
-
芯片
+關(guān)注
關(guān)注
459文章
52291瀏覽量
437615 -
手機(jī)
+關(guān)注
關(guān)注
35文章
6933瀏覽量
159283 -
蘋果
+關(guān)注
關(guān)注
61文章
24540瀏覽量
203317
發(fā)布評論請先 登錄
世紀(jì)大并購!傳高通有意整體收購英特爾,英特爾最新回應(yīng)

英特爾推出全新英特爾銳炫B系列顯卡

英特爾獲78.6億美元美國芯片補(bǔ)貼
英特爾12月或發(fā)布Battlemage GPU芯片
AMD第三季度CPU出貨量激增,挑戰(zhàn)英特爾市場地位
AMD數(shù)據(jù)中心業(yè)務(wù)首超英特爾,Nvidia異軍突起
英特爾與AMD的CPU之爭:單核性能與制造工藝的較量
美國政府?dāng)M增援英特爾
英特爾考慮出售Altera股權(quán)
英特爾研發(fā)投入超英偉達(dá)與AMD總和
英特爾和AMD組建x86生態(tài)系統(tǒng)咨詢小組
英特爾將攜手AMD共同捍衛(wèi)x86生態(tài)
英特爾股票分析:英特爾的困境能否結(jié)束?

評論