ARM NEON学习笔记三(使用方法)

20 篇文章 1 订阅

转载:neon使用和建议

重点参考博文:ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透

neon的使用方法

  • NEON优化库(Optimized libraries)
  • 向量化编译器(Vectorizing compilers)
  • NEON intrinsics
  • NEON assembly

(1)Libraries:直接在程序中调用优化

  • Ne10:一个ARM的开源项目,提供数学运算、图像处理、FFT函数等。
  • Libyuv :一个包含YUV数据的转换和扩展功能的开源库。
  • Skia :一个开源的2D图形库,用作谷歌Chrome和Chrome OS、Android、Mozilla Firefox和Firefox OS以及其他许多产品的图形引擎。
  • OpenMax DL:支持加速视频编解码、信号处理、色彩空间转换等。

(2)Vectorizing compilers:GCC编译器的向量优化选项

  • 在GCC选项中加入向量化表示能有助于C代码生成NEON代码,如-ftree-vectorize。

官方资料

Neon

Neon-enabled libraries

Arm Compute Library

Ne10

Libyuv

Skia

转载博客:ARM平台NEON指令的编译和优化

ARM平台NEON指令的编译和优化

  本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9, Cortex-A15)上的NEON多媒体处理硬件加速器针对C/C++语言、汇编语言和NEON intrinsics如何编译和优化,包含如何向量化、向量化的ARMCC和GCC编译器选项、NEON的汇编和EABI程序调用规范、如何在bare-metal和Linux操作系统上检测NEON硬件、如何指导编译器进行向量化NEON指令的优化等内容。





NEON向量化

  基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7, Cortex-A8, Cortex-A9, Cortex-A15)都可以选用NEON多媒体处理器加速程序运行,NEON是一种SIMD(Single Instruction Multiple Data)架构的协处理器,ARM的NEON处理器还可选配置成向量浮点VFPv3(Vector Floating-Point)指令集处理器。





常用的编译器选项配置





自动向量化选项

  armcc编译器使用–vectorize选项来使能向量化编译,一般选择更高的优化等级如-O2或者-O3就能使能–vectorize选项。

  gcc编译器的向量化选项-ftree-vectorize来使能向量化选项,使用-O3会自动使能-ftree-vectorize选项。





选择处理器类型

  armcc编译器使–cpu 7-A或者–cpu Cortex-A8来指定指令集架构和CPU类型。

  gcc编译器的处理器选项-mfpu=neon和-mcpu来指定cpu类型。如-mcpu=cortex-a5





选择NEON和VFP类型

  gcc选择用-mfpu=vfpv3-fp16来指定为vfp协处理,而-mfpu=neon-vfpv4等就能指定为NEON+VFP结构。





选择浮点处理器和ABI接口类型

  -mfloat-abi=soft使用软件浮点库,不是用VFP或者NEON指令;-mfloat-abi=softfp使用软件浮点的调用规则,而可以使用VFP和NEON指令,编译的目标代码和软件浮点库链接使用;

  -mfloat-abi=hard使用VFP和NEON指令,并且改变ABI调用规则来产生更有效率的代码,如用vfp寄存器来进行浮点数据的参数传递,从而减少NEON寄存器和ARM寄存器的拷贝。

常用的CPU类型编译器选项

CPU类型CPU类型选项FP选项FP + SIMD选项备注
Cortex-A5-mcpu=cortex-a5-mfpu=vfpv3-fp16
-mfpu=vfpv3-d16-fp16
-mfpu=neon-fp16-d16表明只有前16个浮点寄存器可用
Cortex-A7-mcpu=cortex-a7-mfpu=vfpv4
-mfpu=vfpv4-d16
-mfpu=neon-vfpv4-fp16表明支持16bit半精度浮点操作
Cortex-A8-mcpu=cortex-a8-mfpu=vfpv3-mfpu=neon
Cortex-A9-mcpu=cortex-a9-mfpu=vfpv3-fp16
-mfpu=vfpv3-d16-fp16
-mfpu=neon-fp16
Cortex-A15-mcpu=cortex-a15-mfpu=vfpv4-mfpu=neon-vfpv4

常用的gcc组合编译器选项

Cortex-A15 with a NEON unit
arm-gcc -O3 -mcpu=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard -ffast-math -omyprog.exe myprog.c
1
Cortex-A9 with a NEON unit
arm-gcc -O3 -mcpu=cortex-a9 -mfpu=neon-vfpv3-fp16 -mfloat-abi=hard -ffast-math -omyprog.exe myprog.c
1
Cortex-A7 without a NEON unit
arm-gcc -O3 -mcpu=cortex-a7 -mfpu=vfpv4-d16 -mfloat-abi=softfp -ffast-math -omyprog2.exe myprog2.c
1
Cortex-A8 without a NEON unit
arm-gcc -O3 -mcpu=cortex-a8 -mfloat-abi=soft -c -o myfile.omyfile.c

NEON汇编和EABI程序调用规范

  GNU assembler (gas) and ARM Compiler toolchain assembler(armasm)都支持NEON指令的汇编。但必须遵循ARMEmbedded Application Binary Interface (EABI)EABI的规范,即NEON寄存器的S0-S15 (D0-D7, Q0-Q3)用于传递参数和返回值,被调用函数内可以直接使用,不用保存;D16-D31 (Q8-Q15)则有调用函数来保存,被调用函数内可以不保存的随意使用;而S16-S31(D8-D15, Q4-Q7)则必须由被调用函数内部保存。对于调用传参规范则有,对于软件浮点,参数有R0~R3和堆栈stack传递,而硬件浮点,可以通过NEON寄存器来传递参数。



NEON硬件检测和使能



编译时指定NEON单元是否存在

  ARM编译器(armcc)从4.0之后就支持在某些处理器和FPU的选项中预定义宏ARM_NEON, armasm的宏TARGET_FEATURE_NEON.



运行时指定检测NEON单元

  OS内可以检测NEON单元是否存在,如Linux下cat /proc/cpuinfo看是否包含NEON或者VFP,
  如海思3516

/mnt/fuhang/alg_test/IRAlgorithmOptimize # cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 100.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

processor       : 1
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 100.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : Generic DT based system
Revision        : 0000
Serial          : 0000000000000000

另外,可以查看/proc/self/auxv,这里会包含二进制格式的hwcap,可以通过AT_HWCAP来搜索到。HWCAP_NEON bit (4096).另外如Ubuntu的发布在路径/lib/neon/vfp下包含lib的NEON优化版本。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光下的麦克

您的犒赏是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值