ARM Cortex-A9 NEON and VFP



我使用的是ARM Cortex-A9(zynq7000(,我想启用neon SIMD,但除非指定,否则不能将其用于浮点。

当由arm none编译时,eabi gcc具有以下fpu选项(单独(:

  1. mfpu=vfpv3-mfloat-abi=softfp
  2. mfpu=neon-vfpv3-mfloat abi=softfp
  3. mfpu=氖-mfloat abi=softfp

二进制文件1&2不同。但是2&3是相同的(未启用矢量化(我正在使用-Og进行优化。(-Og不启用矢量化选项(

当我使用选项mfpu=NEON-vfpv3时,我如何确保所有浮点都在VFP中完成,而不是在NEON中完成?

根据ARM体系结构参考手册,NEON和VFP支持相似的指令,这使得仅通过检查拆卸很难区分差异。

此外,我计划将#pragma GCC ivdep用于需要向量化的循环和函数,以及实现这一目标的合适编译器标志是什么?

除非通过内部函数启用或强制执行自动向量化,否则编译器永远不会使用任何neon指令。

尽管neonvfp指令看起来相似,但它们甚至各自以不同的模式运行。

vfpneonarmv7上共享了一些指令(主要与内存有关(,但它们不应该引起任何关注。

你为什么不把拆封贴出来?

-mfpu=

  • 在GCC(arm(中,当-mcpu=cortex-a9-march=armv7-a设置为选项CCD_ 9和CCD_。

    '+霓虹灯'https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html

-mfloat abi=

  • soft :VFP未使用,而是使用ARM调用约定
  • softfp :使用VFP,但使用ARM调用约定(ARM R寄存器用于将参数传递给函数(
  • hard :使用VFP,调用约定特定于H/W(与ARM R寄存器一起,VFP/NEON S和D寄存器用于将参数传递给函数。S/D寄存器用于值调用的浮点参数(​

近地天体(SIMD(上的浮点运算

  • 除非选项​CCD_ 11被设置在GCC中,霓虹灯不用于浮点运算。(霓虹灯没有遵循IEEE 754(

vfp和neon反汇编说明:

在vmov的情况下,

  • vfp仅使用vmov.f32vmov.f64
  • neon使用vmov.i64、vmov.i32

环路矢量化

  • 对于循环矢量化-ftree-vectorize-O2-O3优化可使用选项

    当使用-Og优化时,环路可能不会自动矢量化

  • 用氖实现环路的矢量化

最新更新