1、 ARM-NEON简介
ARM-NEON全称单指令多数据协处理器(Single instruction, multiple data)。其核心是有两类存储数据的寄存器组成
-
D-Register: 32x 64-bit
-
Q-Register: 16x 128-bit
利用这些存储数据的寄存器可实现简单的逻辑运算与算术运算,如加减乘除、移位、转置等。neon优化实现语言有如下两种,本博客仅介绍第一种方法,不涉及汇编语言。
1、NEON intrinsics(C语言,类似函数调用)- 移植简单、易维护
- 效率相对较低
- 不必考虑超出寄存器使用数量
2、 汇编语言
- 移植难度大
- 效率高
- 寄存器必须人工合理分配
2、数据类型
- ARM-NEON数据类型分两种,向量和向量数组,命名规则如下:
<type><size>x<number_of_lanes>_t
- 示例:
数据类型 | 含义 |
---|---|
uint8x8_t | 包含8个uint8的向量类型 |
uint8x8x2_t | 包含2个向量的数组类型,每个向量包含8个uint8 |
- neon官方编程指南中罗列了可支持的向量类型:
64-bit type (D-register) | 128-bit type (Q-register) |
---|---|
int8x8_t | int8x16_t |
int16x4_t | int16x8_t |
int32x2_t | int32x4_t |
int64x1_t | int64x2_t |
uint8x8_t | uint8x16_t |
uint16x4_t | uint16x8_t |
uint32x2_t | uint32x4_t |
uint64x1_t | uint64x2_t |
float16x4_t | float16x8_t |
float32x2_t | float32x4_t |
poly8x8_t | poly8x16_t |
poly16x4_t | poly16x8_t |
3、NEON INTRINSICSS指令函数
- 函数名定义:
<opname><flags>_<type>
- 示例
指令名 | 含义 |
---|---|
uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b) | 两个向量相乘 |
uint8x16_t vaddq_u |