---
title: 自动反馈优化编译
description: "PGO（Profile-Guided Optimization，配置文件引导优化）是一种编译器优化技术，通过编译器插桩收集程序运行时信息进行优化决策。编译器根据这些运行时信息指导各种编译优化技术进行更准确的优化决策，生成更优的目标程序。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00010.html
sourcePath: /source/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00010.html
indexId: 3cd4730e018a3af90bd81b199f0389059c0c6432be537e0339405bbed92be01369
---
# 自动反馈优化编译

PGO（Profile-Guided Optimization，配置文件引导优化）是一种编译器优化技术，通过编译器插桩收集程序运行时信息进行优化决策。编译器根据这些运行时信息指导各种编译优化技术进行更准确的优化决策，生成更优的目标程序。

自动反馈优化是一种可简化PGO部署流程的技术，主要思想是通过采样方式收集程序的运行信息，间接得到程序的执行情况，简化了PGO的部署流程。

#### 前提条件

- 已成功登录鲲鹏DevKit。
- 环境依赖需满足以下条件：

  - 架构：鲲鹏ARM。
  - 操作系统PRETTY_NAME：openEuler 22.03 LTS、openEuler 22.03 LTS SP1、openEuler 20.03 LTS SP2、openEuler 20.03 LTS SP3、Ubuntu 18.04.4 LTS、Ubuntu 20.04.2 LTS、Kylin Linux Advanced Server V10(Tercel)、UOS 20、UnionTech OS Server 20、CentOS Linux 7(AltArch)。
    注：PRETTY_NAME为CentOS Linux 7(AltArch)操作系统的redhat-release值须是CentOS Linux release 7.6.1810(AltArch)。

  - 编译器：GCC for openEuler 2.3.2及以上。
    若使用普通用户配置自动反馈优化编译参数时，GCC for openEuler版本正确，环境检查提示“编译器未安装或编译器版本不匹配”，请检查“~/.profile”文件中是否配置GCC for openEuler的环境变量。

  - 软件包：curl、perf、A-FOT。


#### 操作步骤

1. 单击左侧树快捷功能区按钮，或单击“开发”选择编译调试下方的“编译”，打开编译页面。
2. 选择“自动反馈优化编译”，配置自动反馈优化编译参数，如图1所示，配置完成后，单击“下一步”。
  图1 自动反馈优化编译

3. 校验服务器环境并下载脚本文件。
  图2 选择目标服务器

  优化目标的源码编程语言仅支持：C/C++/Fortran，其他编程语言暂不支持。

4. 检验成功后，继续填写自动反馈优化编译的其他配置参数，如图3、表1所示，配置完成后，单击“开始编译”进行参数校验并执行自动反馈优化编译。
  图3 配置参数

**表1 自动反馈优化编译参数说明**

| 参数 | 说明 |
| --- | --- |
| 工程本地路径 | 当前工程文件在本地存放的路径。 |
| 编译方式 | 编译方式可选： 通用编译 自动反馈优化编译 |
| 远程服务器配置 | 进行编译的远程服务器。 配置时可以使用已有服务器或添加目标服务器，单击“添加目标服务器”，跳转到目标服务器管理界面进行操作。 |
| Linux用户密码 | 使用的Linux用户密码。 |
| 记住密码 | 勾选后可记住当前远程服务器Linux用户密码。 |
| 可执行文件路径 | 为二进制安装后生成的可执行文件路径。 profile生成阶段需要此路径来解析profile。 |
| 构建脚本路径 | 为目标应用的构建脚本路径。 构建脚本需要用户完成编写，工具将调用此脚本完成应用的编译。 |
| 执行脚本路径 | 为目标应用的执行脚本路径。 执行脚本需要用户完成编写，工具将后台运行此脚本以执行目标应用。 |
| 脚本工作目录 | 用于存放采样文件和profile。 |
| 优化模式 | A\-FOT是一款用于提升编译器GCC for openEuler自动反馈优化特性的工具，支持以下三种模式： AutoFDO：AutoFDO是PGO的简化部署版，使用perf替代插桩获取程序运行profile，受益优化点包括矢量化、循环展开、循环剥离等优化。 AutoPrefetch：AutoPrefetch是增强版预取优化，根据DCache访问、存取指令cache miss率，获取数据访问优化代码块并进行预取优化，同时优化预取提前量，建议和AutoFDO共同使用。 AutoBOLT：AutoBOLT是链接后二进制优化，对控制流复杂的程序具有显著的优化效果，主要优化包括BB重排、函数重排、冷热分区等优化，与AutoFDO、AutoPrefetch部分冲突。 |
| 构建模式 | 构建模式支持两种模式： Wrapper：会使用A\-FOT中的包装器编译。 Bear：会进行两次编译。 |
| 最大启动时间（s） | 等待目标应用二进制启动的最长时间。 检测到任务名称即视为二进制启动成功。默认值为10秒，取值范围为1秒 ~ 900秒。 |
| 采样时长（s） | 工具采样时长。 默认值为100秒，取值范围为1秒 ~ 1800秒。 |


5. 自动反馈优化任务编译成功后，会显示优化后的编译文件的路径，可到此路径下获取优化后的编译文件。若自动反馈优化任务编译失败，可到终端查看相关的失败信息提示，也可以前往目标服务器查看对应路径下的opt.log文件。
  图4 执行成功

  图5 执行失败

  若自动反馈优化编译启动失败，请参见自动反馈优化编译启动失败的解决方法进行处理。 若需要再次执行自动反馈优化编译，单击左侧树快捷功能区按钮，或单击“编译”，可再次执行编译。

6. 若需要修改自动反馈优化编译的配置参数，单击“ > 工程设置 > 编译”，选择“自动反馈优化编译”并修改配置参数，最后单击“保存设置”即可。
  图6 修改自动反馈优化编译配置参数
