【NEON 】初探
NEON
文章目錄
- NEON
- 1 neon窺探
- 1.1 neon用途
- 1.2 neon處理機(jī)制
- 1.3 neon發(fā)展歷程中的優(yōu)缺點對比
- 1.4 為什么使用neon
- 1.5 Armv7/v8詳細(xì)差異
- 1.6 Register寄存器
- 1.7 指令系統(tǒng)間的關(guān)系與1.3相似
- 2 neon 使用
- 2.1 neon 指令格式
- 2.2 AArch64 NEON 指令語法
- 2.3 NEON 指令
- 3.1 RK3399資料
1 neon窺探
參考資料
1.1 neon用途
NEON 技術(shù)是適用于Arm Cortex-A 系列處理器的高級 SIMD(單指令多數(shù)據(jù))架構(gòu)。它可以加速多媒體和信號處理算法,例如視頻編碼器/解碼器、2D/3D 圖形、游戲、音頻和語音處理、圖像處理、電話和聲音。
1.2 neon處理機(jī)制
NEON 指令執(zhí)行“Packed SIMD”處理:
- 寄存器被視為相同數(shù)據(jù)類型元素的向量
- 數(shù)據(jù)類型可以是: ARM 32 位平臺上的有符號/無符號 8 位、16 位、32 位、64 位、單精度浮點、單精度浮點和雙精度浮點指向 ARM 64 位平臺。
- 指令在所有通道中執(zhí)行相同的操作
1.3 neon發(fā)展歷程中的優(yōu)缺點對比
Armv6:
- 在 32 位通用 ARM 寄存器上運(yùn)行
- 8 位/16 位整數(shù)
- 每條指令 2x16 位/4x8 位操作
Armv7-A:
- 獨(dú)立的寄存器組,32x64 位 NEON 寄存器
- 8/16/32/64 位整數(shù)
- 單精度浮點數(shù)
- 每條指令最多 16x8 位操作
Armv8-A AArch64:
- 獨(dú)立的寄存器組,32x128 位 NEON 寄存器
- 8/16/32/64 位整數(shù)
- 單精度浮點數(shù)
- 雙精度浮點,兩者都符合IEEE
- 每條指令最多 16x8 位操作
1.4 為什么使用neon
- 對整數(shù)和浮點運(yùn)算的支持確保了廣泛的應(yīng)用程序的適應(yīng)性,從編解碼器到高性能計算再到 3D 圖形。
- 與 Arm 處理器的緊密耦合提供單一指令流和統(tǒng)一的內(nèi)存視圖,以更簡單的工具流程呈現(xiàn)單一開發(fā)平臺目標(biāo)
1.5 Armv7/v8詳細(xì)差異
Armv8-A 是對 Arm 架構(gòu)的根本性改變。它支持稱為“AArch64”的 64 位執(zhí)行狀態(tài)和新的 64 位指令集“A64”。為了提供與 Armv7-A(32 位架構(gòu))指令集的兼容性,提供了 Armv8-A“AArch32”的 32 位變體。大多數(shù)現(xiàn)有的 Armv7-A 代碼都可以在 Armv8-A 的 AArch32 執(zhí)行狀態(tài)下運(yùn)行。
本節(jié)比較了 Armv7-A 和 Armv8-A 架構(gòu)的 NEON 相關(guān)特性。另外,NEON編程中經(jīng)常用到的通用Arm寄存器和Arm指令也會被提及。但是,重點仍然是 NEON 技術(shù)。
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 指令系統(tǒng)間的關(guān)系與1.3相似
下圖說明了 Armv7-A、Armv8-A AArch32 和 Armv8-A AArch64 指令集之間的關(guān)系。
Armv8-A AArch32指令集由A32(Arm指令集,32位定長指令集)和T32(Thumb指令集,16位定長指令集;Thumb2指令集,16或32位長指令集)組成指令系統(tǒng))。它是 Armv7-A 指令集的超集,因此它保留了運(yùn)行現(xiàn)有軟件所需的向后兼容性。對 A32 和 T32 進(jìn)行了一些添加以保持與 A64 指令集的對齊,包括 NEON 除法和加密擴(kuò)展指令。還支持 NEON 雙精度浮點(符合 IEEE)。
2 neon 使用
2.1 neon 指令格式
Armv7-A/AArch32 指令語法
Armv7-A/AAArch32 NEON 指令(與 VFP 一樣)的所有助記符都以字母“V”開頭。指令通常能夠?qū)Σ煌臄?shù)據(jù)類型進(jìn)行操作,這在指令編碼中指定。尺寸用指令的后綴表示。元素的數(shù)量由指定的寄存器大小和操作的數(shù)據(jù)類型指示。指令具有以下一般格式:
指令具有以下一般格式:
V{<mod>}<op>{<shape>}{<cond>}{.<dt>}{<dest>}, src1, src2
其中:
== mod 修飾符
Q:指令采用飽和算法,使結(jié)果在指定數(shù)據(jù)類型范圍內(nèi)飽和,如VQABS、VQSHL等。
H:指令將結(jié)果減半。它通過右移一位(實際上是除以二并截斷)來實現(xiàn),例如 VHADD、VHSUB。
D:指令將結(jié)果加倍,如VQDMULL、VQDMLAL、VQDMLSL和VQ{R}DMULH
R:指令會對結(jié)果進(jìn)行四舍五入,相當(dāng)于在截斷前給結(jié)果加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.代表可選參數(shù)。
Neon 數(shù)據(jù)處理指令通常有 Normal、Long、Wide 和 Narrow 變體。(注:vector對應(yīng)32bit)
2.2 AArch64 NEON 指令語法
在 AArch64 執(zhí)行狀態(tài)下,NEON 指令的語法發(fā)生了變化。它可以描述如下:
{<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 位向量相加,產(chǎn)生一個 64 位向量結(jié)果,作為 NEON 寄存器的高 64 位部分存儲。
SADDL2:將NEON寄存器的兩個高64位向量相加,產(chǎn)生128位向量結(jié)果。
<T> - 數(shù)據(jù)類型,8B/16B/4H/8H/2S/4S/2D。
B 代表字節(jié)(8 位)。H 代表半字(16 位)。S 代表字(32 位)。D 代表一個雙字(64 位)。
將兩個 128 位向量相加,產(chǎn)生一個 64 位向量結(jié)果,作為 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
總結(jié)
- 上一篇: adb调试命令小结
- 下一篇: valgrind-yyds——memch