前言
Hi3516A具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,因此所有Hi3516A板端代码编译时需要在Makefile里面添加选项-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