【NEON 】初探
NEON
文章目錄
- NEON
- 1 neon窺探
- 1.1 neon用途
- 1.2 neon處理機制
- 1.3 neon發展歷程中的優缺點對比
- 1.4 為什么使用neon
- 1.5 Armv7/v8詳細差異
- 1.6 Register寄存器
- 1.7 指令系統間的關系與1.3相似
- 2 neon 使用
- 2.1 neon 指令格式
- 2.2 AArch64 NEON 指令語法
- 2.3 NEON 指令
- 3.1 RK3399資料
1 neon窺探
參考資料
1.1 neon用途
NEON 技術是適用于Arm Cortex-A 系列處理器的高級 SIMD(單指令多數據)架構。它可以加速多媒體和信號處理算法,例如視頻編碼器/解碼器、2D/3D 圖形、游戲、音頻和語音處理、圖像處理、電話和聲音。
1.2 neon處理機制
NEON 指令執行“Packed SIMD”處理:
- 寄存器被視為相同數據類型元素的向量
- 數據類型可以是: ARM 32 位平臺上的有符號/無符號 8 位、16 位、32 位、64 位、單精度浮點、單精度浮點和雙精度浮點指向 ARM 64 位平臺。
- 指令在所有通道中執行相同的操作
1.3 neon發展歷程中的優缺點對比
Armv6:
- 在 32 位通用 ARM 寄存器上運行
- 8 位/16 位整數
- 每條指令 2x16 位/4x8 位操作
Armv7-A:
- 獨立的寄存器組,32x64 位 NEON 寄存器
- 8/16/32/64 位整數
- 單精度浮點數
- 每條指令最多 16x8 位操作
Armv8-A AArch64:
- 獨立的寄存器組,32x128 位 NEON 寄存器
- 8/16/32/64 位整數
- 單精度浮點數
- 雙精度浮點,兩者都符合IEEE
- 每條指令最多 16x8 位操作
1.4 為什么使用neon
- 對整數和浮點運算的支持確保了廣泛的應用程序的適應性,從編解碼器到高性能計算再到 3D 圖形。
- 與 Arm 處理器的緊密耦合提供單一指令流和統一的內存視圖,以更簡單的工具流程呈現單一開發平臺目標
1.5 Armv7/v8詳細差異
Armv8-A 是對 Arm 架構的根本性改變。它支持稱為“AArch64”的 64 位執行狀態和新的 64 位指令集“A64”。為了提供與 Armv7-A(32 位架構)指令集的兼容性,提供了 Armv8-A“AArch32”的 32 位變體。大多數現有的 Armv7-A 代碼都可以在 Armv8-A 的 AArch32 執行狀態下運行。
本節比較了 Armv7-A 和 Armv8-A 架構的 NEON 相關特性。另外,NEON編程中經常用到的通用Arm寄存器和Arm指令也會被提及。但是,重點仍然是 NEON 技術。
1.6 Register寄存器
Armv7-A 和 AArch32 具有相同的通用 Arm 寄存器——16 x 32 位通用 Arm 寄存器 (R0-R15)。
Armv7-A 和 AArch32 具有 32 x 64 位 NEON 寄存器 (D0-D31)。這些寄存器也可以視為 16x128 位寄存器 (Q0-Q15)。每個 Q0-Q15 寄存器映射到一對 D 寄存器,如下圖所示。
相比之下,AArch64 有 31 個 64 位通用 Arm 寄存器和 1 個具有不同名稱的特殊寄存器,具體取決于使用它的上下文。這些寄存器可以被視為 31 x 64 位寄存器 (X0-X30) 或 31 x 32 位寄存器 (W0-W30)。
AArch64 有 32 x 128 位 NEON 寄存器 (V0-V31)。這些寄存器也可以被視為 32 位 Sn 寄存器或 64 位 Dn 寄存器。
1.7 指令系統間的關系與1.3相似
下圖說明了 Armv7-A、Armv8-A AArch32 和 Armv8-A AArch64 指令集之間的關系。
Armv8-A AArch32指令集由A32(Arm指令集,32位定長指令集)和T32(Thumb指令集,16位定長指令集;Thumb2指令集,16或32位長指令集)組成指令系統)。它是 Armv7-A 指令集的超集,因此它保留了運行現有軟件所需的向后兼容性。對 A32 和 T32 進行了一些添加以保持與 A64 指令集的對齊,包括 NEON 除法和加密擴展指令。還支持 NEON 雙精度浮點(符合 IEEE)。
2 neon 使用
2.1 neon 指令格式
Armv7-A/AArch32 指令語法
Armv7-A/AAArch32 NEON 指令(與 VFP 一樣)的所有助記符都以字母“V”開頭。指令通常能夠對不同的數據類型進行操作,這在指令編碼中指定。尺寸用指令的后綴表示。元素的數量由指定的寄存器大小和操作的數據類型指示。指令具有以下一般格式:
指令具有以下一般格式:
V{<mod>}<op>{<shape>}{<cond>}{.<dt>}{<dest>}, src1, src2
其中:
== mod 修飾符
Q:指令采用飽和算法,使結果在指定數據類型范圍內飽和,如VQABS、VQSHL等。
H:指令將結果減半。它通過右移一位(實際上是除以二并截斷)來實現,例如 VHADD、VHSUB。
D:指令將結果加倍,如VQDMULL、VQDMLAL、VQDMLSL和VQ{R}DMULH
R:指令會對結果進行四舍五入,相當于在截斷前給結果加0.5,如VRHADD、VRSHR。
op - 操作(例如,ADD、SUB、MUL)。==
<cond> - Condition, used with IT instruction<.dt> - Data type, such as s8, u8, f32 etc.<dest> - Destination<src1> - Source operand 1<src2> - Source operand 2
注: {} represents and optional parameter.代表可選參數。
Neon 數據處理指令通常有 Normal、Long、Wide 和 Narrow 變體。(注:vector對應32bit)
2.2 AArch64 NEON 指令語法
在 AArch64 執行狀態下,NEON 指令的語法發生了變化。它可以描述如下:
{<prefix>}<op>{<suffix>} Vd.<T>, Vn.<T>, Vm.<T>
其中:
<prefix> - prefix, such as using S/U/F/P to represent signed/unsigned/float/bool data type.<op> – operation, such as ADD, AND etc.<suffix> - suffixP: “pairwise” operations, such as ADDP.
V: the new reduction (across-all-lanes) operations, such as FMAXV.
2:new widening/narrowing “second part” instructions, such as ADDHN2, SADDL2.
ADDHN2:將兩個 128 位向量相加,產生一個 64 位向量結果,作為 NEON 寄存器的高 64 位部分存儲。
SADDL2:將NEON寄存器的兩個高64位向量相加,產生128位向量結果。
<T> - 數據類型,8B/16B/4H/8H/2S/4S/2D。
B 代表字節(8 位)。H 代表半字(16 位)。S 代表字(32 位)。D 代表一個雙字(64 位)。
將兩個 128 位向量相加,產生一個 64 位向量結果,作為 NEON 寄存器的高 64 位部分存儲。
例如:
UADDLP V0.8H, V0.16BFADD V0.4S, V0.4S, V0.4S
2.3 NEON 指令
3.1 RK3399資料
2大核A57 主頻G1.8 ,4核A53 主頻G1.4
https://www.forlinx.com/product/rk3399-99.html
總結
- 上一篇: adb调试命令小结
- 下一篇: valgrind-yyds——memch