Q:编译参数 -mcpu=cortex-a7、-mfloat-abi=softfp 和 -mfpu=neon-vfpv4 参数选项介绍
-mfloat-abi=softfp
ABI 即 “application binary interface”,即编译器将 c 代码编译成汇编代码时使用的一种规则
使用规范如下:
在编译带有浮点参数的函数时,有三种可能的编译选项:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard
"soft" 选项:表明不使用 FPU 硬件,而是使用 GCC 的整数算术运算来模拟浮点运算。
"softfp" 选项:表明要使用 FPU 硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到 FPU 中。
"hard" 选项:表明要使用 FPU 硬件来做浮点运算,并且,函数的参数直接传递到 FPU 的寄存器(s0、d0)中。
自动向量化选项
armcc 编译器使用 –vectorize 选项来使能向量化编译,一般选择更高的优化等级如 -O2 或者 -O3 就能使能 –vectorize 选项。
gcc 编译器的向量化选项 -ftree-vectorize 来使能向量化选项,使用 -O3 会自动使能 -ftree-vectorize 选项。
-mcpu=cortex-a7
选择处理器类型
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 类型编译器选项
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
确认处理器是否支持 NEON
cat /proc/cpuinfo
看是否有如下内容:Features : swp half thumb fastmult vfp edsp neon vfpv3 tlsvfpv4 idiva idivt
更多扩展知识见: