NEON编程学习

博客讲述了在项目中遇到的RGB888图片转换到RGB565格式的需求,最初使用C语言实现耗时较长。为提高效率,作者尝试并成功利用NEON指令集进行优化,显著提升了转换速度。文中介绍了NEON寄存器的多种形式、NEON intrinsic函数的使用以及数据类型和指令命名规则,展示了NEON在加速计算方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中遇到一个问题,需要将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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值