Helium 技術(shù)講堂 | 為何不直接采用 Neon?
Arm Helium 技術(shù)誕生的由來(lái)
本文引用地址:http://dyxdggzs.com/article/202406/460302.htm為何不直接采用 Neon?
作者:Arm 架構與技術(shù)部 M 系列首席架構師兼研究員 Thomas Grocutt
經(jīng)過(guò) Arm 研究團隊多年的不懈努力, Arm 于 2019 年推出了適用于 Armv8?M 架構的 Arm Cortex-M 矢量擴展技術(shù) (MVE)——Arm Helium 技術(shù)。 起初,當我們面臨 Cortex?M 處理器的數字信號處理 (DSP) 性能亟待提升的需求時(shí),我們首先想到的是采用現有的 Neon? 技術(shù)。然而,面對典型的 Cortex?M 應用的面積限制條件下又需要支持多個(gè)性能的需求,意味著(zhù)我們仍需從頭開(kāi)始。作為一種較輕的惰性氣體,以氦氣 (Helium) 作為研究項目的名稱(chēng)似乎再合適不過(guò)了。該研究項目主要針對中端處理器,旨在實(shí)現數據路徑寬度增加兩倍的情況下將性能提高四倍,而這正與氦氣的原子量 (4) 和原子序數 (2) 不謀而合。最終,在許多數字信號處理 (DSP) 和機器學(xué)習 (ML) 內核上,我們成功地實(shí)現了提升四倍的目標。毋庸置疑, “Helium” 已經(jīng)深入人心,成為 Cortex-M 處理器系列 MVE 的品牌名。
要想打造具備良好 DSP 性能的處理器,主要關(guān)鍵在于可為其提供足夠的數據處理帶寬。 在 Cortex?A 處理器上,128 位 Neon 負載可以輕松地從數據緩存中直接提取。但是,Cortex?M 處理器通常沒(méi)有緩存,而是使用低延遲靜態(tài)隨機存取存儲器 (SRAM) 作為主內存。對于許多系統來(lái)說(shuō),無(wú)法將 SRAM 路徑(通常只有 32 位)拓寬到 128 位,因此導致面臨內存操作停滯長(cháng)達四個(gè)周期的可能性。同樣,乘加 (MAC) 指令中使用的乘法器需要很大的面積,在小型 Cortex?M 處理器上使用四個(gè) 32 位乘法器是不切實(shí)際的。就面積限制層面而言,最小的 Cortex-M 處理器與能夠亂序執行指令且功能強大的 Cortex?A 處理器的大小可能相差幾個(gè)數量級。 因此,在創(chuàng )建 M 系列架構時(shí),我們必須認真考慮充分利用每一個(gè) gate。 為了充分利用現有硬件,我們需要確保高成本資源(如通往內存的連接和乘法器)在每個(gè)周期都保持同時(shí)繁忙的狀態(tài)。在高性能處理器(如 Cortex?M7)上,可以通過(guò)矢量 MAC 雙發(fā)射來(lái)達成這一目標。此外,還有一個(gè)重要的目標,即在一系列不同的產(chǎn)品上提高 DSP 性能,而不僅局限于高端產(chǎn)品上。想要解決以上這些問(wèn)題,需要借鑒參考幾十年前的矢量鏈理念中的一些技術(shù)。
上圖顯示了在四個(gè)時(shí)鐘周期內交替執行的矢量負載 (VLDR) 和矢量 MAC (VMLA) 指令序列。這需要 128 位寬的內存帶寬和四個(gè) MAC 塊,并且它們有一半時(shí)間處于空閑狀態(tài)??梢钥吹?,每條 128 位寬的指令被分成大小相等的四個(gè)片段,MVE 架構稱(chēng)之為“節拍”(標為 A 至 D)。無(wú)論元素大小如何,這些節拍始終是 32 位計算值,因此一個(gè)節拍可以包含一個(gè) 32 位 MAC,或四個(gè) 8 位 MAC。由于負載和 MAC 硬件是分開(kāi)的,這些節拍的執行可以重疊,如下圖所示。

