arm优化编译参数选项解释

CFLAGS +=  -Wall  -O2  -mcpu=cortex-a53  -mfloat-abi=softfp  -mfpu=neon-vfpv4  -mno-unaligned-access  -fno-aggressive-loop-optimizations -g -lmpi $(INC_FLAGS) $(LIBS)
-Wall:编译警告信息显示

-fno-aggressive-loop-optimizations:消除(或理解为“不允许”)程序中的无限循环行为

-mno-unaligned-access:进行对齐的memory访问

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

它用于选择处理器类型
使用 -A或者–cpu Cortex-a53来指定指令集架构和CPU类型。
选项-mfpu=neon和-mcpu来指定cpu类型。如-mcpu=cortex-a5

-mfpu=neon-vfpv4

它用于选择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寄存器的拷贝

查看处理器是否支持NEON

#cat /proc/cpuinfo

看是否有如下内容,其中所用的cpu所支持的特性:

其他参数:

参考:https://blog.csdn.net/rony2012/article/details/76614863

其中-Otime参数可能会报错,改为-Ofast,表示在-O2/-O3优化时,优先考虑执行速度进行优化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章