英特爾和AMD能否效仿蘋果M1芯片?

導讀 蘋果今年最大的亮點也許不是手機 而是一塊小小的芯片。M1發布會雖然已經過去了一陣子 但圍繞著它的討論依然不見平息。不過 對它的討論

蘋果今年最大的亮點也許不是手機 而是一塊小小的芯片。M1發布會雖然已經過去了一陣子 但圍繞著它的討論依然不見平息。不過 對它的討論很多都不在點子上 在技術方面解釋得既不夠深入也不夠易懂。在這方面 Erik Engheim在Medium上發表的這篇文章也許是最詳細最易懂的技術指南了。閱讀本文 你將了解以下幾點:1)為什么M1會這么快?2)蘋果是不是用了什么獨門絕招才做到這一點?3)英特爾AMD能不能效仿?原文標題是:Why Is Apple’s M1 Chip So Fast?篇幅關系 我們分兩部分刊出 此為第二部分。

劃重點:

CPU提高性能的兩種策略:要么跑快點 要么跑多點 但跑快點這條路已經走到盡頭

跑多點也有兩種策略:增加內核 或者亂序執行(OoO) 蘋果走的是后面這條路

AMD和Intel的亂序執行要比M1遜色

因為體系架構問題 英特爾和AMD沒機會趕上蘋果的CPU了

任何CPU想要快速運行都要面臨的根本挑戰

所以說 異構計算是部分原因 而不是唯一的原因。M1上面所謂的快速通用CPU內核Firestorm確實很快。跟過去與英特爾和AMD的內核相比較弱的ARM CPU內核相比 這是一個重大差異。

在對標中 Firestorm擊敗了大多數的英特爾內核 幾乎擊敗了最快的AMD Ryzen內核。按照傳統觀點的話 這是不可能的。

在討論是什么導致Firestorm跑得這么快之前 我們先要了解讓CPU跑得快的核心思想是什么。

原則上 你可以結合以下兩種策略來實現:

串行更快地執行更多的指令。

并行執行大量指令。

上世紀80年代的時候 做到這一點很容易。只需要增加時鐘頻率 指令就能加快完成。時鐘周期是CPU工作的最小時間單位 是計算機執行某項操作的時候。不過這想操作可以是很微小的操作。所以 一條指令可能由多個較小的任務組成 因此可能需要多個時鐘周期才能完成。

但是 現在再想提高時鐘頻率已經幾乎不可能了大家嘴里反復絮叨的“摩爾定律的終結”真的來了。

所以 現在其實就剩下并行執行盡可能多的指令這條路了。

多核還是亂序處理器?

這條路也有兩種走法。一種是增加更多的CPU內核。從軟件開發者的角度來看 這就好比增加線程。每個CPU內核就像一個硬件的線程。如果你還不知道什么是線程 可以把它看作是執行任務的過程。一個CPU有兩個內核的話 就可以同時執行兩項單獨的任務:兩個線程。這些任務可以描述為兩個獨立的程序存儲在內存當中 或者實際上也可以是同一程序執行兩次。每個線程都需要做一些記錄 比方說本線程目前在一系列程序指令當中的位置。每個線程都可以存儲臨時結果 而且應該是獨立存放的。

原則上 只有一個內核的處理器也能跑多個線程。不過 在這種情況下 它只是把一個線程暫停并保存當前進程 再切換到另一線程運行。稍后再切換回來。這種做法并不能帶來太多的性能增強 只是在線程可能經常要停下來等待用戶輸入 或者網絡連接速度慢要等數據的時候使用。這些可以稱之為為軟件線程。硬件線程意味著擁有真正的額外物理硬件 比方說額外的內核 可以加快處理速度。

問題在于 開發者得會寫代碼來利用這種優勢。其中的部分任務(比方說服務器軟件)是很容易寫的。你可以想象分別處理每一位連接用戶。這些任務互相之間獨立性太強了 以至于擁有大量內核是服務器(尤其是基于云的服務)的絕佳選擇。

這就是為什么你會看到類似Ampere之類的ARM CPU制造商會制造像Altra Max這樣的CPU的原因 這款處理器有著瘋狂的128核!這種芯片是專門為云計算準備的。你不需要瘋狂的單核性能 因為在云端 關鍵是在盡可能節能的情況下讓盡可能多的線程來處理盡可能多的并發用戶。

相比之下 蘋果則處在另一端。蘋果制造的是單用戶設備。多線程并不是優勢。他們的設備主要用來玩游戲 視頻編輯 做開發等。他們希望臺式機有漂亮的響應性好的圖形和動畫。

桌面軟件一般不會用很多的內核。比方說 8核也許能讓計算機游戲受益 但是像128核之類的東西完全就是浪費。相反 你需要更少但更強大的內核。

亂序執行的機制

有趣的來了 亂序執行。亂序執行可以并行執行更多指令但又不用做成多線程的方式。開發者不必專門寫軟件就能利用這種能力。從開發者的角度來看 似乎每個內核都跑得更快了。

