我是靠谱客的博主 辛勤哈密瓜,最近开发中收集的这篇文章主要介绍NEON编程学习NEON 寄存器NEON intrinsics数据类型指令命名,觉得挺不错的,现在分享给大家,希望可以做个参考。

最近项目中遇到一个问题,需要将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数据类型指令命名所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部