作者:Erik Engheim
機器之心編譯,編輯:陳萍
國外開發者通過逆向工程,研究了蘋果公司 M1 矩陣協處理器的運行機制。在 Arm 架構下,蘋果已經引入了自定義指令集。

近期,國外開發者 Dougall Johnson 通過逆向工程,在蘋果 M1 處理器內發現了一個被稱為 AMX 的強大的未公開過的神祕協處理器:矩陣協處理器。

要弄清蘋果矩陣協處理器具體是做什麼的,我們需要了解什麼是協處理器、什麼是矩陣,以及為什麼還要關心這些?
更重要的是,為什麼蘋果公司在發佈新機的 keynote 裡都沒有提到這個協處理器?為什麼它似乎是一個祕密?如果你已經了解了 M1 片上系統(SoC)中的神經網路處理引擎,可能會對蘋果又設計一個矩陣協處理器(AMX)感到困惑。在這之前,我們先來了解一些基本概念。
首先,什麼是矩陣?
矩陣(Matrix)是一個按照長方陣列排列的複數或實數集合,最早來自於方程組的係數及常數所構成的方陣,是高等代數中常見的工具。如果你使用過 Microsoft Excel 等電子表格,則矩陣就是與電子表格非常相似的東西。
關鍵的區別在於,在數學中,這樣的數字表有一個它們支持的操作列表和特定的行為。正如在下圖中展示的,矩陣可以有不同的風格。有這樣一行的矩陣,通常稱為行向量。如果一個是列向量,我們稱之為列向量。關於矩陣相關內容,相信每一個理工科專業的都應該非常了解,因此不做過多的贅述。

我們可以對矩陣進行加、減、縮放和乘積操作。加法很簡單,只需分別添加每個元素,但乘法有點複雜。

這種形式在計算機任務處理中至關重要,矩陣的使用範圍主要包括:
- 圖像處理;
- 機器學習;
- 語音和手寫識別;
- 臉部辨識;
- 壓縮;
- 多媒體:音訊和視訊。
機器學習是這幾年中最熱門的方向。僅僅在 CPU 上增加更多的核心並不能讓這個領域的任務速度足夠快,因為它的要求很高,這需要專門的硬體。瀏覽網際網路、寫電子郵件、文書處理和電子表格等常規任務多年來一直運行得很快。而機器學習,這是我們真正需要提高處理能力的特殊任務。

由於用上了 5 奈米制程,在任何給定的晶片上,蘋果公司都有最大數量的電晶體用於構建不同類型的硬體。他們可以增加更多的 CPU 核心,但這實際上只是加快了常規任務的速度,而這些任務已經運行得足夠快了。因此,人們經常選擇用部分電晶體制造專門的硬體來解決圖像處理、視訊解碼和機器學習。這種專用硬體就是協處理器和加速器。
更多關於協處理器和加速器的討論請參閱:https://erik-engheim.medium.com/apple-m1-foreshadows-risc-v-dd63a62b2562
蘋果的矩陣協處理器和神經網路引擎有何不同?
如果你了解一些關於神經網路引擎的知識,你將會知道它會執行矩陣運算來幫助完成機器學習任務。那麼我們為什麼還需要矩陣協處理器呢?它們是同一種東西嗎?下面我們來解釋一下蘋果的矩陣協處理器與神經引擎的區別,以及我們為什麼需要兩者。

CPU、協處理器和加速器通常可以在共享的資料總線上交換資料。CPU 通常控制記憶體訪問,而專用加速器(例如 GPU)通常具有自己的專用記憶體(如視訊記憶體)。
協處理器和加速器並不相同。英偉達顯示卡中的 GPU 和神經引擎都是加速器的一種。在這兩種情況下,都有特殊的記憶體區域,在該區域 CPU 必須填充要處理的資料,而記憶體的另一部分則填充加速器應執行的指令列表。CPU 設置這種處理非常耗時。需要進行大量協調,填寫資料,然後等待結果。
因此,這隻會在更大的任務中得到回報。對於較小的任務,開銷太高。

與加速器不同,協處理器監視從記憶體讀取到主處理器的指令流。相比之下,加速器不會遵守 CPU 從記憶體中提取的指令。
這就是協處理器優於加速器的地方。協處理器會監視從記憶體 (更具體地說,是快取) 輸入 CPU 的機器程式碼指令流。協處理器是用來對特定指令作出反應的。與此同時,CPU 通常會忽略這些指令,或者幫助協處理器處理這些指令。
我們從中得到的思路是,協處理器執行的指令可以放在常規程式碼中。這與 GPU 不同。如果你做過 GPU 程式設計,則應該知道著色器程序被放置在單獨的記憶體緩衝區中,並且你必須將這些著色器程序顯式傳輸到 GPU。你不能在常規程式碼中放置特定於 GPU 的指令。因此,對於涉及矩陣處理的較小工作負載,AMX 將優於神經引擎。
這樣你需要在微處理器的指令集架構(ISA)中實際定義新的特定的指令。因此,與使用加速器相比,使用協處理器時需要與 CPU 緊密集成。對 ARM 指令集體系架構(ISA)的創建者 ARM 公司來說,長期以來他們一直拒絕向 ISA 中添加自定義指令。
然而,由於客戶的壓力,ARM 公司放寬了要求,並在 2019 年 10 月做出了讓步並宣佈將允許擴展。參考:新指令與標準 Arm 指令交織在一起。為了避免軟體碎片化並保持一致的軟體開發環境,Arm 希望客戶在調用的庫函數中使用自定義指令。
這可能有助於解釋為什麼官方文件中沒有描述 AMX 指令。ARM 期望蘋果將此類指令保存在客戶提供的庫中。
矩陣協處理器與 SIMD 向量引擎有何不同?
很容易把矩陣協處理器和 SIMD 向量引擎混淆起來,目前大多數現代處理器(包括 ARM 處理器)內都有 SIMD 向量引擎。SIMD(Single Instruction, Multiple Data)即一條指令操作多個資料,是 CPU 基本指令集的擴展,主要用於小體量資料的並行化操作。

