GCC 基础性能优化用户指南

简介

编译器基础性能优化对于提高应用程序的开发效率、运行性能和可维护性都非常重要。它是计算机科学领域的一个重要研究方向,也是软件开发过程中的重要环节之一。GCC for openEuler 在通用编译优化能力的基础上,对中后端性能优化技术进行了增强,包括指令优化、向量化增强、预取增强、数据流分析增强等优化。

安装与部署

软件要求

操作系统:openEuler-24.03-LTS-SP1

硬件要求

aarch64 架构

安装软件

按需安装 GCC 和相关组件即可,以 GCC 为例。

shell
yum install gcc

使用方法

CRC优化

说明

识别 CRC 软件循环代码,生成高效硬件指令。

使用方法

在编译时增加-floop-crc选项。

注:-floop-crc选项需要和-O3 -march=armv8.1-a一起使用。

If-conversion 增强

说明

增强 If conversion 优化,使用更多的寄存器以减少冲突。

使用方法

本优化是 RTL 优化 if-conversion 的一部分,使用如下编译选项控制优化启用。

-fifcvt-allow-complicated-cmps

--param=ifcvt-allow-register-renaming=[0,1,2]数字用于控制优化范围。

注:此优化依赖-O2优化等级,以及与--param=max-rtl-if-conversion-unpredictable-cost=48--param=max-rtl-if-conversion-predictable-cost=48共同使用。

乘法计算优化

说明

Arm 相关指令合并优化,实现32位复杂组合的64位整形乘法逻辑的识别,并以高效的64位指令数输出。

使用方法

使用-fuaddsub-overflow-match-all-fif-conversion-gimple选项使能优化。

注:此优化需要-O3及以上优化等级。

cmlt 指令生成优化

说明

对一些四则运算生成cmlt指令,减少指令数。

使用方法

使用选项-mcmlt-arith使能优化。

注:此优化需要-O3以上优化等级使用。

向量化优化增强

说明

识别并简化向量化过程中生成的冗余指令,允许更短的循环进入向量化。

使用方法

使用参数--param=vect-alias-flexible-segment-len=1使能,默认为0。

注:此优化需要-O3及以上优化等级。

min max 和 uzp1/uzp2 指令联合优化

说明

识别 min max 和 uzp1/uzp2 指令联合优化机会,减少指令数从而提升性能。

使用方法

使用-fconvert-minmax选项使能min max优化,uzp1/uzp2指令优化在-O3以上等级默认使能。

注:依赖-O3及以上优化等级。

ldp/stp 优化

说明

识别某些性能表现差的 ldp/stp,将其拆分成2个 ldr 和 str。

使用方法

使用-fsplit-ldp-stp选项使能优化,使用参数--param=param-ldp-dependency-search-range=[1,32]控制搜索范围,默认16。

注:依赖-O1及以上优化等级。

AES指令优化

说明

识别 AES 软件算法指令序列,使用硬件指令加速。

使用方法

使用-fcrypto-accel-aes选项使能优化。

注:依赖-O3及以上优化等级。

间接调用提升

说明

识别和分析程序中的间接调用,尝试将其优化为直接调用。

使用方法

使用选项-ficp -ficp-speculatively使能优化。

注:此优化需要和-O2 -flto -flto-partition=one共同使用。

IPA-prefetch

说明

识别循环中的间接访存,插入预取指令,从而减少间接访存的延迟。

使用方法

通过选项-fipa-prefetch -fipa-ic使能优化。

注:此优化需要和-O3 -flto共同使用。

-fipa-struct-reorg

说明

内存空间布局优化,将结构体成员在内存中的排布进行新的排列组合,来提高 cache 的命中率。

使用方法

在选项中加入-O3 -flto -flto-partition=one -fipa-struct-reorg即可。

注:-fipa-struct-reorg选项,需要在-O3 -flto -flto-partition=one全局同时开启的基础上才使能。

-fipa-reorder-fields

说明

内存空间布局优化,根据结构体中成员的占用空间大小,将成员从大到小排列,以减少边界对齐引入的 padding,来减少结构体整体占用的内存大小,以提高 cache 的命中率。

使用方法

在选项中加入-O3 -flto -flto-partition=one -fipa-reorder-fields即可。

注:-fipa-reorder-fields选项,需要在-O3 -flto -flto-partition=one全局同时开启的基础上才使能。

-ftree-slp-transpose-vectorize

说明

该选项在循环拆分阶段,增强对存在连续访存读的循环的数据流分析能力,通过插入临时数组拆分循环;SLP 矢量化阶段,新增对 grouped_stores 进行转置的 SLP 分析。

使用方法

在选项中加入-O3 -ftree-slp-transpose-vectorize即可。

注:-ftree-slp-transpose-vectorize选项,需要在-O3开启的基础上才使能。

-fif-split

说明

该选项通过拆分包含复杂条件的 if 语句块,增强程序间常量传播的能力。

使用方法

在选项中加入-O3 -fif-split即可。

注:-fif-split选项,需要在-O3开启的基础上才使能。

-ftree-slp-late

说明

该选项进行额外的 SLP 矢量化,增加检查从而覆盖更多向量化场景,增强优化效果。

使用方法

通过选项-ftree-slp-late使能优化,使用参数--param=vect-swap-operands=1--param=addr-expand-for-alias-check=1--param=vect-register-size-check=1启用对应检查。

-ftracer-static

说明

该选项通过减少条件跳转和加载的次数。

使用方法

通过选项-ftracer-static使能优化,使用参数--param=tracer-min-not-covered-insns-num=[0,2^31-1]控制执行优化的最小指令数,默认0,使用参数--param=tracer-max-not-covered-insns-num=[0,2^31-1]控制执行优化的最大指令数,默认12。