我使用的是ARM Cortex-A9(zynq7000(,我想启用neon SIMD,但除非指定,否则不能将其用于浮点。
当由arm none编译时,eabi gcc具有以下fpu选项(单独(:
- mfpu=vfpv3-mfloat-abi=softfp
- mfpu=neon-vfpv3-mfloat abi=softfp
- mfpu=氖-mfloat abi=softfp
二进制文件1&2不同。但是2&3是相同的(未启用矢量化(我正在使用-Og进行优化。(-Og不启用矢量化选项(
当我使用选项mfpu=NEON-vfpv3时,我如何确保所有浮点都在VFP中完成,而不是在NEON中完成?
根据ARM体系结构参考手册,NEON和VFP支持相似的指令,这使得仅通过检查拆卸很难区分差异。
此外,我计划将#pragma GCC ivdep用于需要向量化的循环和函数,以及实现这一目标的合适编译器标志是什么?
除非通过内部函数启用或强制执行自动向量化,否则编译器永远不会使用任何neon
指令。
尽管neon
和vfp
指令看起来相似,但它们甚至各自以不同的模式运行。
vfp
和neon
在armv7
上共享了一些指令(主要与内存有关(,但它们不应该引起任何关注。
你为什么不把拆封贴出来?
-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.f32
和vmov.f64
- neon使用vmov.i64、
vmov.i32
等
环路矢量化
-
对于循环矢量化
-ftree-vectorize
和-O2
或-O3
优化可使用选项当使用
-Og
优化时,环路可能不会自动矢量化 -
用氖实现环路的矢量化