要想了解其工作原理 你需要先了解一些有關內存的知識。請求訪問內存特定位置的數據是很慢的。但是 獲取1字節數據的時延跟獲取128字節的數據的時延卻沒有分別。數據要通過我們所謂的數據總線來發送。你可以把數據總線看作是內存與數據通過的CPU不同部分之間的一條通道或管道 數據就是通過這條管道來傳輸的。實際上 當然那只是一些導電的銅線。如果數據總線足夠寬的話 就可以同時存取多個字節。

所以 CPU一次會執行一大塊的指令。但是是按照次序一條接一條地執行的。現代的微處理器則會做所謂的亂序操作(OoO )。

這意味著他們能夠對指令緩沖區進行快速分析 弄清楚哪些指令依賴于哪個指令。不妨看看下面這個簡單的例子:

01: mul r1 r2 r3 // r1 ← r2 × r3

02: add r4 r1 5 // r4 ← r1 + 5

03: add r6 r2 1 // r6 ← r2 + 1

乘法往往一般都很慢。可以這么說 乘法需要多個時鐘周期來執行。第二條指令只能等 因為它的計算要取決于知道了放進r1寄存器的結果才行。

但是 第3行的第3條指令就不需要依賴于之前的指令的計算。所以 亂序處理器可以并行計算這條指令。

不過在現實當中我們談論的是數百條指令。CPU能夠找出這些指令之間的所有依賴關系。

它會通過查看每條指令的輸入來對其進行分析。指令的輸入是否取決于一或多條其他指令的輸出?所謂的輸入和輸出 是指包含有之前計算結果的寄存器。

比方說 add r4 r1、5這條指令要依賴mul r1 r2 r3所輸出的r1。我們可以把這些關系鏈接在一起 形成CPU可以處理的詳細圖譜。其中節點是指令 而邊則是連接它們的寄存器。

CPU可以對這樣的節點圖譜進行分析 然后確定可以并行執行哪些指令 以及哪些指令中繼續執行之前需要在什么地方等待多個相關計算的結果。

很多指令會早早就執行完畢 但我們沒法對結果進行官宣。我們不能保證結果;否則的話 我們會以錯誤的順序提供結果。在外界看來 它得看起來就像是按照發出的指令順序執行的。

就像堆棧一樣 CPU會從頂部彈出已完成的指令 直到找到未完成的指令。

這個解釋還不夠完善 但應該能提供一些線索了。基本上就是 你既可以實現程序員必須知道的那種并行性 也可以實現那種CPU假裝是一切都是單線程執行的樣子。不過 你知道 在幕后 它正在執行亂序的黑魔法。

正是出眾的亂序執行能力使得M1的Firestorm內核可以狠狠地踢前作的屁股 揚名立萬。實際上 它比英特爾或AMD的任何產品都要強大。可能比主流市場上的任何產品都要強大。

為什么AMD和Intel的亂序執行要比M1遜色?

在對亂序執行(OoO )的解釋當中 我跳過了一些重要的細節 這里需要談一下。否則的話 就沒法理解為什么蘋果能夠在這場游戲當中領先 為什么英特爾和AMD可能沒法趕上。

我所說的“scratchpad”實際上就是所謂的“重排序緩沖器(ROB)” 里面并不包含常規的機器代碼指令。不是那種CPU從內存獲取要執行的東西。這些是CPU指令集體系結構(ISA)里面的指令。就是那種我們稱之為x86、ARM、PowerPC等的指令。

但是 在內部 CPU會用程序員看不到的完全不同的指令集。我們稱之為微指令(micro-ops或μops )。ROB里面都是這些微指令。

對于CPU施展魔法來讓東西并行運行來說 這個地方可以做的事情要實際得多。原因是微指令的范圍很廣(包含有很多的位) 并且可以包含各種元信息。你沒法把那種信息添加到ARM或x86的指令里面 而很多的元信息只有在當前執行的上下文之中才有意義。

我們可以這么看 就把它看作是你在寫程序的時候。你有一個公共API 這個API需要保持穩定并且所有人都能用。ARM、x86、PowerPC、MIPS就是這樣的指令集。而微指令基本上是用來實現公共API的專用API。

此外 對于CPU來說 微指令往往更易用。為什么?因為每一個微指令都只完成一項簡單的有限任務。常規的ISA指令可能更復雜 導致會發生很多事情發生 最終會變成成多個微指令。

對于CISC CPU來說 往往別無選擇只能用微指令 否則大型復雜的CISC指令會導致流水線和OoO幾乎沒法實現。

RISC CPU就有得選。比方說 小一點的ARM CPU根本不用微指令。但這也意味著做不了類似OoO之類的事情。

但是這又有什么關系呢?為什么這個細節對于理解為什么蘋果能夠壓倒AMD和英特爾非常重要呢?

