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