最近项目中遇到一个问题,需要将RGB888格式的图片转换为RGB565格式,最开始是肯定是先使用C来实现的,使用下来转换一个320*240的图片需要50ms的时间,这个时间是不能接受的,于是就想着需要有方法能够加速,就想到了使用NEON来实现。
最开始以为NEON是汇编比较复杂,可能自己也每能力是实现,就抱着试试看的态度开始了,看了一些网上的例子之后发现其实也没有那么复杂,而且还是挺简单的,最重要的是使用NEON之后速度确实带来了极大的提升。
NEON方便,易用,带来速度上的提升也很大,所以NEON还是很值得学习一下的。后面一点一点积累相关知识。
NEON 寄存器
NEON寄存器的几种形式:
- 16×128-bit寄存器(Q0-Q15);
- 或32×64-bit寄存器(D0-D31)
- 或上述寄存器的组合。
每一个Q0-Q15寄存器映射到一对D寄存器。
寄存器之间的映射关系:
- D<2n> 映射到 Q 的最低有效半部;
- D<2n+1> 映射到 Q 的最高有效半部;
结合NEON支持的数据类型,NEON寄存器有如下图的几种形态:
可以看到NEON寄存器可以作为4个32字节或者8个16字节或者16个8字节的寄存器来使用。
NEON intrinsics
- NEON 指令封装的内置函数
- 执行效率并不会降很多
- 使用NEON intrinsics像是在调用结构体和函数,通过反汇编可以发现没有函数调用,只是在使用NEON寄存器和指令
数据类型
<基本类型>x<lane个数>x<向量个数>_t,向量个数如果省略表示只有一个。如int8x8_t,uint8x8x3_t。
基本类型int8,int16,int32,int64,uint8,uint16,uint32,uint64,float16,float32
lane个数表示并行处理的基本类型数据的个数。
对于多个向量的类型实际上是结构体
typedef struct{
uint8x8_t val[3];
}uint8x8x3_t;
指令命名
<指令名>[后缀]_<数据基本类型简写>
其中后缀如果没有,表示64位并行;如果后缀是q,表示128位并行。
如果后缀是l,表示长指令,输出数据的基本类型位数是输入的2倍;如果后缀是n,表示窄指令,输出数据的基本类型位数是输入的一半。
数据基本类型简写:s8,s16,s32,s64,u8,u16,u32,u64,f16,f32
例如:
vadd_u16:两个uint16x4相加为一个uint16x4
vaddq_u16:两个uint16x8相加为一个uint16x8
vaddl_u16:两个uint8x8相加为一个uint16x8
最后
以上就是辛勤哈密瓜为你收集整理的NEON编程学习NEON 寄存器NEON intrinsics数据类型指令命名的全部内容,希望文章能够帮你解决NEON编程学习NEON 寄存器NEON intrinsics数据类型指令命名所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复