在現實世界一次又一次的測試中,M1 Macs 不僅超越了頂配的英特爾 Mac,而且還徹底擊垮了這些電腦。很多人都覺得不可思議,他們開始探究這到底是怎么回事?
從技術的角度來看,為什么 M1 芯片會如此之快?
蘋果是否采用了一些非同尋常的技術?
對于英特爾和 AMD 等競爭對手來說,采用相同的技術是否也很容易?
當然,你可以在網上搜索這些問題的答案,但如果你想深入了解蘋果所做出的努力,那么可能很快就會被高度專業的技術術語淹沒。例如 M1 使用了非常寬的指令解碼器、巨大的重排序緩沖區(ROB)等等。除非你非常了解 CPU 硬件,否則大多數文章對你來說都是天書。
為了方便理解,下面我來簡要介紹一下有關 M1 芯片的基礎知識。
什么是微處理器(CPU)?
通常,我們談論的英特爾與 AMD 芯片指的都是中央處理器(CPU),或稱微處理器。這些芯片從內存獲取指令,然后按照順序執行每條指令。
圖:一個非常基本的 RISC CPU(不是 M1)
指令從存儲器(memory)沿藍色箭頭移動到指令寄存器(register),然后由解碼器(decoder)解析指令,并通過紅色控制線啟動CPU的不同部分,最后由運算器(ALU)將寄存器中的數字相加或相減。
最基本的CPU包含一系列寄存器(register)和若干運算器(ALU),其中寄存器是命名的存儲單元,而運算器則是計算單元。ALU 可以執行加法、減法以及其他基本數學運算之類的操作。但是,ALU 只連接到 CPU 寄存器。如果要想執行兩個數字相加的運算,則必須從內存中獲取這兩個數字并放入 CPU 的兩個寄存器中。
以下是 M1 上的 RISC CPU 執行的一些常見的指令示例:
上述 r1 和 r2 就是我們所說的寄存器。現代 RISC CPU 無法針對位于寄存器之外的數字進行這樣的操作。例如,它不能將內存中兩個不同位置的數字相加。相反,它必須將這兩個數字放入單獨的寄存器中。這就是上述示例中的前兩條指令。我們從內存地址 150 中提取數字,并將其放入 CPU 的寄存器 r1 中。接下來,我們將地址 200 中的數字放入寄存器 r2 中。只有這樣,兩個數字才能通過指令 add r1,r2 相加。
擁有兩個寄存器、累加器和輸入寄存器。現代 CPU 通常擁有十幾個寄存器,而且是電子的。
寄存器的概念很早以前就有了。例如,在上圖的舊式機械計算器中,寄存器是保存兩個加數的地方。寄存器就是存放數字的地方。
M1 不是 CPU!
了解 M1 的時候,需要注意一點:
M1 不是 CPU,它是一個集成了多個芯片的整體系統。而 CPU 只是其中一個芯片。
簡單來說,M1 就是將一臺完整的計算機集成到了一個芯片上。M1 包含 CPU、圖形處理單元(GPU)、內存、輸入和輸出控制器以及構成一臺整體計算機的許多其他組件。這就是我們所說的單片系統(System on a Chip,即SoC)。
如今,購買英特爾或 AMD 的芯片時,實際上你得到的是一個封裝了多個微處理器的芯片。過去,計算機的諸多芯片會分散加載到主板上。
內存、CPU、顯卡、IO 控制器、網卡以及許多其他組件都連接到了主板上,可以相互通信。
然而,由于如今我們能夠在一塊硅片上放置非常多的晶體管,因此英特爾和AMD等公司紛紛開始將多個微處理器集成到一個芯片上。我們稱這些芯片為CPU核心。一個核心基本上就是一個完全獨立的芯片,可以從內存中讀取指令并執行計算。
圖:擁有多個CPU核心的微芯片
長期以來,要想提高性能,只需添加更多通用 CPU 核心即可。然而,如今情況發生了變化,CPU 市場的一位商家開始偏離這種趨勢。
蘋果的異構計算策略并沒有那么神秘
蘋果并沒有選擇增加通用 CPU 核心,他們采取了另一種策略:添加越來越多專用芯片來完成一些專門的任務。這樣做的好處是,與通用 CPU 核心相比,專用芯片能夠更快地完成任務,而且耗電量更少。
這不是一個全新的做法。多年來,英偉達和 AMD 的顯卡中都搭載了圖形處理單元(GPU)等專用芯片,這些芯片執行與圖形相關的操作要比通用 CPU 快許多。
蘋果所做的只是更大膽地朝這個方向轉變。M1 不僅具有通用核心和存儲器,而且還包含各種專用芯片:
中央處理單元(CPU):單片系統的大腦。負責運行操作系統和應用程序的大多數代碼。
圖形處理單元(GPU):處理與圖形相關的任務。例如顯示應用程序的用戶界面,以及 2D/3D 游戲等。
圖像處理單元(ISP):可用于加速圖像處理應用程序的常見任務。
數字信號處理器(DSP):能夠比 CPU 更好地處理需要大量數學運算的任務。包括解壓縮音樂文件等。
神經處理單元(NPU):用于高端智能手機,可加速機器學習(AI)任務。包括語音識別和相機處理。
安全領域:加密、身份認證以及安全性。
統一內存:允許 CPU、GPU 和其他核心快速交換信息。
這就是為什么許多人在使用 M1 Mac 進行圖像和視頻編輯時,都能看到速度提升的部分原因。他們執行的許多任務可以直接在專用硬件上運行。因此,價格低廉的 M1 Mac Mini 輕而易舉就能夠編碼大型視頻文件,而昂貴的 iMac 即便所有風扇都全力運轉也趕不上。
在藍色區域內,你可以看到多個 CPU 核心可以同時訪問內存,而在綠色框內,大量 GPU 核心在訪問內存。
你可能不太理解統一內存。共享內存與統一內存有何不同?過去,人們不是不贊成視頻內存與主內存共享嗎?因為這會導致性能降低。的確,共享內存確實不好。原因是 CPU 和 GPU 必須輪流訪問內存。共享意味著二者要爭用數據總線。簡單來說,GPU 和 CPU 必須輪流使用狹窄的管道來存儲或提取數據。
但統一內存的情況不一樣。在統一內存中,GPU 核心和 CPU 核心可以同時訪問內存。因此,共享內存沒有額外開銷。另外,CPU 和 GPU 可以互相通知數據在內存中的位置。以前,CPU 必須將數據從主內存區域復制到 GPU 使用的區域。但在統一內存中,CPU 會告知 GPU:“我從內存地址 2430 開始放置了30MB 的多邊形數據。”而 GPU 無需復制就可以使用這段內存。
這意味著,由于 M1 上各種特殊的處理器都可以使用相同的內存池,并快速交換信息,因此可以大幅提升性能。
在統一內存出現之前,Mac 使用 GPU 的方式。你甚至可以選用計算機外部安裝的顯卡(通過 Thunderbolt 3 線安裝)。有人猜測未來這種情況仍有可能出現。
為什么英特爾和 AMD 不使用相同的戰略?
既然蘋果的做法如此聰明,為何大家不照搬呢?從某種程度上來說,有些人確實在照抄蘋果。有些 ARM 芯片制造商在專用硬件上的投資越來越多。
AMD還嘗試在某些芯片上安裝功能更強大的GPU,并逐步采用加速處理單元(APU),向著單片系統邁進,這些處理器的CPU核心和GPU核心基本上都位于同一個芯片之上。
AMD Ryzen 加速處理單元(APU)在一塊芯片上集成了 CPU 和 GPU(Radeon Vega)。但是不包含其他協同處理器、IO 控制器或統一內存。
然而,還有一些重要的原因致使他們無法完全貫徹蘋果的做法。單片系統本質上是在一塊芯片上構建整個計算機。因此,這種做法更適合于真正的計算機制造商,比如惠普和戴爾等。我用汽車來做一個簡單的類比:如果你的業務模型是制造和銷售汽車發動機,那么對你來說,制造和銷售整車將是一次不尋常的飛躍。
相比之下,這對于 ARM 來說并不是大問題。戴爾或惠普等計算機制造商只需要購買 ARM 和其他廠商芯片的授權,就可以利用各種專用硬件制作自己的單片系統。接下來,他們將完成的設計移交給 GlobalFoundries 或臺積電等半導體代工廠,這些工廠如今就在為 AMD 和蘋果生產芯片。
在英特爾和 AMD 的商業模式下,我們遇到了一個很大的問題。他們的商業模式的基礎是銷售通用 CPU,人們只需將其插入大型 PC 主板即可。因此,計算機制造商只需從其他供應商那里購買主板、內存、CPU 和顯卡,并將這些芯片集成到一個解決方案中。
但是,如今的發展趨勢正在迅速遠離這種模式。在新的單片系統世界中,你無需組裝來自不同供應商的物理組件。相反,你需要組裝不同供應商的知識產權。首先,你需要從各個供應商那里購買顯卡、CPU、調制解調器、IO 控制器和其他產品的設計,并將其用于內部的單片系統設計。然后,再通過某家代工廠來生產。
那么,問題來了:因為英特爾、AMD 或英偉達都不會向戴爾或惠普發放知識產權許可,不會給他們機會制造自己的單片系統。
當然,英特爾和 AMD 可能也會銷售完整的單片系統。但是其中包含什么呢?每個 PC 制造商對單片系統所包含的內容可能都有各自的看法。英特爾、AMD、微軟和 PC 制造商之間可能會出現沖突,因為這些芯片需要軟件支持。
對于蘋果來說,這并不是什么難事,因為他們控制著所有環節。例如,他們為開發人員提供了 Core ML 庫,方便他們編寫機器學習代碼。至于 Core ML 是在蘋果的 CPU 上運行還是在 Neural Engine 上運行,并不是開發人員所關心的實現細節。
加快 CPU 運行的根本難題
因此,異構計算是 M1 芯片實現高性能的部分原因,但不是唯一的原因。M1 芯片上的通用 CPU 核心 Firestorm 確實非常快。這是 Firestorm 與過去的ARM CPU 的一個重大差異,過去的 ARM CPU 核心與 AMD 和英特爾的核心相比非常弱。
然而,Firestorm 擊敗了大多數英特爾核心,而且幾乎戰勝了最快的 AMD Ryzen 核心。按照傳統經驗來看,這種情況并不會發生。
在討論 Firestorm 運行速度如此之快的原因之前,我們先來了解一下哪些核心理念可以真正加快 CPU 的速度。
原則上,你可以結合以下兩種策略來加快 CPU 的速度:
快速執行更多指令。
并行執行大量指令。
在上個世紀 80 年代,快速執行更多指令很容易。只要增加時鐘頻率,指令就會加速完成。一個時鐘周期是計算機執行某項操作的時間。但是一個時鐘周期可能不夠用,因此,有時一條指令可能需要多個時鐘周期才能完成,因為它由幾個較小的任務組成。
但是,如今我們幾乎不可能再提高時鐘頻率了。經過人們十多年堅持不懈的努力,如今摩爾定律已經失效了。
因此,我們所能做的只能是并行執行盡可能多的指令。
多核與亂序處理器
并行執行大量指令的方法有兩種。一種是添加更多 CPU 核心。從軟件開發人員的角度來看,這就如同添加線程。每個 CPU 核心就是一個硬件線程。如果你不知道線程是什么,則可以將其視為執行任務的進程。一個擁有兩個核心的 CPU可以同時執行兩個單獨的任務,即兩個線程。而任務可以理解為存儲在內存中的兩個單獨的程序,或者是同一個程序執行兩次。每個線程都需要一些記錄,例如該線程在程序指令序列中的當前位置。每個線程可以存儲臨時的結果,而且應該分開保存。
原則上來說,處理器即便只擁有一個核心也可以運行多個線程。在這種情況下,處理器需要暫停一個線程,將當前進程保存下來,然后再切換到另一個線程。稍后再切換回去。這種做法無法帶來太多性能上的提升,而且只能在某個線程需要頻繁停下來等待用戶輸入,或網絡連接速度太慢的情況才能使用。以上這些可以稱為軟件線程。硬件線程則意味著需要使用額外的物理硬件(例如額外的核心)來加快處理速度。
然而,問題在于,開發人員需要編寫代碼才能利用這一點。有一些任務(例如服務器軟件)很容易做到這一點。例如單獨處理每個用戶,這些任務之間彼此獨立,因此擁有大量核心是服務器(尤其是基于云的服務)的絕佳選擇。
這就是為什么 Ampere 等 ARM CPU 制造商生產出的 Altra Max 等 CPU 擁有 128 個核心的原因。該芯片是專門為云計算而設計的。單個核心不需要擁有瘋狂的性能,因為在云中利用好每一瓦特的功耗,處理盡可能多的并發用戶才是重中之重。
相比之下,蘋果的情況則完全不同。蘋果的產品都是單用戶的設備。大量線程并不是他們的優勢。他們的設備可用于玩游戲、編輯視頻、開發等。他們希望臺式機擁有精美的、響應速度超快的圖像和動畫。
桌面軟件通常不會利用很多核心。例如 8 個核心對電腦游戲來說就足夠了,128 個核心完全是浪費。相反,這些軟件需要少量更強大的核心。
接下來我們要講的內容很有意思。亂序執行是一種能夠并行執行更多指令、但不需要多線程的方式。開發人員無需專門編寫軟件即可享受亂序執行的優勢。從開發人員的角度來看,似乎每個核心的運行速度都加快了。
為了理解其中的工作原理,我們先來了解一些內存方面的知識。請求位于某個特定內存位置中的數據會很慢。但是,獲取 1 個字節的延遲與獲取 128 個字節的延遲并沒有區別。數據是通過數據總線發送的。你可以將數據總線視為連接內存與 CPU 各個部分的一條通道或管道,數據正是通過這條管道傳輸的。實際上,數據總線就是一些可以導電的銅線。如果數據總線足夠寬,則可以同時獲取多個字節。
因此,CPU 一次可以獲取整塊指令,但是這些指令必須逐條執行。現代微處理器采用了亂序執行。
這意味著,這些處理器能夠快速分析指令緩沖區,并檢查哪些指令之間有相互依賴關系。我們舉一個簡單的例子:
乘法是相對較慢的操作,假設它需要多個時鐘周期才能執行完成。這時,第二條指令就需要等待,因為它需要知道放入 r1 寄存器的結果。
然而,第三條指令(03 行)并不依賴于前面的計算結果。因此,亂序處理器可以開始并行計算這條指令。
但實際情況是,處理器每時每刻都需要處理成百上千的指令,而 CPU 能夠找出這些指令之間的所有依賴關系。
它會分析指令,檢查每條指令的輸入,看一看這些輸入是否依賴于其他一個或多個指令的輸出。這里的輸入和輸出指的是包含先前計算結果的寄存器。
例如,指令 add r4, r1, 5 的輸入 r1 依賴于前一個指令 mul r1, r2, r3 的結果。這些依賴關系鏈接在一起就可以形成關系圖,而CPU可以使用這個圖進行處理。圖中的節點就是指令,而邊就是連接這些指令的寄存器。
CPU 可以分析這樣的節點圖,并確定它可以并行執行哪些指令,以及在執行哪個指令之前需要等待多個相關的計算結果。
盡管許多指令都可以提前完成,但我們不能將它們作為最終的結果。我們不能提交這些指令的執行結果,因為它們的執行順序不正確。而在用戶看來,這些指令都是按照發行的順序執行的。
就像棧一樣,CPU 將從頂部彈出完成的指令,直到遇到一條未完成的指令。
雖然上述說明不夠充分,但希望能讓你有大致的了解。基本上,你可以選擇讓程序員實現并行,或者讓 CPU 假裝一切都是單線程執行,但幕后采用亂序執行。
M1 芯片上的 Firestorm 核心正是借助了出色的亂序執行功能才變得如此強大。事實上,它比英特爾或 AMD 的任何產品都要強大,甚至可能超過了主流市場上的任何其他產品。
為什么 AMD 和英特爾的亂序執行不如 M1?
前面在解釋亂序執行的時候,我略過了一些重要的細節,這里需要再說明一下,否則就很難理解為什么蘋果能領先,而且英特爾和 AMD 很難超越。
前面說的“棧”的真正名稱叫做“重排序緩沖”(Re-Order Buffer,ROB),它并不包括普通的機器代碼指令。其中的內容并不是 CPU 從內存中獲取并執行的指令,后者屬于 CPU 指令架構(ISA),是那些我們稱為 x86、ARM、PowerPC 等的指令。
但是在內部,CPU 執行的是一系列完全不同的指令集,這些指令對于程序員是不可見的。我們稱之為微指令(簡稱 μops)。ROB 中包含的都是微指令。
由于 CPU 盡一切努力并行執行指令,所以 ROB 的這種做法更實際一些。原因是,微指令非常寬(包含更多比特),可能包含各種元信息。而 ARM 或 x86指令集中無法添加這么多信息,因為:
這樣做會導致程序的可執行文件體積膨脹;
會暴露 CPU 的內部工作原理,是否有亂序執行單元,是否有寄存器重命名等各種細節
許多元信息僅在當前執行上下文中有意義。
你可以將這個過程理解成寫程序。你有一個公開的 API,需要保持穩定,供所有人使用。這就是 ARM、x86、PowerPC、MIPS等指令集。而微指令是那些用來實現公開 API 的私有 API。
而且,微指令通常更容易被 CPU 處理。為什么?因為每條指令只做一件非常容易的任務。正常的 ISA 指令可以非常復雜,可能會引發一系列操作,因此需要翻譯成多條微指令。
CISCCPU 通常別無選擇,只能使用微指令,否則復雜的 CISC 指令會讓流水線和亂序執行幾乎無法實現。
而 RISC CPU 還有別的選擇。例如,小型的 ARM CPU 完全不使用微指令。但這也意味著它們沒辦法實現亂序執行之類的操作。
但你可能會問,你說這些有什么關系嗎?為什么需要知道這些細節,才能理解為何蘋果超越了 AMD 和英特爾呢?
這是因為,芯片的運行速度取決于填充 ROB 的速度以及使用的微指令數量。填充得越快、越多,并行獲取指令的可能性就越大,因此能夠提高性能。
機器指令由指令解碼器拆分成微指令。如果有多個解碼器,就能并行地拆分更多指令,從而更快地填充 ROB。
這里就是蘋果和其他廠商出現重大差別的地方。最次的英特爾和和 AMD 的微處理器核心只有四個解碼器,意味著它們可以同時解碼四條指令。
但蘋果有 8 個解碼器。不僅如此,蘋果的 ROB 是英特爾和 AMD 的三倍大小,可以容納三倍的指令。沒有任何主流芯片制造商的 CPU 中有這么多解碼器。
為什么英特爾和 AMD 不能添加更多的指令解碼器?
下面,我們來看一看 RISC 的優勢,以及 M1 Firestorm 核心采用的 ARM RISC 架構有哪些出色表現。
你知道,在 x86 中,指令長度約為 1~15 字節。而在 RISC 上指令是固定長度。這有什么關系?
如果每條指令的長度都一樣,那么將一個字節流分割,并行發送給 8 個不同的解碼器就非常容易。
但是在 x86 CPU 上,解碼器并不知道下一條指令從什么地方開始。它必須按順序分析每一條指令才能得知具體的長度。
英特爾和 AMD 采取暴力的方式來解決這個問題,即在每個可能的開始位置嘗試解碼。也就是說,許多錯誤的猜測就只能拋棄。這就導致解碼器變得非常復雜,因此很難添加更多的解碼器。但這對于蘋果不是問題,他們可以很容易地添加更多解碼器。
實際上,添加更多解碼器會帶來更多問題,因此對于 AMD 而言,4 個解碼器就是上限了。
所以,M1 Firestorm 核心能在同一時鐘頻率下產生比 AMD 和英特爾 CPU 多一倍的指令。
有人會說,可以將 CISC 拆分成多條微指令,增加指令的密度,這樣解碼一條x86 指令就可以達到解碼兩條 ARM 指令的效果。
但實際情況并非如此。高度優化的x86代碼很少使用復雜的 CISC 指令,甚至看上去更像 RISC。
但這對英特爾和 AMD 并沒有什么用,因為即使 15 字節的指令非常罕見,解碼器也必須處理它們。這種復雜性成為了 AMD 和英特爾添加更多解碼器的阻礙。
但 AMD 的 Zen3 核心更快吧?
據我所知,從性能的角度來看,最新的 AMD CPU 核心 Zen3 比 Firestorm 核心稍稍快一些。但這只是因為 Zen3 核心的時鐘是 5GHz,而 Firestorm 核心的時鐘是 3.2GHz。盡管 Zen3 的時鐘頻率超出了 60%,但性能只不過比Firestorm 快了一點點。
那么為什么蘋果不提高時鐘頻率呢?因為更高的時鐘頻率會增加芯片發熱。這是蘋果的主要賣點。與英特爾和 AMD 不同,他們的電腦很少需要散熱。
所以本質上可以說,Firestorm 核心確實優于 Zen3 核心。 Zen3 雖然性能優秀,但代價是高能耗與較大的發熱量。而蘋果并不選擇這條路。
如果蘋果需要更高的性能,那么他們會添加更多的核心。這樣就能在保持低功率的條件下提高性能。
未來的發展
似乎AMD和英特爾已經陷入了困境:
他們的商業模式很難設計異構計算和單片系統;
由于舊的x86 CISC指令集的負擔,很難提高亂序執行性能。
但這并不意味著窮途末路。他們仍然可以通過提高時鐘頻率、使用更好的散熱、添加更多核心、提高CPU緩存等方式。但每一項都有缺點。英特爾的處境最糟糕,因為他們的核心數已經不及 Firestorm,而且他們的單片系統解決方案中的 GPU 也更弱。
添加更多核心的問題在于,對于一般的桌面負載而言,過多核心帶來的收益很低。當然對于服務器而言,核心數多多益善。
但是,亞馬遜、Ampere 等公司都在研究 128 核心的 CPU。這就意味著英特爾和 AMD 即將面臨雙重夾擊。
但對于 AMD 和英特爾來說,幸運的是,蘋果并沒有在市場上銷售芯片。所以PC 用戶別無選擇。PC 用戶可能會轉而使用蘋果,但畢竟這是一個緩慢的過程。切換日常使用的平臺并不是一蹴而就的事情。
但對于口袋里有錢、沒有太多平臺依賴的年輕人來說,以后會越來越多地選擇蘋果,從而提高蘋果在高端市場的占有率,最終會提高蘋果在整個PC市場的占有率。
責任編輯:xj
-
芯片
+關注
關注
456文章
50892瀏覽量
424324 -
蘋果
+關注
關注
61文章
24418瀏覽量
199038 -
微處理器
+關注
關注
11文章
2264瀏覽量
82508
發布評論請先 登錄
相關推薦
評論