蘋果 M1 芯片預(yù)示著 RISC-V 完全替代 ARM?
來源 | CSDN(ID:CSDNnews)
作者 | Erik Engheim 已獲作者翻譯授權(quán)
譯者 | 彎月 責(zé)編 | 張文
編者按:M1 芯片性能強(qiáng)勁的背后主要源自兩個(gè)因素:第一,M1芯片使用了大量的****和亂序執(zhí)行;第二,就是異構(gòu)計(jì)算。本文著重講解第二點(diǎn)。
在大家了解了 M1 芯片表現(xiàn)之后,你肯定想一探究竟其底層核心是什么,本文將從異構(gòu)計(jì)算開始講起。
蘋果非常熱衷于添加多個(gè)專用硬件單元的策略,在本文中,我將其稱為協(xié)處理器(coprocessor):
圖形處理單元(GPU),用于圖形處理以及其他需要并行處理大量數(shù)據(jù)的任務(wù)(即同時(shí)對(duì)多個(gè)元素執(zhí)行相同的操作)。
神經(jīng)引擎,機(jī)器學(xué)習(xí)的專用硬件。
圖像處理的數(shù)字信號(hào)處理硬件。
硬件中的視頻編碼。
蘋果沒有在解決方案中添加更多的通用處理器,而是添加了更多的協(xié)處理器。你可以稱之為加速器。這種趨勢(shì)并不是新出現(xiàn)的,我從 1985 年開始使用的老式 Amiga 1000 就使用協(xié)處理器來加快音頻和圖形處理的速度?,F(xiàn)代 GPU 本質(zhì)上就是協(xié)處理器。Google 的 Tensor 處理單元也是一種用于機(jī)器學(xué)習(xí)的協(xié)處理器。
圖:Google TPU是專用集成電路(ASIC),我們稱之為協(xié)處理器。
什么是協(xié)處理器?
與 CPU 不同,協(xié)處理器不能單獨(dú)存在。只使用協(xié)處理器無法造出計(jì)算機(jī)。協(xié)處理器作為專用處理器,可以很好地完成某些特定的任務(wù)。最早的協(xié)處理器當(dāng)屬英特爾 8087 浮點(diǎn)單元(FPU)。英特爾的 8086 微處理器可以執(zhí)行整數(shù)運(yùn)算,但不能執(zhí)行浮點(diǎn)運(yùn)算。這兩者的區(qū)別是什么?
圖:英特爾 8087,最早的執(zhí)行浮點(diǎn)計(jì)算的協(xié)處理器之一。
整數(shù)都是這樣的數(shù)字:43、-5、92、4。對(duì)于計(jì)算機(jī)來說,處理這些數(shù)字比較容易。你可能只需要將一些簡(jiǎn)單的芯片組合在一起,就能處理整數(shù)加法。
然而,小數(shù)處理就沒那么簡(jiǎn)單了。
假設(shè)你需要執(zhí)行小數(shù)的加法或乘法:4.25、84.7 或 3.1415。這些是浮點(diǎn)數(shù)。如果小數(shù)點(diǎn)后面的位數(shù)是固定的,則我們稱之為定點(diǎn)數(shù)。金錢通常都保留兩位小數(shù),因此都是通過定點(diǎn)數(shù)處理的。
然而,你可以使用整數(shù)來模擬浮點(diǎn)運(yùn)算,只不過速度會(huì)比較慢。與之類似,早期的微處理器只能處理整數(shù)的加法,不能處理乘法。但是,它們?nèi)匀豢梢詧?zhí)行乘法,因?yàn)槟阒恍枰ㄟ^多次的加法來模擬乘法。例如 3×4 = 4 + 4 + 4。
理解下面的示例代碼并不重要,但是可以幫助你理解 CPU 如何通過加、減和分支(代碼跳轉(zhuǎn))來執(zhí)行乘法。
loadi r3, 0 ; Load 0 into register r3
multiply:
add r3, r1 ; r3 ← r3 + r1
dec r2 ; r2 ← r2 - 1
bgt r2, multiply ; goto multiply ifr2 > 0
簡(jiǎn)而言之,你可以通過重復(fù)簡(jiǎn)單的運(yùn)算來實(shí)現(xiàn)更復(fù)雜的數(shù)學(xué)運(yùn)算。
所有協(xié)處理器的工作方式都與之類似。CPU 總有方法完成協(xié)處理器的任務(wù)。但是,通常這都需要重復(fù)多個(gè)更簡(jiǎn)單的操作。我們之所以使用 GPU,是因?yàn)閷?duì)數(shù)百萬個(gè)多邊形或像素重復(fù)相同的計(jì)算,對(duì)于 CPU 來說確實(shí)很耗時(shí)。
如何與協(xié)處理器來回傳輸數(shù)據(jù)
我們來看一看下面的示意圖,以更好地了解協(xié)處理器如何與微處理器(CPU)或通用處理器的協(xié)同工作。
圖:微處理器的工作原理概述。
數(shù)字沿彩色線移動(dòng)。輸入/輸出可以是協(xié)處理器、鼠標(biāo)、鍵盤以及其他設(shè)備。
我們可以將綠色和淺藍(lán)色的公共總線視為管道。數(shù)字通過這些管道推送到 CPU 的不同功能單元(圖中為灰色盒子)。這些盒子的輸入和輸出連接到了管道。
你可以認(rèn)為每個(gè)盒子的輸入和輸出都帶有閥門。紅色控制線可用于打開和關(guān)閉這些閥門。因此,負(fù)責(zé)紅線的****(Decoder)可以打開兩個(gè)灰色盒子上的閥門,讓數(shù)字在它們之間流動(dòng)。
圖:你可以將數(shù)據(jù)總線視為管道,而紅色控制線則負(fù)責(zé)打開和關(guān)閉閥門。
但是,在電子設(shè)備中,這是通過我們所謂的多路復(fù)用器完成的,而不是實(shí)際的閥門。
下面,我們來介紹一下如何從內(nèi)存中獲取數(shù)據(jù)。
如果想執(zhí)行數(shù)字運(yùn)算,則首先需要將數(shù)字放入寄存器中。****使用控制線打開灰色盒子“內(nèi)存”和“寄存器”之間的閥門。具體操作為:
****打開負(fù)載存儲(chǔ)單元(LSU)上的閥門,內(nèi)存地址從綠色地址總線上流出。
打開內(nèi)存盒上的閥門,這樣它就可以接收地址了,而地址由綠色管道(地址總線)負(fù)責(zé)傳送。所有其他閥門都關(guān)閉,這樣輸入/輸出就無法接收地址。
選中地址指定的內(nèi)存單元。然后****會(huì)打開通往數(shù)據(jù)總線的閥門,這樣選定內(nèi)存單元的內(nèi)容就會(huì)流出到藍(lán)色數(shù)據(jù)總線上。
內(nèi)存單元的數(shù)據(jù)可以流到任何地方,但是****僅打開了寄存器的輸入閥門。
鼠標(biāo)、鍵盤、顯示器、GPU、FPU、神經(jīng)引擎和其他協(xié)處理器都是“輸入/輸出”盒子。訪問方式與訪問內(nèi)存一樣。硬盤驅(qū)動(dòng)器、鼠標(biāo)、鍵盤、網(wǎng)卡、GPU、DMA(直接內(nèi)存訪問)和協(xié)處理器都被映射到自己的內(nèi)存地址。
舉個(gè)例子,如果處理器嘗試從內(nèi)存地址 84 讀取數(shù)據(jù):鼠標(biāo)的 x 坐標(biāo),而 85 代表鼠標(biāo)的 y 坐標(biāo)。
因此,為了獲取鼠標(biāo)坐標(biāo),你可以通過匯編代碼中執(zhí)行以下操作:
load r1, 84 ; get x-coordinate
loar r2, 85 ; get y-coordinate
對(duì)于 DMA 控制器,可能地址 110、111 和 113 有特殊的含義。下面這些偽匯編代碼可以使用這些地址與 DMA 控制器進(jìn)行交互:
loadi r1, 1024 ; set register r to source address
loadi r2, 50 ; bytes to copy
loadi r3, 2048 ; destination address
store r1, 110 ; tell DMA controller start address
store r2, 111 ; tell DMA to copy 50 bytes
store r3, 113 ; tell DMA where to copy 50 bytes to
一切都以這種方式工作。你只需讀寫特殊的內(nèi)存地址。
當(dāng)然,一般軟件開發(fā)人員不需要知道這些,這些工作都是由設(shè)備驅(qū)動(dòng)程序完成的。你使用的程序無法真正看到這些不可見的虛擬內(nèi)存地址。但是,驅(qū)動(dòng)程序會(huì)將這些地址映射到其虛擬內(nèi)存地址。
我不打算過多地討論虛擬內(nèi)存。
本質(zhì)上,我們拿到的是真實(shí)的地址。綠色總線上的地址將從虛擬地址轉(zhuǎn)換為實(shí)際物理地址。當(dāng)我在 DOS 中編寫 C/C++的程序時(shí),就不會(huì)遇到這種情況。我可以將 C 指針直接指向視頻的內(nèi)存地址,然后直接修改圖片。
char *video_buffer = 0xB8000; // set pointer to CGA video buffer
video_buffer[3] = 42; // change color of 4th pixel
協(xié)處理器的工作方式與此相同。神經(jīng)引擎、GPU、安全協(xié)處理器(Secure Enclave)都擁有可以與之通信的地址。你需要了解這些,同時(shí)也需要了解 DMA 控制器可以異步工作。
這意味著 CPU 可以為神經(jīng)引擎或 GPU 安排一整套指令,并將它們寫入內(nèi)存的緩沖區(qū)。然后,通過與 IO 地址的對(duì)話,將這些指令的位置通知給神經(jīng)引擎或 GPU 協(xié)處理器。
你肯定不希望 CPU 處于空閑狀態(tài),等待協(xié)處理器仔細(xì)檢查所有指令和數(shù)據(jù)。你也不想讓 DMA 遇到這種情況。這就是為什么一般我們都需要使用某種中斷的原因。
中斷如何工作?
你插入到 PC 的各種卡,無論是顯卡還是網(wǎng)卡,都將分配一些中斷線。就像一條直接插入 CPU 的線。這條線被激活后,CPU 就會(huì)放下手頭所有的工作來處理中斷。更具體地說,CPU 會(huì)將自己的當(dāng)前位置及其寄存器的值存儲(chǔ)在內(nèi)存中,以方便回頭可以隨時(shí)返回之前的工作。接下來,CPU 會(huì)查看中斷表需要做什么。這個(gè)表存儲(chǔ)了中斷被觸發(fā)時(shí)需要運(yùn)行的程序的地址。
作為程序員,你很少看見這些東西。對(duì)你來說,你看到的更多的是某些事件注冊(cè)的回調(diào)函數(shù)。這些底端的問題一般都是由驅(qū)動(dòng)程序處理的。
我之所以嘮叨了這么多,就是希望幫助你了解使用協(xié)處理器時(shí)究竟發(fā)生了什么。否則,你就搞不清楚協(xié)處理器實(shí)際上需要進(jìn)行哪些通信。
我們可以通過中斷并行處理很多任務(wù)。當(dāng) CPU 被計(jì)算機(jī)鼠標(biāo)中斷時(shí),應(yīng)用程序可以通過網(wǎng)卡獲取圖像。鼠標(biāo)移動(dòng)時(shí),我們需要新的坐標(biāo)。CPU 可以讀取這些并將其發(fā)送到 GPU,然后在新位置上顯示鼠標(biāo)光標(biāo)。當(dāng) GPU 繪制鼠標(biāo)光標(biāo)時(shí),CPU 可以趁這段時(shí)間處理從網(wǎng)絡(luò)檢索到的圖像。
就像使用這些中斷一樣,我們也可以將復(fù)雜的機(jī)器學(xué)習(xí)任務(wù)發(fā)送給 M1 神經(jīng)引擎,要求它通過網(wǎng)絡(luò)攝像頭設(shè)別人臉。同時(shí),計(jì)算機(jī)的其余部分依然在響應(yīng),因?yàn)樵谏窠?jīng)引擎處理圖像數(shù)據(jù)期間,CPU 正在處理其他工作。
圖:SiFive 的基于 RISC-V 的主板,能夠運(yùn)行 Linux
RISC-V 的崛起
早在 2010 年,加州大學(xué)伯克利分校的并行計(jì)算實(shí)驗(yàn)室就大量使用了協(xié)處理器。他們預(yù)見了摩爾定律的終結(jié),意味著我們無法再從通用 CPU 核心壓榨出更多性能。我們需要專用的硬件:協(xié)處理器。
我們來反思一下為什么。我們知道增加時(shí)鐘頻率并不容易。我們一直徘徊在 3–5 GHz,無法突破。進(jìn)一步增加時(shí)鐘頻率,那么功耗和散熱就會(huì)出問題。
但是,我們可以添加更多的晶體管。只是我們無法加快晶體管的工作速度。因此,我們需要并行處理很多工作。一種方法是添加大量通用核心。正如我之前討論的那樣,我們可以添加很多****并執(zhí)行亂序執(zhí)行。
晶體管預(yù)算:CPU 核心還是協(xié)處理器?
我們可以無止境地增加 CPU 核心,最后就會(huì)得到 Ampere Altra Max ARM 處理器之類 128 個(gè)通用核心的處理器。
但這真的是芯片的最佳用法嗎?對(duì)于云服務(wù)器而言,這個(gè)方法沒問題。我們可以通過 128 個(gè)核心處理各種客戶端請(qǐng)求。但是,臺(tái)式機(jī)系統(tǒng)可能甚至無法有效地利用普通臺(tái)式機(jī)工作負(fù)載上的 8 個(gè)以上的核心。因此,即便你擁有 32 個(gè)核心,其實(shí)大部分也都被浪費(fèi)了。
既然不能增加更多 CPU 核心,那么,我們可以添加更多的協(xié)處理器嗎?
我們來算一筆賬:你有一個(gè)晶體管預(yù)算。早先,也許你有 2 萬個(gè)晶體管的預(yù)算,你發(fā)現(xiàn)可以利用這些晶體管制造出具有 1.5 萬晶體管的 CPU。這與 80 年代初的真實(shí)情況很相似。現(xiàn)在,這個(gè) CPU 可以執(zhí)行 100 個(gè)不同的任務(wù)。假設(shè)為其中一項(xiàng)任務(wù)制作專用的協(xié)處理器,將花費(fèi) 1000 晶體管。如果你為每一個(gè)任務(wù)創(chuàng)建一個(gè)協(xié)處理器,那么就需要 10 萬個(gè)晶體管。這會(huì)超過你的預(yù)算。
過多的晶體管改變了策略
因此,早期的設(shè)計(jì)需要專注于通用計(jì)算。但是今天,我們的芯片中可以塞入太多的晶體管,但卻不知道該用這些晶體管做什么。
因此,協(xié)處理器的設(shè)計(jì)就成為了一個(gè)大問題。
制作各種新型協(xié)處理器的相關(guān)研究很多。然而,這些研究經(jīng)常會(huì)造出非常笨拙的加速器,我們需要加以制止。與 CPU 不同,它們無法讀取自己需要執(zhí)行的指令步驟。一般,它們都不知道如何訪問內(nèi)存或組織任何事情。
因此,常見解決方案是將一個(gè)簡(jiǎn)單的 CPU 作為一種控制器。因此,整個(gè)協(xié)處理器都是由一個(gè)簡(jiǎn)單的 CPU 控制的專用加速器電路,CPU 負(fù)責(zé)配置加速器完成工作。通常這都是高度專業(yè)化的工作。例如,神經(jīng)引擎或張量處理單元等處理的是非常大的寄存器,可以容納矩陣。
通過量身定制的 RISC-V 控制加速器
這正是 RISC-V 的設(shè)計(jì)初衷。它僅有約 40–50 條指令的最低限度指令集,可以完成所有常見的 CPU 工作。聽起來可能很多,但別忘了,x86 CPU 包含 1500 多個(gè)指令。
RISC-V 不需要一套大型的固定指令集,它是圍繞擴(kuò)展的概念設(shè)計(jì)的。每個(gè)協(xié)處理器都是不同的。因此,它將包含一個(gè) RISC-V 處理器來管理核心指令集的實(shí)現(xiàn),以及根據(jù)協(xié)處理器需要處理的任務(wù)而定制的擴(kuò)展指令集。
蘋果 M1 芯片就在推動(dòng)整個(gè)行業(yè)朝著協(xié)處理器主導(dǎo)的未來發(fā)展。而在協(xié)處理器的制造中,RISC-V 將成為重要的一環(huán)。
為什么?制作協(xié)處理器的人不能發(fā)明自己的指令集嗎?不過,我認(rèn)為蘋果已經(jīng)做到了,或者可能他們使用了 ARM,我不清楚。如果有人知道,請(qǐng)?jiān)谙路搅粞浴?/p>
堅(jiān)持在協(xié)處理器中采用 RISC-V 有什么好處?
制造芯片已成為一件復(fù)雜而耗費(fèi)巨大的工作。我們需要建立驗(yàn)證芯片的工具,運(yùn)行測(cè)試程序,運(yùn)行診斷程序,以及其他很多的事情都需要付出努力。
這是當(dāng)前使用 ARM 的優(yōu)勢(shì)之一。他們擁有龐大的工具生態(tài)系統(tǒng),可以幫助你驗(yàn)證設(shè)計(jì),并測(cè)試芯片。因此,尋求定制的專有指令集并不是一個(gè)好主意。但是,使用 RISC-V 可以為多家公司提供標(biāo)準(zhǔn)工具。就好像突然出現(xiàn)了生態(tài)系統(tǒng),然后由多家公司共同負(fù)擔(dān)。
那么,為什么不能使用已有的 ARM 呢?ARM 主要面向通用 CPU。它擁有大型的固定指令集。在客戶和 RISC-V 競(jìng)爭(zhēng)的壓力下,ARM 放低了姿態(tài),并于 2019 年開放了擴(kuò)展指令集。
但是,問題仍然存在,因?yàn)楫?dāng)初它的設(shè)計(jì)初衷不在于此。整個(gè) ARM 工具鏈會(huì)假定你已經(jīng)實(shí)現(xiàn)了整個(gè)大型 ARM 指令集。這對(duì)于 Mac 或 iPhone 的主 CPU 來說沒什么問題。但是對(duì)于協(xié)處理器,你不想要或不需要這么大的指令集。你只需要一個(gè)圍繞基礎(chǔ)固定擴(kuò)展指令集而構(gòu)建的工具生態(tài)系統(tǒng)。
為什么這樣會(huì)有好處?Nvidia 使用 RISC-V 的方法為我們提供了一些思路。在大型 GPU 上,他們需要某種通用 CPU 作為控制器。但是,為此目的保留的晶體管數(shù)量以及允許為此產(chǎn)生的熱量都是有限的,并將產(chǎn)生的熱量降到最低。請(qǐng)記住,有很多晶體管在爭(zhēng)奪芯片這片狹小的空間。
由于 RISC-V 的指令集又小又簡(jiǎn)單,因此它擊敗了包括 ARM 在內(nèi)的所有競(jìng)爭(zhēng)對(duì)手。Nvidia 發(fā)現(xiàn),選擇 RISC-V 可以制造出比其他任何產(chǎn)品都小的芯片,而且還可以將功耗降至最低。因此,你可以通過這種擴(kuò)展機(jī)制,只添加對(duì)完成必須的工作至關(guān)重要的指令。而對(duì)于 GPU 的控制器,除了加密協(xié)處理器上的控制器以外,還需要其他擴(kuò)展。
ARM 將成為新一代 x86
具有諷刺意味的是,我們可能會(huì)看到未來 Mac 和 PC 都由 ARM 處理器來驅(qū)動(dòng)。但是,周邊所有的定制硬件,所有協(xié)處理器都將由 RISC-V 主導(dǎo)。隨著協(xié)處理器變得越來越流行,運(yùn)行 RISC-V 的單片系統(tǒng)(SoC)的數(shù)量可能會(huì)超過 ARM。
ARM 指揮的 RISC-V 協(xié)處理器大軍
通用 ARM 處理器將成為 RISC-V 驅(qū)動(dòng)的協(xié)處理器的中心,從圖形、加密、視頻編碼、機(jī)器學(xué)習(xí)、信號(hào)處理到處理網(wǎng)絡(luò)程序包,所有任務(wù)都可以得到加速。
加州大學(xué)伯克利分校的教授 David Patterson 和他的團(tuán)隊(duì)預(yù)見了這一未來,而且這也是經(jīng)過精心設(shè)計(jì)后的 RISC-V 完全可以適應(yīng)這個(gè)新世界的原因。
我們看到 RISC-V 在各種專門的硬件和微控制器中都得到了廣泛的應(yīng)用和關(guān)注,我認(rèn)為如今 ARM 主導(dǎo)的許多領(lǐng)域都將歸入 RISC-V 旗下。
圖:樹莓派 4 微控制器,當(dāng)前使用的是 ARM 處理器。
試想一下樹莓派等設(shè)備,如今運(yùn)行的都是 ARM,但是將來樹莓派的 RISC-V 版本可能會(huì)提供能夠滿足各種需求的變體。有些是機(jī)器學(xué)習(xí)微控制器,有些面向圖像處理,而有些則用于加密。
簡(jiǎn)單來說,你可以挑選自己的帶有微調(diào)功能的微控制器。當(dāng)然,你可以在其上運(yùn)行 Linux,并執(zhí)行所有相同的任務(wù),只是性能會(huì)有所不同。帶有特殊機(jī)器學(xué)習(xí)指令的 RISC-V 微控制器訓(xùn)練神經(jīng)網(wǎng)絡(luò)的速度將遠(yuǎn)遠(yuǎn)超過帶有視頻編碼指令的 RISC-V 微控制器。
英偉達(dá)的 Jetson Nano 已經(jīng)走上這條冒險(xiǎn)之路,如下圖所示。這款微控制器只有樹莓派那么大,擁有機(jī)器學(xué)習(xí)的專用硬件,因此,你可以利用它執(zhí)行對(duì)象檢測(cè)、語音識(shí)別以及其他機(jī)器學(xué)習(xí)任務(wù)。
圖:英偉達(dá)的 Jetson Nano 開發(fā)者套件
將 RISC-V 作為主 CPU?
許多人可能想問:為什么不用 RISC-V 完全替代 ARM?
盡管有些人認(rèn)為這根本無法實(shí)現(xiàn),因?yàn)?RISC-V 擁有一套“精巧又簡(jiǎn)單”的指令集,無法提供 ARM 和 x86 的高性能。實(shí)際上,你可以將 RISC-V 作為主處理器。性能并不是問題。就像使用 ARM 一樣,我們只需要有人來制作高性能 RISC-V 芯片。
實(shí)際上,已經(jīng)有人制作出了這樣的芯片:新的 RISC-V CPU 宣稱性能已創(chuàng)紀(jì)錄。
人們常常有一個(gè)誤解:復(fù)雜的指令可以提供更高的性能。RISC 工作站在 90 年代就證明了這是錯(cuò)誤的想法,它們?cè)谛阅芑鶞?zhǔn)測(cè)試中徹底擊敗了 x86 計(jì)算機(jī)。實(shí)際上,RISC-V 有很多巧妙的方法來提高性能。簡(jiǎn)而言之,你完全可以將 RISC-V 處理器作為主 CPU,但這也是一個(gè)時(shí)機(jī)的問題。MacOS 和 Windows 都采用了 ARM。至少在短期內(nèi),微軟或蘋果是否會(huì)再次投資硬件以支持 RISC-V 似乎很值得懷疑。
總結(jié)
有人聲稱 RISC-V CPU 在功耗和性能方面已經(jīng)超過了 ARM。人們紛紛在討論,RISC-V 是否確實(shí)有可能成為計(jì)算機(jī)的主 CPU。
我必須承認(rèn),我不清楚為什么 RISC-V 會(huì)超過 ARM。而且他們自己也承認(rèn), RISC-V 是一個(gè)非常保守的設(shè)計(jì),其中并沒有使用太多新的指令。但是,采用最小指令集確實(shí)有優(yōu)勢(shì)。我們可以實(shí)現(xiàn)非常小且非常簡(jiǎn)單的 RISC-V CPU,同時(shí)功耗會(huì)降低,而時(shí)鐘頻率可以提升。
因此,關(guān)于 RISC-V 和 ARM 的最終結(jié)論還為時(shí)尚早。
原文鏈接:https://erik-engheim.medium.com/apple-m1-foreshadows-risc-v-dd63a62b2562
原文標(biāo)題:Apple M1 foreshadows Rise of RISC-V
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。