即使 VLDR 加載的值被隨后的 VMLA 使用,指令仍可以重疊。這是因為 VMLA 的節拍 A 只依賴(lài)于上一個(gè)周期發(fā)生的 VLDR 的節拍 A,因此節拍 A 和 B 與節拍 C 和 D 便會(huì )自然重疊。在這個(gè)例子中,我們可以獲得與 128 位數據帶寬處理器相同的性能,但硬件數量只有后者的一半。 “節拍式”執行的概念可以高效地實(shí)施多個(gè)性能點(diǎn)。 例如,下圖顯示了只有 32 位數據帶寬的處理器如何處理相同的指令。這一點(diǎn)充滿(mǎn)吸引力, 因為它能使單發(fā)射標量處理器的性能翻倍(在八個(gè)周期內對八個(gè) 32 位值加載和執行 MAC),但卻沒(méi)有雙發(fā)射標量指令那樣的面積和功耗需求。

MVE 支持擴展到每周期四拍的實(shí)現方式,此時(shí)節拍式執行將簡(jiǎn)化為更傳統的 SIMD 方法。這有助于在高性能處理器上保持可控的實(shí)現復雜度。
節拍式執行聽(tīng)起來(lái)很不錯,但也會(huì )給架構的其他部分帶來(lái)一些值得關(guān)注的挑戰。
由于多條部分執行的指令可以同時(shí)運行,因此中斷和故障處理可能會(huì )變得相當復雜。 例如,如果上圖中 VLDR 的節拍 D 出現故障,通常情況下,實(shí)施必須回滾 VMLA 的節拍 A 在上一周期對寄存器文件的寫(xiě)入。我們的理念是讓每個(gè) gate 都物盡其用,而在回滾的情況下緩沖舊數據值與這一理念相悖。為了避免這種情況,處理器會(huì )針對異常情況存儲一個(gè)特殊的 ECI 值,用于指示已經(jīng)執行了后續指令的哪些節拍。在異常返回時(shí),處理器便以此來(lái)確定要跳過(guò)哪些節拍。能夠快速跳出指令而無(wú)需回滾或等待指令完成,基于此保持 Cortex-M 具備的快速和確定性中斷處理能力。
如果指令會(huì )跨越節拍邊界,我們又會(huì )遇到時(shí)間跨越問(wèn)題。 這種交叉行為通常出現在拓寬/縮窄運算中。Neon 架構中的 VMLAL 指令就是一個(gè)典型的例子,它可以將 32 位值矢量乘加到 64 位累加器中。遺憾的是,為了保持乘法器輸出的完整范圍,通常需要進(jìn)行這類(lèi)拓寬運算。MVE 使用通用的 “R” 寄存器文件來(lái)處理累加器,從而解決了這一問(wèn)題。此外,這樣還減少了對矢量寄存器的寄存壓力,使 MVE 只需使用 Neon 架構中一半的矢量寄存器就能獲得良好的性能。在矢量架構中,通常不會(huì )像 MVE 一樣廣泛使用通用的寄存器文件,因為寄存器文件往往與矢量單元相距甚遠。在亂序執行指令的高性能處理器上尤為如此,因為物理距離過(guò)大會(huì )限制性能。不過(guò),正因如此,我們恰恰能夠將典型 Cortex?M 處理器的較小規模特性轉化為我們的優(yōu)勢。
為確保重疊執行達到良好的平衡且無(wú)停滯,每條指令都應嚴格描述 128 位的工作,不能多也不能少。 由此也會(huì )帶來(lái)一些挑戰。
憑借研究員們辛勤不懈的努力,以及充分參考架構書(shū)籍中所涉的所有內容,MVE 成功地將一些非??量痰墓?、面積和中斷延遲限制轉化為優(yōu)勢。
我們將在下一篇 Helium 技術(shù)文章中深入探討一些復雜而又有趣的交錯加載/存儲指令。持續關(guān)注 Helium 技術(shù)講堂,我們下期再見(jiàn)!
評論