一.介紹
ARM NEON 是適用於ARM Cortex-A和Cortex-R52系列處理器的一種128位SIMD(single instruction multiple data, 單指令多數據)擴展結構。
ARM CPU最開始只有普通的寄存器,可以進行基本數據類型的基本運算。自ARMv5開始引入了VFP(Vector Floating Point)指令,該指令用於向量化加速浮點運算。自ARMv7開始正式引入NEON指令,NEON性能遠超VFP,因此VFP指令被廢棄。類似於Intel CPU下的MMX/SSE/AVX/FMA指令,ARM CPU的NEON指令同樣是通過向量化來進行速度優化。使用場景包含但不侷限於:
- 靈活的視頻轉碼(Flexible video transcoding)
- 聲音識別,先進的語音處理(Speech Recognition,Advanced audio processing)
- 視頻捕獲增強(Enhanced captured video)
- 計算機視覺AR/VR(computer vision)
- 機器學習及深度學習(Machine and deep learning)
- 遊戲及先進的人機交互界面(Gaming,advanced user interface)
二.SIMD & SISD介紹
關於SIMD(單指令多數據)和SISD(單指令單數據)。以加法指令爲例,單指令單數據(SISD)的CPU對加法指令譯碼後,執行部件先訪問內存,取得第一個操作數;之後再一次訪問內存,取得第二個操作數;隨後才能進行求和運算。而在SIMD型的CPU中,指令譯碼後幾個執行部件同時訪問內存,一次性獲得所有操作數進行運算。這個特點使SIMD特別適合於多媒體應用等數據密集型運算:
關於SISD,SIMD的詳細介紹將在neon programer中介紹。
三.neon技術介紹
- NEON技術是從ARMv7-A和ARMv7-R指令集引入的,目前已經擴展到了ARMv8-A和ARMv8-R指令集。
- NEON技術旨在通過加速多媒體(video/audio)編解碼,用戶界面,2D/3D圖形及遊戲來提高人對多媒體的體驗度。
- NEON也可以通過加速信號處理算法和函數來加快應用程序,比如音頻和視頻處理,語音和麪部識別,計算機視覺和深度學習。
NEON是一個(packed)SIMD架構,NEON寄存器被視爲相同數據類型的向量元,並且支持多種數據類型的一種技術。 下表描述了不同架構下所支持的數據類型:
ARMv7-A/R | ARMv8-A/R | ARMv8-A | |
AArch32 | AArch64 | ||
Floatin-point | 32-bit | 16-bit*/32-bit | 16-bit*/32-bit/64-bit |
Interger | 8-bit/16-bit/32-bit | 8-bit/16-bit/32-bit/64-bit | 8-bit/16-bit/32-bit/64-bit |
NEON指令在所有向量通道上執行相同操作。執行操作數是由數據類型來決定的,Neon指令遵循如下的規則:
- 16x8-bit, 8x16-bit, 4x32-bit, 2x64-bit integer operations
- 8x16-bit*, 4x32-bit, 2x64-bit** floating-point operations
在 Neon 技術上的實現還可以支持多個並行指令:
- *Only in Armv8.2-A
- **Only in Armv8-A/R
四.怎樣使用NEON
有多種方式來使用NEON,其中包含了以使用Neon的庫文件,編譯器的自動矢量化(auto-vectorization),Neon內部函數(Neon intrinsics)和Neon彙編代碼(neon assembly code)。具體詳細信息參考:Neon Programmer’s Guide Version: 1.0
五.簡單使用介紹
5.1- library
使用NEON最簡單的方式就是使用已經包含了NEON的開源庫.ARM計算庫用於機器學習和計算機視覺,ARM計算庫是基於ARM CPU和GPU架構且針對圖像處理,計算機視覺和機器學習的低層次的函數集合。更多信息可參考:https://developer.arm.com/technologies/compute-library
Ne10是一個基於C的開源庫,由ARM託管在github上,包含了一系列在ARM上重度優化的最常用的增強處理過程。Ne10是有幾個小型的庫構成的模塊化的開源庫。包含:
數學功能 | 信號處理功能 | 圖像處理功能 | 物理功能 |
Vector Add | Floating & Fixed Point | Image Resize | Collision Detection |
Matrix Add | Complex-to-Complex FFT | Image Rotate | |
Vector Subtract | Floating & Fixed Point | ||
Vector Subtract From | Real-to-Complex FFT | ||
Matrix Subtract | FIR Filters | ||
Vector Multiply | FIR Decimator | ||
Vector Multiply-Accumulate | FIR Interpolator | ||
Matrix Multiply | FIR Lattice Filters | ||
Matrix Vector Multiply | FIR Sparse Filters | ||
Vector Divide | IIR Lattice Filters | ||
Vector Set | |||
Vector Length | |||
Vector Normalize | |||
Vector Absolute Value | |||
Vector Dot Product | |||
Vector Cross Product | |||
Matrix Determinant | |||
Matrix Inverse | |||
Matrix Transpose | |||
Matrix Identity |
- Libyuv 是一個包含YUV數據的轉換和擴展功能的開源庫.
- Skia 是一個開源的2D圖形庫,用作谷歌Chrome和Chrome OS、Android、Mozilla Firefox和Firefox OS以及其他許多產品的圖形引擎
5.2自動矢量化(AutoVectorization)
自動矢量化功能由ARM編譯器支持,它們自動利用neon功能.特性支持以下:
5.3-Compiler Intrinsics
neon intrinsics是編譯器用適當的neon指令或neon指令序列替換的函數調用。內部函數提供的控制幾乎和編寫彙編語言一樣多,但是把寄存器的分配留給編譯器,這樣開發人員就可以專注於算法了。它還可以執行指令調度以刪除指定目標處理器的管道暫停。這會導致比使用彙編語言更易於維護的源代碼。Neon內部函數由ARM編譯器、GCC和LLVM支持。具體參考:https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics
- Neon intrinsic example
#include <arm_neon.h>
uint32x4_t double_elements(uint32x4_t input)
{
return(vaddq_u32(input, input));
}
5.4-Assembly code
對於非常高的性能,手工編碼的Neon彙編程序是經驗豐富的程序員的最佳方法。GNU彙編程序(GAS)和ARM編譯器工具鏈彙編程序(ARMASM)都支持Neno指令的彙編。
六.tools
ARM DS-5 Development Studio是基於ARM平臺提供的C/C++軟件開發的端到端套件工具。DS-5完全支持Neon架構的編程和調試。
DS-5 Debugger提供了Neon指令完整調試功能,以及其體系結構寄存器的可視化。DS-5調試器支持所有ARM體系結構配置文件和處理器。
7.Neon ecosystem
Neon在如下表格所示的領域內有廣泛的使用。其中包含了很多跨平臺的開源項目:
Video codecs: | Audio codecs: | Voice and speech codecs: | Audio enhancement algorithms: | Computer Vision | Machine and deep learning |
VP9 OTT encoder, VP9 Consumer encoder/decoder | MP3 encoder/decoder | G.711 | Echo cancellation | Canny Edge detection | On-device object recognition |
H.264 (AVC) encoder/decoder | MPEG-2 layer I & II encoder/decoder | G.722, G.722.1, G.722.2 | Noise Reduction | Harris Corner | On-device scene recognition |
MPEG4 SP/ASP encoder/decoder | MPEG-1 layer III audio encoder | G.723.1 | Beam Forming | ORB | Human pose recognition |
MPEG2 decoder |
MPEG-1 layer III audio encoder/decoder |
G.726 | Comfort Noise | Convolution filter | Defect detection |
H.263 decoder | HE-AACv1, v2 encoder/decoder | G.727 | AudioZoom | Erosion/Dilation | |
WMA Standard encoder/decoder | G.728 | Equalization | Face detection | ||
WMA Pro, WMA Lossless decoder | G.729, G.279A, G.729B | Wind noise reduction | Pedestrian detection | ||
SBC Bluetooth encoder/decoder | G.729AB | Automatic Gain Control | Fast9/Fast12 corner detection | ||
OggVorbis encoder/decoder | AMR Narrowband, Wideband, Wideband+ | Voice Activity Detection | Object tracking | ||
FLAC encoder/decoder | GSM-HR, GSM-ER, GSM-EFR | Key word spotting | Lane departure | ||
Dolby® Digital AC-3 encoder/decoder | Opus | Voice trigger | Connected components | ||
Dolby® Digital eAC-3 decoder | iLBC | Voice biometrics | |||
Dolby® MS10/MS11 Multistream | SILK | Speaker verification | |||
Dolby® Digital Plus 5.1/7.1 Consumer decoder | SPEEX | ||||
Dolby® Digital 5.1 Creator Consumer encoder | MELPe | ||||
Dolby® Pro Logic I & II encoder/decoder | |||||
iSAC encoder/decoder | |||||
CELT encoder/decoder | |||||
DTS core encoder/decoder | |||||
DAB+ encoder/decoder | |||||
Dolby® Mobile encoder/decoder | |||||
Dolby® TrueHD consumer decoder | |||||
Dolby® UDC encoder/decoder |
更多的eco-system合作參考:https://developer.arm.com/architectures/instruction-sets/dsp-extensions/arm-dsp-ecosystem-partners
8.Resources
8.1 video
網站:Taming Armv8 Neon: from theory to benchmark results
8.2 Blogs
- Coding for Neon - Part 1: Load and Stores
- Coding for Neon - Part 2: Dealing With Leftovers
- Coding for Neon - Part 3: Matrix Multiplication
8.3 Arm Compilers
8.4 Software optimization Guides
ARM爲某些處理器發佈軟件優化指南。這些指南提供有關管道、指令性能特徵和特殊性能考慮的高級信息。這些信息對使用Neon的程序員特別有用。
- Arm Cortex-A55 Software Optimization Guide
- Arm Cortex-A57 Software Optimization Guide
- Arm Cortex-A72 Software Optimization Guide
- Arm Cortex-A75 Software Optimization Guide