單指令單資料(SISD)VS 單指令多資料(SIMD)
當你需要對多個元素執行相同的操作時,SIMD 是一種獲得更高性能的方法。這與矩陣運算密切相關。事實上,SIMD 指令,如 ARM 的 Neon 指令或 Intel x86 SSE 或 AVX 等通常用於加速矩陣乘法。
然而,SIMD 向量引擎是微處理器核心的一部分。就像 ALU(算術邏輯單元)和 FPU(浮點單元)是 CPU 的一部分。在微處理器內部有一個指令解碼器,它將拆分一條指令並決定激活哪個功能單元(灰色框)。

在 CPU 內部,ALU、FPU 以及 SIMD 向量引擎(未顯示)作為單獨的部分由指令解碼器激活。協處理器是外部的。
相反,協處理器在微處理器核心的外部。比如最早的協處理器晶片之一:英特爾 8087,該晶片是一種物理上獨立的晶片,旨在加快浮點計算的速度。

英特爾 8087,用於執行浮點運算的早期協處理器之一
對於 8087,你可能會很奇怪,為什麼有人會想通過擁有一個像這樣的單獨晶片來使 CPU 設計複雜化?該晶片必須嗅探從記憶體到 CPU 的資料流,以查看是否有任何浮點指令。
原因很簡單,第一代 PC 中的原始 8086 CPU 包含 29,000 個電晶體。相比之下,8087 要複雜得多,有 45,000 個電晶體。將這兩個晶片結合在一起會非常困難和昂貴。
但隨著製造技術的進步,將浮點計算單元(FPU)放在 CPU 內部並不是問題。因此 FPU 取代了浮點協處理器。
我們還不清楚為什麼 AMX 不是 M1 上 Firestorm 核心的一部分。不管怎樣,它們都在同一個矽晶片上。作為協處理器,CPU 繼續並行運行可能更容易。蘋果可能也喜歡把非標準的 ARM 產品放在 ARM CPU 核心之外。
為什麼 AMX 是一個祕密?
如果蘋果官方檔案中沒有描述 AMX,你是怎麼知道的?這就多虧了開發人員 Dougall Johnson,他對 M1 進行了逆向工程,發現了這個協處理器。這裡描述了他的努力。對於矩陣相關的數學運算,蘋果有一些特殊的庫或框架,如 Accelerate,它由以下部分組成:
- vImage:更高層次的圖像處理,如格式轉換、圖像處理等。
- BLAS:線性代數的一種工業標準(我們稱之為處理矩陣和向量的數學)。
- BNNS:用於運行神經網路和網路訓練。
- vDSP:數字信號處理。傅立葉變換,卷積。這些是在圖像處理或真正包括音訊的任何信號中很重要的數學運算。
- LAPACK:更高層次的線性代數函數,例如用於求解線性方程。
Dougall Johnson 知道這些庫將使用 AMX 協處理器來加快計算速度。因此,他編寫了一些特殊程序來分析和觀察這些程序做了什麼,以發現未記錄的特殊 AMX 機器程式碼指令。
但是為什麼蘋果公司不記錄這些,讓我們直接使用這些指令呢?如前所述,這是 ARM 公司希望避免的。如果自定義指令被廣泛使用,它可能會破壞 ARM 生態系統。
然而更重要的是,這對蘋果來說是一個優勢。通過只允許他們的庫使用這些特殊的指令,蘋果保留了以後從根本上改變這個硬體工作方式的自由。他們可以刪除或添加 AMX 指令。或者他們可以讓神經引擎來完成這項工作。無論哪種方式,它們都使開發人員的工作更容易。開發人員只需要使用加速框架,就可以忽略蘋果具體如何加快矩陣計算的速度。
這是蘋果垂直整合的一大優勢。通過控制硬體和軟體,他們可以利用這些技術。
蘋果的矩陣協處理器有什麼優勢?
Nod Labs 是一家致力於機器互動、智慧和感知的公司,對快速矩陣運算非常感興趣。其研究人員已經為 AMX 性能測試寫了高質量的技術性部落格。
部落格地址:https://nod.ai/comparing-apple-m1-with-amx2-m1-with-neon/
他們所做的是比較使用 AMX 編寫類似程式碼和使用 Neon 指令編寫類似程式碼的性能,後者得到 ARM 的官方支持。Neon 是一種 SIMD 指令。
Nod Labs 發現,使用 AMX,矩陣的運算性能比 Neon 指令快 2 倍。這並不意味著 AMX 在所有方面都更好,但至少在機器學習和高效能運算(HPC)類型的工作中,我們可以預期 AMX 將在競爭中佔據優勢。
原文連結:https://medium.com/swlh/apples-m1-secret-coprocessor-6599492fc1e1