1、前言
NEON:SIMD(Single Instruction Multiple Data 单指令多重数据) 指令集, 其针对多媒体和讯号处理程式具备标准化的加速能力。
VFP: (Vector Float Point), 向量浮点运算单元,arm11(s3c6410 支持VFPv2),Cortex-A8(s5pv210)支持VFPv3.
NEON和VFPv3 浮点协处理器共享寄存器组,所以在汇编时,指令是一样的。
编译选项:
-mfpu = name(neon or vfpvx)指定FPU 单元
-mfloat-abi = name(soft、hard、 softfp):指定软件浮点或硬件浮点或兼容软浮点调用接口
如果只指定 -mfpu,那么默认编译不会选择选择硬件浮点指令集
如果只指定 -mfloat-abi = hard或者softfp,那么编译会使用硬件浮点指令集
2、gcc编译选项不同
针对cpu为aarch64好像没有-mfpu选项,参见另一篇文章https://blog.csdn.net/xclshwd/article/details/90713747
好文http://www.voidcn.com/article/p-sjtnjhug-rx.html
3、使用
使用NEON主要有四种方法:
a、NEON优化库(Optimized libraries)
b、向量化编译器(Vectorizing compilers)
c、NEON intrinsics
d、NEON assembly
根据优化程度需求不同,第4种最为底层,若熟练掌握效果最佳,一般也会配合第3种一起使用。本文将会重点介绍第3、4 种方法。先简要介绍前两种。
- Libraries:直接在程序中调用优化库
- OpenMax DL:支持加速视频编解码、信号处理、色彩空间转换等;
- Ne10:一个ARM的开源项目,提供数学运算、图像处理、FFT函数等。
- Vectorizing compilers:GCC编译器的向量优化选项
- 在GCC选项中加入向量化表示能有助于C代码生成NEON代码,如
-ftree-vectorize
。
- 在GCC选项中加入向量化表示能有助于C代码生成NEON代码,如
- NEON intrinsics:提供了一个连接NEON操作的C函数接口,编译器会自动生成相关的NEON指令,支持ARMv7-A或ARMv8-A平台
- 所有的intrinsics函数都在GNU官方说明文档;
- NEON assembly:
- Assembly文件。纯汇编文件,后缀为”.S”或”.s”。注意对寄存器数据的保存。具体对通用寄存器的详解不是本文的重点,有兴趣的读者请 自行补充该部分知识
- inline assembly内联汇编
优点:在C代码中嵌入汇编,调用简单,无需手动存储寄存器;
缺点:有较为复杂的格式需要事先学习,不好移植到其他语言环境
参考博文:http://zyddora.github.io/2016/02/28/neon_1/ https://zyddora.github.io/2016/03/16/neon_2/