ARM NEON技术是ARM Cortex-A系列和Cortex-R52处理器的SIMD(单指令多数据)架构扩展。 NEON技术旨在通过加速音视频编码/解码,用户界面,2D / 3D图形或游戏来改善多媒体用户体验。NEON还可以加速信号处理算法和功能,加快音频和视频处理,语音和面部识别,计算机视觉和深度学习等应用。官方网站为NEON-ARM开发者。
概述
NEON技术是一个封装的SIMD架构。NEON寄存器被认为是相同数据类型元素的向量。该技术支持多种数据类型。下表描述了不同架构版本支持的数据类型。
- | ARMv7-A/R | ARMv8-A/R | RMv8-A |
---|---|---|---|
- | - | AArch32 | AArch64 |
Floating-point | 32-bit | 16-bit*/32-bit | 16-bit*/32-bit/64-bit |
Integer | 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 Programmers Guide。官网文档需要注册ARM开发者账号才可以下载,所以可以去CSDN下载。
NEON基本知识
NEON的寄存器
- 16个128-bit Q(quadword)寄存器,Q0-Q15.
- 32个64-bit D(doubleword)寄存器,D0-D31. (16个64-bit D寄存器 for VFPv3-D16.)
- D寄存器和Q寄存器的映射关系为:Q
为D<2n>和D<2n+1>的组合。2n+1>2n>
- D寄存器和Q寄存器的映射关系为:Q
具体关系如下图所示。
NEON的数据类型
- | 8-bit | 16-bit | 32-bit | 64-bit |
---|---|---|---|---|
Unsigned integer | U8 | U16 | U32 | U64 |
Signed integer | S8 | S16 | S32 | S64 |
Integer of unspecified type | I8 | I16 | I32 | I64 |
Floating-point number | not available | F16 | F32 or F | not available |
Polynomial over {0,1} | P8 | P16 | not available | not available |
NEON Intrinsics
NEON Intrinsics是编译器使用适当的NEON指令或NEON指令序列替换的函数调用。Intrinsics提供与编写汇编语言几乎一样多的指令,但是将寄存器分配给编译器,以便开发人员可以专注于算法。它还可以执行指令调度以消除指定目标处理器的流水线停顿。这样可以开发比使用汇编语言更可维护的源代码。
NEON Intrinsics举例
原代码
|
|
NEON Intrinsics代码
这个例子中A是无符号短整型数组,ushort为16位,数组长度为4,所以vld1_u16(A) 可以把整个数组load到4通道x16位的向量中,通过vadd_u16使每个通道进行加法,vst1_u16把v中数据存回A中。
关于详细的NEON Intrinsics编程信息,可以看这->ARM NEON Intrinsics参考。
参考资料:
https://developer.arm.com/technologies/neon
https://developer.arm.com/docs/den0018/latest/neontm-version-10-programmers-guide