ARM Cortex-A9 NEON 和 VFP

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=neon -mfloat-abi=softfp,

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

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

根据ARM Architecture Reference Manual,NEON和VFP支持类似的指令,这使得仅通过检查反汇编很难区分差异。

此外,我计划对需要矢量化的循环和函数使用#pragma GCC ivdep,实现此目的的适当编译器标志是什么?

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

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

vfpneonarmv7 上共享一些指令(主要与内存相关),但不必担心。

你为什么不 post 反汇编?

-mfpu=

-mfloat-abi=

  • soft: 没有使用VFP,使用ARM Calling Convention
  • softfp:使用VFP但使用ARM调用约定(ARM R寄存器用于 将参数传递给函数)
  • hard:使用 VFP 并且调用约定特定于 H/W(以及 ARM R 寄存器 VFP/NEON S和D寄存器用于给函数传递参数。 S/D 寄存器用于按值调用的 floating-point 参数)

NEON (SIMD) 上的浮点运算

  • 除非在GCC中设置了选项 funsafe-math-optimizations, 霓虹灯不用于 Floating-Point 操作。 (霓虹灯不 遵循 IEEE 754 )

反汇编中的vfp和neon指令:

如果是 vmov,

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

循环矢量化

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

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

  • vectorization of loops with neon