arm neon介绍

一.介绍

       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

8.3 Arm Compilers

8.4 Software optimization Guides

       ARM为某些处理器发布软件优化指南。这些指南提供有关管道、指令性能特征和特殊性能考虑的高级信息。这些信息对使用Neon的程序员特别有用。

猜你喜欢

转载自blog.csdn.net/weixin_41965270/article/details/89150413
今日推荐