- Arm Helium技術指南:Cortex-M系列處理器的矢量運算擴展
- (英)喬恩·馬什
- 2362字
- 2024-04-25 19:59:13
1.3 對比其他Arm SIMD/DSP特性
Arm架構擁有超過30年的持續演進歷史,在此期間,SIMD、矢量運算和DSP等運算方法被運用被在許多特性和擴展里。這里將簡要回顧一下這些特性和擴展并展示Helium如何嵌入整個框圖中。
在2004年,Arm Cortex-A8 CPU是第一款包含了Armv7-A先進SIMD擴展屬性(即人們熟悉的Arm商標Neon)的CPU。添加SIMD擴展的主要目的是加速在CPU上面運行的媒體處理算法。在Armv8-A系列中,隨著架構遷移到64位(AArch64)后,Neon增加了許多特性,其中包含完整的IEEE雙精度浮點、64位整型運算以及更多的寄存器組(32個128位矢量寄存器)。
Cortex-A CPU通常要比本書中介紹的Cortex-M CPU大好幾個數量級(就硅芯片面積和門數而言)。Cortex-A CPU通常配有很寬又很快的總線接口來訪問緩存,這些接口允許在單個周期內一次讀(或寫)128位的數據。相比而言,Cortex-M處理器通常不會配有緩存,而且可能將數據存儲在芯片內的靜態隨機存儲器(Static RAM,SRAM)中,并且只有32位總線可用。此外,乘法器電路占用了相對較大的芯片面積和功耗/能耗。為了能夠高效使用內存數據路徑和乘法器,應該設計架構使得這兩個模塊盡可能頻繁地被使用。這也就意味著簡單地將Neon添加到Cortex-M處理器中并不是最優選擇。
為了能在很小的處理器中獲得高效的信號處理性能,并達到一定的性能點,在最初設計Helium時就考慮到了這些約束條件。它提供了許多新的架構特性來支持以前不太可能在Cortex-M設備上運行的應用程序。然而,正如我們所看到的一樣,Helium和Neon存在許多共同特征。
1.3.1 Helium對比Neon
Neon是A系列處理器的架構擴展,其中包括Arm Cortex-A和Neoverse,它們都提供了高性能的SIMD能力。Helium和Neon有許多相似的地方,例如,Helium和Neon均使用FPU中的寄存器作為矢量寄存器,兩者均使用128位矢量并且許多矢量處理指令也是這兩種架構共用的。
然而,Helium是一種針對小型處理器實現高效信號處理性能的全新設計。它提供了許多專門針對嵌入式用例的新架構特性,因為它針對芯片面積(成本)和功耗進行了優化,所以賦予了M系列架構類似Neon的能力(通過Cortex-A的SIMD指令)。
優化后的Helium可以有效利用較小的Cortex-M內核中的所有可用硬件。它的矢量寄存器數量較少,一些操作可以同時使用矢量寄存器以及來自整型內核中標準的寄存器組R0~R14的標量值。Neon也能夠使用標量值來執行矢量運算,但標量值使用的是FPU寄存器組。本書后面介紹原語函數時將會提到Helium原語及Neon原語均使用'_n_'修飾符來修飾帶有標量值的矢量運算。
Helium支持半精度浮點(FP16)數據類型的運算,但并非所有Neon都支持FP16(Armv8.2-A架構為最新的Cortex-A處理器引入了FP16)。此外,Helium還具有其他特性,包括離散-聚合內存訪存、支持復數運算、循環預測、通道預測以及許多額外的標量和矢量指令。
表1-1中總結了兩個指令集之間的主要異同點。(Armv7-A和Armv8-A的Neon在寄存器數量和其他功能方面存在一些差異。)
表1-1 Helium對比Neon

