DSP Factory是B站up主的一个开源工程,不是我,我只是从这个工程中学到了NEON的知识,这里做一下总结。对我有用的地方有2个,一个是memcpy,另一个是RGB转Gray的NEON实现。
配套有2个视频,第一个14分钟讲了数据格式和介DSP Factory工程本身。
https://www.bilibili.com/video/BV1dq4y157NA
第二个45分钟的视频讲解了DSP Factory里面函数的使用方法。
https://www.bilibili.com/video/BV1V64y1X7Eo
这里给出了DSP Factory的地址,翻墙可以获取
dsp_factory: https://github.com/leonard73/dsp_factory
我这里将里面的重点列一下。
所谓的D register,也就是double精度的register,使用64bit,同样的,Q的意思是quadruple,4倍精度,占用128bit。
这些数据结构,可以将我们平时使用的标数据转为向量数据。如右图,如果512个uint16的数组,如果每次处理16bit,需要处理512次;而将64bit做为一个向量来处理,只需处理128次。
但是使用NEON是有限制的:NEON对内存的对齐是强制依赖的。因为使用的是D或者Q register,必须填充完毕,这样才能发挥SIMD的优势。
下面是RGB888单独提出各通道数据的实现
下面是RGB转灰度的公式
普通的实现和NEON的实现,可以在DSP Factory的NeonRgb2Gray.c 里面查看到
void do_RGB2GRAY_I16_Neon(unsigned char *src, unsigned char * dst, unsigned int width, unsigned int height)
void do_RGB2GRAY_I16(unsigned char *src, unsigned char * dst, unsigned int width, unsigned int height)
可以将这2个函数对比着看,收获会更大。
有用的tips:
1.ARMv8之后的架构才支持NEON
2.在编译选项启用 NEON 的配置是 -mfpu=neon
3.NEON是强制对齐的
4.数组能否被64或者128bit对齐,是能否使用NEON API的关键
5.未加速和使用NEON的函数,需要测试才能够确定是否达到预期
备注: