天天看点

海思支持NEON(FPU)

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,那么编译会使用硬件浮点指令集

海思支持NEON(FPU)

 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

  • 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/

继续阅读