蘋果 M1 芯片預示着 RISC-V 完全替代 ARM?

來源 | CSDN(ID:CSDNnews)

作者 | Erik Engheim  已獲作者翻譯授權

譯者 | 彎月  責編 | 張文

編者按:M1 芯片性能強勁的背後主要源自兩個因素:第一,M1芯片使用了大量的解碼器和亂序執行;第二,就是異構計算。本文着重講解第二點。

在大家瞭解了 M1 芯片表現之後,你肯定想一探究竟其底層核心是什麼,本文將從異構計算開始講起。

蘋果非常熱衷於添加多個專用硬件單元的策略,在本文中,我將其稱爲協處理器(coprocessor):

  • 圖形處理單元(GPU),用於圖形處理以及其他需要並行處理大量數據的任務(即同時對多個元素執行相同的操作)。

  • 神經引擎,機器學習的專用硬件。

  • 圖像處理的數字信號處理硬件。

  • 硬件中的視頻編碼。

蘋果沒有在解決方案中添加更多的通用處理器,而是添加了更多的協處理器。你可以稱之爲加速器。這種趨勢並不是新出現的,我從 1985 年開始使用的老式 Amiga 1000 就使用協處理器來加快音頻和圖形處理的速度。現代 GPU 本質上就是協處理器。Google 的 Tensor 處理單元也是一種用於機器學習的協處理器。

圖:Google TPU是專用集成電路(ASIC),我們稱之爲協處理器。


什麼是協處理器?

與 CPU 不同,協處理器不能單獨存在。只使用協處理器無法造出計算機。協處理器作爲專用處理器,可以很好地完成某些特定的任務。最早的協處理器當屬英特爾 8087 浮點單元(FPU)。英特爾的 8086 微處理器可以執行整數運算,但不能執行浮點運算。這兩者的區別是什麼?

圖:英特爾 8087,最早的執行浮點計算的協處理器之一。

整數都是這樣的數字:43、-5、92、4。對於計算機來說,處理這些數字比較容易。你可能只需要將一些簡單的芯片組合在一起,就能處理整數加法。

然而,小數處理就沒那麼簡單了。

假設你需要執行小數的加法或乘法:4.25、84.7 或 3.1415。這些是浮點數。如果小數點後面的位數是固定的,則我們稱之爲定點數。金錢通常都保留兩位小數,因此都是通過定點數處理的。

然而,你可以使用整數來模擬浮點運算,只不過速度會比較慢。與之類似,早期的微處理器只能處理整數的加法,不能處理乘法。但是,它們仍然可以執行乘法,因爲你只需要通過多次的加法來模擬乘法。例如 3×4 = 4 + 4 + 4。

理解下面的示例代碼並不重要,但是可以幫助你理解 CPU 如何通過加、減和分支(代碼跳轉)來執行乘法。

   loadi r3, 0         ; Load 0 into register r3multiply:           add  r3, r1        ; r3 ← r3 + r1   dec  r2            ; r2 ← r2 - 1   bgt  r2, multiply  ; goto multiply ifr2 > 0

簡而言之,你可以通過重複簡單的運算來實現更復雜的數學運算。

所有協處理器的工作方式都與之類似。CPU 總有方法完成協處理器的任務。但是,通常這都需要重複多個更簡單的操作。我們之所以使用 GPU,是因爲對數百萬個多邊形或像素重複相同的計算,對於 CPU 來說確實很耗時。


如何與協處理器來回傳輸數據

我們來看一看下面的示意圖,以更好地瞭解協處理器如何與微處理器(CPU)或通用處理器的協同工作。

圖:微處理器的工作原理概述。

數字沿彩色線移動。輸入/輸出可以是協處理器、鼠標、鍵盤以及其他設備。

我們可以將綠色和淺藍色的公共總線視爲管道。數字通過這些管道推送到 CPU 的不同功能單元(圖中爲灰色盒子)。這些盒子的輸入和輸出連接到了管道。

你可以認爲每個盒子的輸入和輸出都帶有閥門。紅色控制線可用於打開和關閉這些閥門。因此,負責紅線的解碼器(Decoder)可以打開兩個灰色盒子上的閥門,讓數字在它們之間流動。

圖:你可以將數據總線視爲管道,而紅色控制線則負責打開和關閉閥門。

但是,在電子設備中,這是通過我們所謂的多路複用器完成的,而不是實際的閥門。

下面,我們來介紹一下如何從內存中獲取數據。