那是因為CPU能跑多快要取決于往ROB裝填微指令的速度以及數量。填充得越快 能選擇出可以并行執行的指令的機會就越大 而并行執行則意味著性能的提高。

機器代碼指令被所謂的指令解碼器分解成微指令。如果能夠有更多的解碼器 我們就可以并行分解更多的指令 填充ROB的速度就可以更快。

在這一點上 蘋果的M1跟其他的CPU有很大的差別。英特爾和AMD最大微處理器內核有四個解碼器 也就意味著可以并行解碼四條指令分解出微指令。

但是蘋果卻有著瘋狂的8個解碼器。不僅如此 它的ROB大概比別人大3倍。基本上相當于可容納三倍規模的指令。其他主流芯片制造商的CPU沒有一個有這么多解碼器的。

為什么英特爾和AMD沒法多加點指令解碼器?

這就是RISC復仇的機會。而M1 Firestorm內核采用的是ARM RISC架構 這一事實開始變得重要起來。

你看 對于x86來說 一條指令的長度在1到15個字節之間。而在RISC芯片上 指令的長度是固定的。這種情況下固定長度為什么很重要呢?

因為如果每一條指令的長度都一樣的話 把一連串字節分解成指令 并行輸入給8個不同的解碼器這件事就變得微不足道了。

但是 如果是x86 CPU的話 解碼器都不知道下一條指令從哪里開始。它得分析每一條指令才能知道指令的長度。

英特爾和AMD采取的是暴力破解法 也就是在每個可能的起點對指令進行解碼。這意味著會有很多猜錯的時候 要把錯誤丟棄掉。這會造成解碼器階段十分復雜 繞來繞去 以至于很難再添加更多的解碼器。但是對于蘋果來說 相比之下增加更多的解碼器根本不算事兒。

實際上 添加更多解碼器會導致很多的其他問題 以至于對AMD來說 4個解碼器基本上就是上限了。

其結果是 在相同的時鐘頻率下 M1 Firestorm內核能處理的指令數量實際上是AMD和Intel CPU的兩倍。

有人則認為 因為CISC指令可轉化為更多的微指令 所以密度更大 這樣一來 解碼一條x86指令就類似于解碼兩條ARM指令。

只是在現實世界里面 情況并非如此。高度優化的x86代碼很少會用復雜的CISC指令。才能夠某種程度來說 它已經有點RISC風格了。

但這對英特爾或AMD毫無幫助 因為就算15字節長的指令很少見 造出來的解碼器也得處理。而這會導致復雜性 從而阻礙AMD和Intel添加更多的解碼器。

可是AMD的Zen3內核還是更快啊 不是嗎?

據我所知 最新的AMD CPU內核 也就是所謂的Zen3內核在性能基準測試是要比Firestorm內核快一些。但問題是 這僅僅是因為Zen3內核的時鐘頻率為5 GHz。而Firestorm內核的時鐘頻率為3.2 GHz。雖然時鐘頻率提高了近60% 但Zen3也只是勉強比Firestorm快一點。

那蘋果為什么不相應提高時鐘頻率呢?因為更高的時鐘頻率會導致芯片發熱。但那卻是蘋果的主要賣點之一。跟英特爾和AMD的產品不同 他們的計算機幾乎不需要制冷。

從本質上講 可以說Firestorm內核確實優于Zen3內核。Zen3只能靠加大電流并變得更熱來讓自己保持領先。而蘋果只是選擇不這么做而已。

如果蘋果想要提高性能的話 他們只只需要多加些內核就可以了。這樣一來 他們既可以降低功耗 又能提供更高性能。

未來

似乎AMD和Intel在兩個方面都陷入了困境:

他們沒有一個可以輕松從事異構計算和SoC設計的商業模式。

他們傳統的x86 CISC指令集反過來又給他們造成困擾 導致難以提高OoO性能。

當然 這并不意味著游戲結束了。他們是可以提高時鐘頻率 強化散熱能力 增加更多內核 擴充CPU緩存等。但這些方面他們也都處于劣勢。英特爾的情況最糟 一方面內核似乎已經被Firestorm擊敗 而且能跟SoC解決方案集成的GPU也很弱。

引入更多內核的問題在于 對于典型的桌面工作負荷來說 內核太多會導致收益遞減。當然 大量內核非常適合服務器。

但是在這個領域 像Amazon和Ampere之類的公司正在用128核的怪獸CPU發動攻擊。這就像是東線和西線同時開戰。

不過對于AMD和Intel來說 幸運的是 蘋果并沒有直接賣自己的芯片。所以 PC用戶只能接受他們提供的任何產品。PC用戶可能會投奔曹營 但這會是一個緩慢的過程。用戶不會馬上離開自己自己投入了大量資金的平臺。

但是 那些還沒有在任何平臺上面燒太多錢的年輕專業人 他們未來可能會慢慢地轉向蘋果陣營 擴大了后者在高端市場的份額 并因此進一步擴大其在PC市場所占的利潤份額。 責任編輯:tzh

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!