一、intrinsic函数优缺点
使用SIMD(单指令多数据)技术处理数据的方法主要是:
- neon指令
- intrinsic函数
- 手写汇编代码
其中intrinsic函数是对neon指令的封装,方便使用,连着使用的性能相差不大,但都比手写neon汇编代码带来的性能要差一些。
二、intrinsic函数执行过程
汇编代码其实就是对寄存器进行操作和运算,而neon指令也是一样的。Neon指令操作的寄存器有两种,一种是128位的寄存器,一种是64位的寄存器(其中64位的寄存器其实就是128位的寄存器没有使用高位的64位而已,其实都是128位的寄存器)。所以以128位寄存器举例的话,一个neon指令,可以simd同时处理16个8bit数据、4个32bit数据、2个64bit数据。
三、相关概念
rigister:寄存器。从硬件角度来看。
vector:向量。从数据角度来看。
lane:通道。连接输入操作数和输出操作数来运行的就是通道。
Element:元素。运算操作的最小数据,有8位、16位、32位等。
数据类型:
<type><size>x<len_of_lanes>_t
比如:int16x4_t int16x8_t
int16x4x4_t 表示存储四个int16x4_t数据的结构体
注意:ARMV7架构内有多重寄存器。
16个通用寄存器(32bit);
16个NEON寄存器(128bit),或者可以看成32个寄存器(64bit);
16个VFP寄存器(32bit)。
NEON和VFP的区别在于VFP是加速浮点计算的硬件不具备数据并行能力,同时VFP进行双精度浮点数(double)的计算,NEON只有单精度浮点计算能力。