如果想執行數字運算,則首先需要將數字放入寄存器中。解碼器使用控制線打開灰色盒子“內存”和“寄存器”之間的閥門。具體操作爲:

  1. 解碼器打開負載存儲單元(LSU)上的閥門,內存地址從綠色地址總線上流出。

  2. 打開內存盒上的閥門,這樣它就可以接收地址了,而地址由綠色管道(地址總線)負責傳送。所有其他閥門都關閉,這樣輸入/輸出就無法接收地址。

  3. 選中地址指定的內存單元。然後解碼器會打開通往數據總線的閥門,這樣選定內存單元的內容就會流出到藍色數據總線上。

  4. 內存單元的數據可以流到任何地方,但是解碼器僅打開了寄存器的輸入閥門。

鼠標、鍵盤、顯示器、GPU、FPU、神經引擎和其他協處理器都是“輸入/輸出”盒子。訪問方式與訪問內存一樣。硬盤驅動器、鼠標、鍵盤、網卡、GPU、DMA(直接內存訪問)和協處理器都被映射到自己的內存地址。

舉個例子,如果處理器嘗試從內存地址 84 讀取數據:鼠標的 x 座標,而 85 代表鼠標的 y 座標。

因此,爲了獲取鼠標座標,你可以通過彙編代碼中執行以下操作:

load r1, 84   ; get x-coordinateloar r2, 85   ; get y-coordinate

對於 DMA 控制器,可能地址 110、111 和 113 有特殊的含義。下面這些僞彙編代碼可以使用這些地址與 DMA 控制器進行交互:

loadi r1, 1024  ; set register r to source addressloadi r2, 50    ; bytes to copyloadi r3, 2048  ; destination address
store r1, 110   ; tell DMA controller start addressstore r2, 111   ; tell DMA to copy 50 bytesstore r3, 113   ; tell DMA where to copy 50 bytes to

一切都以這種方式工作。你只需讀寫特殊的內存地址。

當然,一般軟件開發人員不需要知道這些,這些工作都是由設備驅動程序完成的。你使用的程序無法真正看到這些不可見的虛擬內存地址。但是,驅動程序會將這些地址映射到其虛擬內存地址。

我不打算過多地討論虛擬內存。

本質上,我們拿到的是真實的地址。綠色總線上的地址將從虛擬地址轉換爲實際物理地址。當我在 DOS 中編寫 C/C++的程序時,就不會遇到這種情況。我可以將 C 指針直接指向視頻的內存地址,然後直接修改圖片。

char *video_buffer = 0xB8000;    // set pointer to CGA video buffervideo_buffer[3] = 42;            // change color of 4th pixel

協處理器的工作方式與此相同。神經引擎、GPU、安全協處理器(Secure Enclave)都擁有可以與之通信的地址。你需要了解這些,同時也需要了解 DMA 控制器可以異步工作。

這意味着 CPU 可以爲神經引擎或 GPU 安排一整套指令,並將它們寫入內存的緩衝區。然後,通過與 IO 地址的對話,將這些指令的位置通知給神經引擎或 GPU 協處理器。

你肯定不希望 CPU 處於空閒狀態,等待協處理器仔細檢查所有指令和數據。你也不想讓 DMA 遇到這種情況。這就是爲什麼一般我們都需要使用某種中斷的原因。


中斷如何工作?

你插入到 PC 的各種卡,無論是顯卡還是網卡,都將分配一些中斷線。就像一條直接插入 CPU 的線。這條線被激活後,CPU 就會放下手頭所有的工作來處理中斷。更具體地說,CPU 會將自己的當前位置及其寄存器的值存儲在內存中,以方便回頭可以隨時返回之前的工作。接下來,CPU 會查看中斷表需要做什麼。這個表存儲了中斷被觸發時需要運行的程序的地址。

作爲程序員,你很少看見這些東西。對你來說,你看到的更多的是某些事件註冊的回調函數。這些底端的問題一般都是由驅動程序處理的。

我之所以嘮叨了這麼多,就是希望幫助你瞭解使用協處理器時究竟發生了什麼。否則,你就搞不清楚協處理器實際上需要進行哪些通信。

我們可以通過中斷並行處理很多任務。當 CPU 被計算機鼠標中斷時,應用程序可以通過網卡獲取圖像。鼠標移動時,我們需要新的座標。CPU 可以讀取這些並將其發送到 GPU,然後在新位置上顯示鼠標光標。當 GPU 繪製鼠標光標時,CPU 可以趁這段時間處理從網絡檢索到的圖像。

就像使用這些中斷一樣,我們也可以將複雜的機器學習任務發送給 M1 神經引擎,要求它通過網絡攝像頭設別人臉。同時,計算機的其餘部分依然在響應,因爲在神經引擎處理圖像數據期間,CPU 正在處理其他工作。

圖:SiFive 的基於 RISC-V 的主板,能夠運行 Linux


RISC-V 的崛起

早在 2010 年,加州大學伯克利分校的並行計算實驗室就大量使用了協處理器。他們預見了摩爾定律的終結,意味着我們無法再從通用 CPU 核心壓榨出更多性能。我們需要專用的硬件:協處理器。

