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指令同样是通过向量化来进行速度优化。使用场景包含但不局限于:
关于SIMD(单指令多数据)和SISD(单指令单数据)。以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使SIMD特别适合于多媒体应用等数据密集型运算:
关于SISD,SIMD的详细介绍将在neon programer中介绍。
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指令遵循如下的规则:
在 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 |
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
#include
uint32x4_t double_elements(uint32x4_t input)
{
return(vaddq_u32(input, input));
}
5.4-Assembly code
对于非常高的性能,手工编码的Neon汇编程序是经验丰富的程序员的最佳方法。GNU汇编程序(GAS)和ARM编译器工具链汇编程序(ARMASM)都支持Neno指令的汇编。
ARM DS-5 Development Studio是基于ARM平台提供的C/C++软件开发的端到端套件工具。DS-5完全支持Neon架构的编程和调试。
DS-5 Debugger提供了Neon指令完整调试功能,以及其体系结构寄存器的可视化。DS-5调试器支持所有ARM体系结构配置文件和处理器。
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.1 video
网站:Taming Armv8 Neon: from theory to benchmark results
8.2 Blogs
8.3 Arm Compilers
8.4 Software optimization Guides
ARM为某些处理器发布软件优化指南。这些指南提供有关管道、指令性能特征和特殊性能考虑的高级信息。这些信息对使用Neon的程序员特别有用。