近期,國外開發者Dougall Johnson透過逆向工程,在蘋果M1處理器內發現了一個被稱為AMX的強大的未公開過的秘密協處理器--矩陣協處理器。
要弄清Apple矩陣協處理器具體是做什麼的,需要弄清楚幾個基本知識,例如什麼是協處理器?什麼是矩陣?為什麼還要關心這些?
更重要的是,為什麼蘋果公司的幻燈片都沒有提到這個協處理器?為什麼它似乎是一個秘密?如果你已經瞭解了M1片上系統(SoC)中的神經引擎,您可能會對Apple的矩陣協處理器(AMX)與眾不同的原因感到困惑。
在闡述這個大問題之前,我先說說基本概念,比如什麼是矩陣?什麼是協處理器。
矩陣基本上只是一個數字表。如果您使用過Microsoft Excel等電子表格,則基本上可以使用與矩陣非常相似的東西。關鍵的區別在於,在數學中,這樣的數字表有一個它們支援的操作列表和特定的行為。正如您在這裡看到的,矩陣可以有不同的風格。有這樣一行的矩陣,通常稱為行向量。如果一個是列向量,我們稱之為列向量。關於矩陣相關內容,相信每一個理工科專業的都應該非常瞭解,因此在此也不做過多的贅述了。
矩陣之所以重要,是因為它們在以下方面被廣泛應用:
影象處理機器學習語音和手寫識別人臉識別壓縮多媒體:音訊和影片尤其是這幾年很火的機器學習。僅僅在CPU上增加更多的核心並不能讓這個執行速度足夠快,因為它的要求真的很高,這需要專門的硬體。常規任務如瀏覽網際網路、寫郵件、文字處理和電子表格已經運行了多年,速度已經足夠快。而機器學習,這是我們真正需要提高處理能力的特殊任務。
在任何給定的晶片上,蘋果公司都有一個最大的電晶體數量來構建不同型別的硬體。他們可以增加更多的CPU核心,但這實際上只是加快常規任務的速度,而常規任務的執行速度已經足夠快。因此,他們選擇花電晶體來製造專門的硬體來解決影象處理、影片解碼和機器學習。這個專用硬體就是協處理器和加速器。
如果你瞭解一些關於神經引擎的知識,你將會知道它還會執行矩陣運算以幫助完成機器學習任務。那麼我們為什麼需要矩陣協處理器呢?還是說它們其實只是同一種東西?這裡大家是不是被搞糊塗了?
接下來就澄清一下蘋果的Matrix協處理器和神經引擎有什麼不同,以及為什麼在M1處理器中這兩者都需要。
主處理器(CPU)、協處理器和加速器通常可以透過共享資料匯流排交換資料。CPU通常控制記憶體訪問,而加速器(例如GPU)通常具有自己的專用記憶體。
Nvidia圖形卡中的GPU和神經引擎都是加速器的一種。
在這兩種情況下,都有特殊的記憶體區域,CPU必須填充要處理的資料,而記憶體的另一部分則填充加速器應執行的指令列表。CPU設定此類處理非常耗時。需要進行大量協調,填寫資料,然後等待獲得結果。
因此,對應更大的任務來說,這個會帶來回報,但是對於較小的任務,開銷將太高。
與加速器不同,協處理器監視從記憶體讀取到主處理器的指令流。相比之下,加速器不會遵守CPU從記憶體中提取的指令。
這就是協處理器優於加速器的地方。協處理器會監視從記憶體(更具體地說,是快取)輸入CPU的機器程式碼指令流。協處理器是用來對特定指令作出反應的。與此同時,CPU通常會忽略這些指令,或者幫助協處理器處理這些指令。
我們從中得到的好處是,協處理器執行的指令可以放在你的常規程式碼中。這與GPU不同。如果你做過GPU程式設計,則知道著色器程式已放置在單獨的記憶體緩衝區中,並且你必須將這些著色器程式顯式傳輸到GPU。你不能將GPU特定的指令放在常規程式碼中。因此,對於涉及矩陣處理的較小工作量,AMX將比神經引擎更加有效。
這樣你需要在你的微處理器的指令集架構(ISA)中實際定義新的特定的指令。因此,與使用加速器相比,使用協處理器時需要與CPU緊密整合。
對於ARM指令集體系結構(ISA)的建立者ARM公司來說,長期以來一直拒絕向其ISA新增自定義指令。而可擴充套件自有指令,這個是RISC-V的優點之一。
但是,由於客戶的壓力,ARM在2019年10月做出了讓步並宣佈將允許擴充套件。參考:Arm推出自定義指令集功能這可能有助於解釋為什麼官方文件中沒有描述AMX指令。ARM期望Apple將此類指令儲存在客戶提供的庫中。
很容易將矩陣協處理器與SIMD向量引擎混淆,目前大多數現代處理器(包括ARM處理器)內都有SIMD向量引擎。SIMD是單指令多資料的縮寫。
單指令單資料(SISD)與單指令多資料(SIMD)當你需要對多個元素執行相同的操作時,SIMD是一種獲得更高效能的方法。這與矩陣運算密切相關。實際上,SIMD指令(例如ARM的Neon指令或Intel x86SSE或AVX)通常用於加速矩陣乘法。
然而SIMD向量引擎是微處理器核心的一部分。就像ALU(算術邏輯單元)和FPU(浮點單元)是CPU的一部分。在微處理器內部有一個指令解碼器,它將對一條指令進行拆分,並決定啟用什麼功能單元。
在CPU內部,會有ALU、FPU以及SIMD向量引擎,作為獨立的部分,由指令解碼器啟用。而協處理器則是外接在微處理器核心上的。比如英特爾8087,這是最早的協處理器晶片之一,它是一種物理上獨立的晶片,旨在加快浮點計算的速度。
對於8087,你可能會很奇怪,為什麼有人會想透過擁有一個像這樣的單獨晶片來使CPU設計複雜化?該晶片必須嗅探從記憶體到CPU的資料流,以檢視是否有任何浮點指令。
原因很簡單,第一批PC中的原始8086 CPU包含29,000個電晶體。相比之下,8087要複雜得多,有45,000個電晶體。將這兩個晶片結合在一起會非常困難和昂貴。
但是隨著製造技術的改進,將浮點單元(FPU)放置在CPU內早已不是問題。因此,因此FPU取代了浮點協處理器。
回到現在,我們還不清楚為什麼AMX不是M1上Firestorm核心的一部分。不過無論如何,它們都整合在同一個矽晶片上。在此我們只能提供一些推測,透過成為協處理器,CPU繼續並行執行可能會更容易、蘋果可能還喜歡將非標準的ARM產品保留在其ARM CPU核心之外等。
如果官方文件中沒有描述AMX,我們是怎麼發現的呢?這個要感謝開發人員Dougall Johnson,他出色地完成了M1的逆向工程,以發現該協處理器。這裡
https://gist.github.com/dougallj/7a75a3be1ec69ca550e7c36dc75e0d6f
描述了他所作的努力。對於與矩陣有關的數學運算,Apple具有特殊的庫或框架,例如Accelerate,其組成如下:
vImage -更高級別的影象處理,例如格式之間的轉換,影象處理。BLAS —一種線性代數的行業標準(我們稱其為處理矩陣和向量的數學方法)。BNNS —用於執行神經網路和訓練。vDSP —數字訊號處理。傅立葉變換,卷積。這些是在影象處理或真正包括音訊的任何訊號中很重要的數學運算。LAPACK -更高的水平線性代數函式,例如,用於求解線性方程組。Dougall Johnson知道這些庫將使用AMX協處理器來加快計算速度。因此,他編寫了一些特殊程式來分析和觀察這些程式做了什麼,以發現未記錄的特殊AMX機器程式碼指令。
但為什麼蘋果公司不記錄下來,讓我們直接使用這些指令呢?如前所述,這是ARM公司希望避免的事情。如果自定義指令被廣泛使用,可能會使ARM生態系統碎片化。
然而更重要的是,這對蘋果來說是一個優勢。透過僅允許他們的庫使用這些特殊指令,蘋果保留了以後從根本上改變這個硬體工作方式的自由。他們可以刪除或新增AMX指令。或者他們可以讓神經引擎來完成這項工作。無論哪種方式,他們都會讓開發者的工作變得更容易。開發者只需要使用Accelerate框架,就可以忽略蘋果如何專門加快矩陣計算的速度。
這是蘋果透過垂直整合獲得的最大優勢之一。透過控制硬體和軟體,他們可以利用這些技巧。那麼下一個問題是這有多大的意義?就效能和功能而言,這對蘋果有什麼好處?
NodLabs是一家從事機器互動,智慧和感知的公司。快速矩陣運算自然是他們的興趣所在。他們寫了一篇有關AMX效能測試的技術性很強的部落格文章:比較Apple的M1 matmul效能-AMX2 vs NEON。https://nod.ai/comparing-apple-m1-with-amx2-m1-with-neon/
他們要做的是比較用AMX做類似程式碼的效能和用ARM官方支援的Neon指令做的效能。Neon是SIMD指令的一種。
Nod實驗室發現,透過使用AMX,他們能夠獲得Neon指令兩倍的矩陣運算效能。這並不意味著AMX對所有事情都更好,但至少對於機器學習和高效能計算(HPC)型別的工作,我們可以期待AMX給競爭者帶來優勢。
蘋果矩陣協處理器看起來是一些相當令人印象深刻的硬體,讓蘋果的ARM處理器在機器學習和HPC相關的工作中佔據優勢。