我們來反思一下爲什麼。我們知道增加時鐘頻率並不容易。我們一直徘徊在 3–5 GHz,無法突破。進一步增加時鐘頻率,那麼功耗和散熱就會出問題。

但是,我們可以添加更多的晶體管。只是我們無法加快晶體管的工作速度。因此,我們需要並行處理很多工作。一種方法是添加大量通用核心。正如我之前討論的那樣,我們可以添加很多解碼器並執行亂序執行。


晶體管預算:CPU 核心還是協處理器?

我們可以無止境地增加 CPU 核心,最後就會得到 Ampere Altra Max ARM 處理器之類 128 個通用核心的處理器。

但這真的是芯片的最佳用法嗎?對於雲服務器而言,這個方法沒問題。我們可以通過 128 個核心處理各種客戶端請求。但是,臺式機系統可能甚至無法有效地利用普通臺式機工作負載上的 8 個以上的核心。因此,即便你擁有 32 個核心,其實大部分也都被浪費了。

既然不能增加更多 CPU 核心,那麼,我們可以添加更多的協處理器嗎?

我們來算一筆賬:你有一個晶體管預算。早先,也許你有 2 萬個晶體管的預算,你發現可以利用這些晶體管制造出具有 1.5 萬晶體管的 CPU。這與 80 年代初的真實情況很相似。現在,這個 CPU 可以執行 100 個不同的任務。假設爲其中一項任務製作專用的協處理器,將花費 1000 晶體管。如果你爲每一個任務創建一個協處理器,那麼就需要 10 萬個晶體管。這會超過你的預算。


過多的晶體管改變了策略

因此,早期的設計需要專注於通用計算。但是今天,我們的芯片中可以塞入太多的晶體管,但卻不知道該用這些晶體管做什麼。

因此,協處理器的設計就成爲了一個大問題。

製作各種新型協處理器的相關研究很多。然而,這些研究經常會造出非常笨拙的加速器,我們需要加以制止。與 CPU 不同,它們無法讀取自己需要執行的指令步驟。一般,它們都不知道如何訪問內存或組織任何事情。

因此,常見解決方案是將一個簡單的 CPU 作爲一種控制器。因此,整個協處理器都是由一個簡單的 CPU 控制的專用加速器電路,CPU 負責配置加速器完成工作。通常這都是高度專業化的工作。例如,神經引擎或張量處理單元等處理的是非常大的寄存器,可以容納矩陣。


通過量身定製的 RISC-V 控制加速器

這正是 RISC-V 的設計初衷。它僅有約 40–50 條指令的最低限度指令集,可以完成所有常見的 CPU 工作。聽起來可能很多,但別忘了,x86 CPU 包含 1500 多個指令。

RISC-V 不需要一套大型的固定指令集,它是圍繞擴展的概念設計的。每個協處理器都是不同的。因此,它將包含一個 RISC-V 處理器來管理核心指令集的實現,以及根據協處理器需要處理的任務而定製的擴展指令集。

蘋果 M1 芯片就在推動整個行業朝着協處理器主導的未來發展。而在協處理器的製造中,RISC-V 將成爲重要的一環。

爲什麼?製作協處理器的人不能發明自己的指令集嗎?不過,我認爲蘋果已經做到了,或者可能他們使用了 ARM,我不清楚。如果有人知道,請在下方留言。


堅持在協處理器中採用 RISC-V 有什麼好處?

製造芯片已成爲一件複雜而耗費巨大的工作。我們需要建立驗證芯片的工具,運行測試程序,運行診斷程序,以及其他很多的事情都需要付出努力。

這是當前使用 ARM 的優勢之一。他們擁有龐大的工具生態系統,可以幫助你驗證設計,並測試芯片。因此,尋求定製的專有指令集並不是一個好主意。但是,使用 RISC-V 可以爲多家公司提供標準工具。就好像突然出現了生態系統,然後由多家公司共同負擔。

那麼,爲什麼不能使用已有的 ARM 呢?ARM 主要面向通用 CPU。它擁有大型的固定指令集。在客戶和 RISC-V 競爭的壓力下,ARM 放低了姿態,並於 2019 年開放了擴展指令集。

但是,問題仍然存在,因爲當初它的設計初衷不在於此。整個 ARM 工具鏈會假定你已經實現了整個大型 ARM 指令集。這對於 Mac 或 iPhone 的主 CPU 來說沒什麼問題。但是對於協處理器,你不想要或不需要這麼大的指令集。你只需要一個圍繞基礎固定擴展指令集而構建的工具生態系統。

爲什麼這樣會有好處?Nvidia 使用 RISC-V 的方法爲我們提供了一些思路。在大型 GPU 上,他們需要某種通用 CPU 作爲控制器。但是,爲此目的保留的晶體管數量以及允許爲此產生的熱量都是有限的,並將產生的熱量降到最低。請記住,有很多晶體管在爭奪芯片這片狹小的空間。

由於 RISC-V 的指令集又小又簡單,因此它擊敗了包括 ARM 在內的所有競爭對手。Nvidia 發現,選擇 RISC-V 可以製造出比其他任何產品都小的芯片,而且還可以將功耗降至最低。因此,你可以通過這種擴展機制,只添加對完成必須的工作至關重要的指令。而對於 GPU 的控制器,除了加密協處理器上的控制器以外,還需要其他擴展。


ARM 將成爲新一代 x86

具有諷刺意味的是,我們可能會看到未來 Mac 和 PC 都由 ARM 處理器來驅動。但是,周邊所有的定製硬件,所有協處理器都將由 RISC-V 主導。隨着協處理器變得越來越流行,運行 RISC-V 的單片系統(SoC)的數量可能會超過 ARM。


ARM 指揮的 RISC-V 協處理器大軍

通用 ARM 處理器將成爲 RISC-V 驅動的協處理器的中心,從圖形、加密、視頻編碼、機器學習、信號處理到處理網絡程序包,所有任務都可以得到加速。

加州大學伯克利分校的教授 David Patterson 和他的團隊預見了這一未來,而且這也是經過精心設計後的 RISC-V 完全可以適應這個新世界的原因。

我們看到 RISC-V 在各種專門的硬件和微控制器中都得到了廣泛的應用和關注,我認爲如今 ARM 主導的許多領域都將歸入 RISC-V 旗下。

圖:樹莓派 4 微控制器,當前使用的是 ARM 處理器。

試想一下樹莓派等設備,如今運行的都是 ARM,但是將來樹莓派的 RISC-V 版本可能會提供能夠滿足各種需求的變體。有些是機器學習微控制器,有些面向圖像處理,而有些則用於加密。

簡單來說,你可以挑選自己的帶有微調功能的微控制器。當然,你可以在其上運行 Linux,並執行所有相同的任務,只是性能會有所不同。帶有特殊機器學習指令的 RISC-V 微控制器訓練神經網絡的速度將遠遠超過帶有視頻編碼指令的 RISC-V 微控制器。

英偉達的 Jetson Nano 已經走上這條冒險之路,如下圖所示。這款微控制器只有樹莓派那麼大,擁有機器學習的專用硬件,因此,你可以利用它執行對象檢測、語音識別以及其他機器學習任務。

圖:英偉達的 Jetson Nano 開發者套件


將 RISC-V 作爲主 CPU?

許多人可能想問:爲什麼不用 RISC-V 完全替代 ARM?

儘管有些人認爲這根本無法實現,因爲 RISC-V 擁有一套“精巧又簡單”的指令集,無法提供 ARM 和 x86 的高性能。實際上,你可以將 RISC-V 作爲主處理器。性能並不是問題。就像使用 ARM 一樣,我們只需要有人來製作高性能 RISC-V 芯片。

實際上,已經有人制作出了這樣的芯片:新的 RISC-V CPU 宣稱性能已創紀錄。

人們常常有一個誤解:複雜的指令可以提供更高的性能。RISC 工作站在 90 年代就證明了這是錯誤的想法,它們在性能基準測試中徹底擊敗了 x86 計算機。實際上,RISC-V 有很多巧妙的方法來提高性能。簡而言之,你完全可以將 RISC-V 處理器作爲主 CPU,但這也是一個時機的問題。MacOS 和 Windows 都採用了 ARM。至少在短期內,微軟或蘋果是否會再次投資硬件以支持 RISC-V 似乎很值得懷疑。


總結

有人聲稱 RISC-V CPU 在功耗和性能方面已經超過了 ARM。人們紛紛在討論,RISC-V 是否確實有可能成爲計算機的主 CPU。

我必須承認,我不清楚爲什麼 RISC-V 會超過 ARM。而且他們自己也承認, RISC-V 是一個非常保守的設計,其中並沒有使用太多新的指令。但是,採用最小指令集確實有優勢。我們可以實現非常小且非常簡單的 RISC-V CPU,同時功耗會降低,而時鐘頻率可以提升。

因此,關於 RISC-V 和 ARM 的最終結論還爲時尚早。

原文鏈接:https://erik-engheim.medium.com/apple-m1-foreshadows-risc-v-dd63a62b2562

原文標題:Apple M1 foreshadows Rise of RISC-V

作者:Erik Engheim,現居挪威,熱衷於 UX、Julia 編程、科學與寫作。

本文爲 CSDN 翻譯,轉載請註明來源出處。


更多精彩推薦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章