ARM Cortex-A9 NEON 和 VFP
ARM Cortex-A9 NEON and VFP
我正在使用 ARM Cortex-A9 (zynq7000),我想启用 neon SIMD,但不将其用于浮点,除非另有说明。
当由 arm-none-eabi-gcc 使用以下 fpu 选项(单独)编译时:
- mfpu=vfpv3 -mfloat-abi=softfp,
- mfpu=neon-vfpv3 -mfloat-abi=softfp,
- 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
指令,除非通过内部函数启用或强制执行自动矢量化。
尽管 neon
和 vfp
指令看起来相似,但它们甚至各自以不同的模式运行。
vfp
和 neon
在 armv7
上共享一些指令(主要与内存相关),但不必担心。
你为什么不 post 反汇编?
-mfpu=
在 GCC(arm) 中设置 -mcpu=cortex-a9
或 -march=armv7-a
时
选项 mfpu=neon-vfpv3
和 mfpu=neon
相同。
-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.f32
和 vmov.f64
- neon 使用 vmov.i64、
vmov.i32
等。
循环矢量化
循环矢量化-ftree-vectorize
和-O2
或-O3
优化
可以使用选项
当使用 -Og
优化时,循环可能不会自动矢量化
vectorization of loops with neon
我正在使用 ARM Cortex-A9 (zynq7000),我想启用 neon SIMD,但不将其用于浮点,除非另有说明。
当由 arm-none-eabi-gcc 使用以下 fpu 选项(单独)编译时:
- mfpu=vfpv3 -mfloat-abi=softfp,
- mfpu=neon-vfpv3 -mfloat-abi=softfp,
- 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
指令,除非通过内部函数启用或强制执行自动矢量化。
尽管 neon
和 vfp
指令看起来相似,但它们甚至各自以不同的模式运行。
vfp
和 neon
在 armv7
上共享一些指令(主要与内存相关),但不必担心。
你为什么不 post 反汇编?
-mfpu=
在 GCC(arm) 中设置
-mcpu=cortex-a9
或-march=armv7-a
时 选项mfpu=neon-vfpv3
和mfpu=neon
相同。
-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.f32
和vmov.f64
- neon 使用 vmov.i64、
vmov.i32
等。
循环矢量化
循环矢量化
-ftree-vectorize
和-O2
或-O3
优化 可以使用选项当使用
-Og
优化时,循环可能不会自动矢量化vectorization of loops with neon