前言
指令集并行是CPU的优化加速的一个方向,在ARM芯片主要是利用NEON指令集实现指令集并行
NEON简介
NEON就是高级SIMD,单指令多数据,适用于图像、音频等数据处理。ARMv6就叫SIMD,ARMv7开始叫NEON,aarch64又有点不一样,下文只针对ARMv7或者ARMv8 aarch32的NEON进行
NEON有32个64位长的寄存器(D0-D31,每个D可以装2个浮点数据),也可以看做为16个128位长的寄存器(Q0-Q15,每个Q可以装4个浮点数据),所以一句指令最多可以同时实现4个乘法操作,理论速度可以提升4倍
如何使用NEON
三种使用NEON的方法
库函数
官方给了2个库可以使用,OpenMax DL和Ne10,后者在github上有,也是我用来参考学习的主要对象
汇编函数
用汇编语句编写.s文件
在C/C++代码中嵌入汇编语句(inline assembly)
内联函数(intrinsics function)
在C代码中直接嵌入内联函数用以实现功能,但是性能会取决于编译器和具体设备
汇编函数基础
想要高效利用NEON的话,汇编是避不开的。下面是ARM汇编相关的准备知识
参考资料
汇编基础原理
b、bx、bl指令
arm汇编指令
GNU ARM Assembler Quick Reference
特殊寄存器
TODO: sb、ip是干嘛的
汇编函数文件directive(指令、