From 690778c33af97981dd30d07b0ffcd4ce97974eee Mon Sep 17 00:00:00 2001 From: huzife <634763349@qq.com> Date: Mon, 9 Dec 2024 08:35:25 +0000 Subject: [PATCH] =?UTF-8?q?[GCC]=20=E6=96=B0=E5=A2=9EGCC=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E7=89=B9=E6=80=A7=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8C=87=E5=8D=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\210\267\346\214\207\345\215\227.md" | 217 ++++++++++++++++++ docs/zh/menu/index.md | 1 + 2 files changed, 218 insertions(+) create mode 100644 "docs/zh/docs/GCC/GCC\345\237\272\347\241\200\346\200\247\350\203\275\344\274\230\345\214\226\347\211\271\346\200\247\347\224\250\346\210\267\346\214\207\345\215\227.md" diff --git "a/docs/zh/docs/GCC/GCC\345\237\272\347\241\200\346\200\247\350\203\275\344\274\230\345\214\226\347\211\271\346\200\247\347\224\250\346\210\267\346\214\207\345\215\227.md" "b/docs/zh/docs/GCC/GCC\345\237\272\347\241\200\346\200\247\350\203\275\344\274\230\345\214\226\347\211\271\346\200\247\347\224\250\346\210\267\346\214\207\345\215\227.md" new file mode 100644 index 000000000..ad391d7b2 --- /dev/null +++ "b/docs/zh/docs/GCC/GCC\345\237\272\347\241\200\346\200\247\350\203\275\344\274\230\345\214\226\347\211\271\346\200\247\347\224\250\346\210\267\346\214\207\345\215\227.md" @@ -0,0 +1,217 @@ +# 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。 diff --git a/docs/zh/menu/index.md b/docs/zh/menu/index.md index dd93fe4c5..118840951 100644 --- a/docs/zh/menu/index.md +++ b/docs/zh/menu/index.md @@ -339,6 +339,7 @@ headless: true - [常见问题与解决方法]({{< relref "./docs/ApplicationDev/常见问题与解决方法.md" >}}) - [GCC用户指南]({{< relref "./docs/GCC/overview.md" >}}) - [内核反馈优化特性用户指南]({{< relref "./docs/GCC/内核反馈优化特性用户指南.md" >}}) + - [GCC基础性能优化特性用户指南]({{< relref "./docs/GCC/GCC基础性能优化特性用户指南.md" >}}) - [FangTian视窗引擎]({{< relref "./docs/FangTian/overview.md" >}}) - [FangTian环境配置]({{< relref "./docs/FangTian/FangTian环境配置.md" >}}) - [FangTian支持Wayland应用及鸿蒙应用]({{< relref "./docs/FangTian/FangTian支持Wayland应用及鸿蒙应用.md" >}}) -- Gitee