Neon有一些基于微架構的復雜指令(例如,計算平方根的VSQRT指令),而對于Helium而言,支持這些復雜指令需要的硅片更大。其他不支持的指令包括VBIT、VCNT、VRECP、VSWP、VTBL、VTRN以及VZIP,但Helium允許更高效地模仿這些指令操作。例如,寄存器中的數據排列可以通過離散-聚合的方式實現,迭代的牛頓-拉弗森方法可用于快速得到矢量平方根/倒數。
1.3.2 Helium對比可伸縮矢量擴展
2016年,Arm推出了適用于Armv8-A架構的可伸縮矢量擴展(Scalable Vector Extension,SVE)。這顯著提升了在AArch64(64位)執行狀態下架構的矢量處理能力。硬件實現可以支持的矢量長度從128位擴展到2048位。SVE是對Neon的補充(不是替代品),它主要針對高性能計算(High Performance Computing,HPC)科學工作負載的場景。量子物理、天文學、氣候科學、流體動力學和藥物研究等領域的應用均可以利用極其強大的計算系統。SVE增加了許多特性,它們允許矢量化的編譯器在并行化現有代碼方面做得更好。
SVE允許CPU設計人員選擇矢量長度,每個矢量寄存器的長度可以從128位到2048位不等。SVE支持矢量長度待定(Vector-Length Agnostic,VLA)的編程模型,該模型可適配為可用的矢量長度,以便用戶可以為SVE一次性編譯代碼,然后在不同性能點的實現上運行它。
顯然,超級計算機相對于Helium應用場景下的嵌入式系統有非常不同的需求,但Helium和SVE有幾個共同點,包括:
? 聚合加載和離散存儲。
? 按通道預測。這允許對復雜的控制代碼進行矢量化,并減少循環頭部和尾部的串行化。
? 預測驅動的循環控制和管理。這同樣減少了矢量化開銷。
1.3.3 Helium對比Cortex-M的DSP特性
實現架構Armv7-M(或更高版本)的Cortex-M處理器包括一組SIMD指令集。這使它們能夠在某些應用中取代獨立運行的DSP。
Cortex-M4、Cortex-M7、Cortex-M33和Cortex-M35P處理器提供對8位或16位整數進行操作的SIMD指令。這類指令利用CPU中的標準寄存器組,不像Helium,它使用一組單獨的8個128位寄存器。這些標準整型內核寄存器(R0、R1等)均為32位寬,但SIMD指令對32位寄存器中的2個16位值或4個8位值進行操作。這意味著每條指令最多有4個操作(相比之下,Helium則有16個)。
正如我們將在本書中看到的,8位或16位數據操作對于處理音頻或視頻數據很有用,它們可能不需要完整的32位精度。Armv7-M中的SIMD指令針對特定的算法,不像Helium是高度正交的并且是一個很好的編譯器目標。可以使用這些處理器上的可選FPU來加速浮點運算,但這并不提供SIMD或矢量運算。表1-2中總結了這些差異。
表1-2 Helium對比Armv7-M的SIMD

1.3.4 Helium對比專用DSP
許多當前系統使用獨立的可編程DSP模塊。在詳細了解Helium之前,有必要介紹一下DSP的主要特性。DSP通常設計為能夠實現計算和內存訪問的并行執行(這可能需要哈佛式的存儲器接口,將之連接到單獨的指令內存和數據內存)。它們通常提供單周期乘加(Multiply-Accumulate,MAC)指令、零開銷循環、分數和飽和運算、循環緩沖區(或循環內存尋址模式)以及具有一個或多個“保護位”的累加器。
“保護位”的概念可能并不為所有讀者所熟悉。在信號處理和定點運算中,它們用于避免累加時溢出。
既包含CPU又包含DSP的系統具有獨立運行各個模塊的優勢。通過為DSP子系統提供最大的數據吞吐量,可以優化性能和功耗。但是,DSP通常需要更專業的編程技能,并且通常需要與處理器匹配的單獨工具鏈。每個DSP系列都有自己的特性,因此當從一個DSP系統移動到另一個DSP系統時,需要重寫大量不可移植的代碼。