性能优化特性之:PGO

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS AI 助手,专业版
简介: 本文介绍了倚天实例上的编译优化特性:PGO,并从优化原理、使用方法进行了详细阐述。

优化原理

PGO全称profile guided optimization,主要是为了解决传统编译器在执行优化的时候,只是是基于静态代码信息,而不去考虑用户可能的输入,从而无法有效对代码进行有效优化的问题。 PGO可以分为三个阶段,分别是instrument,train,optimize三个阶段。在instrument阶段中,会先对应用做一次编译。在这次编译中,编译器会向代码中插入一下指令,以便下一阶段可以收集数据。插入的指令分为三种类型,分别用来统计:

  1. 每个函数被执行了多少次
  2. 每个分支被执行了多少次(例如if-else的场景)
  3. 某些变量的值(主要用于switch-case的场景)

在train阶段中,用户需要使用最常用的输入来运行上一阶段编译生成的应用。由于上一阶段已经做好了收集数据的准备,在经过train阶段之后,该应用最常见的使用场景对应的数据就会被收集下来。 最后阶段是optimization阶段。在该阶段中,编译器会利用上一阶段收集到的数据,对应用进行重新编译。由于上一阶段的数据来自于用户输入的最常见的用户场景,那么最后优化得到的结果就能在该场景下有更好的优化。

使用方法

举例说明如何使用PGO来进行编译优化: 编写一段C++代码,该代码用较为低效的方式来判断一个数字是否为质数。代码如下:

//test.cpp
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(int argc, char** argv){
    int num0 = atoi(argv[1]);
    int num1 = atoi(argv[1]);
    int branch = atoi(argv[2]);
    if (branch < 1){
        for (int i=2;i<=num0;i++){
            if (num0%i==0){
                cout<<i<<endl;
                break;
            }
        }
    } else {
        for (int i=2;i<num1;i++){
            if (num1%i==0){
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

可以看到代码中根据branch的值不同,分为了两个分支。这两个分支的代码完全相同。这个是为了后续测试的目的。另外,2147483647是int范围内最大的质数,后面会用到。

不使用PGO

先看下不使用PGO的情况。用下列命令编译:

g++ test.cpp -O3 -o test

执行下面两条命令得到两个分支的时间

time ./test 2147483647 0
real    0m6.904s
user    0m6.902s
sys     0m0.000s
time ./test 2147483647 1
real    0m6.907s
user    0m6.905s
sys     0m0.000s

可以看到两个分支的执行时间几乎是相同的。

使用PGO

使用下面的命令做第一次编译

g++ test.cpp -O3 -fprofile-generate -o test.pgo_generate

这里得到的test.pog_generate即是前文提到的第一阶段生成用户收集数据的binary。 执行下列命令进行训练:

time ./test.pgo_generate 2147483647 0
real    0m11.894s
user    0m11.890s
sys     0m0.001s

这边只训练branch=0这个分支。可以看到由于需要收集数据,执行速度慢了很多。 接下来再做一次编译:

g++ test.cpp -O3 -fprofile-use -o test.pgo_use

这里得到的test.pgo_use即是最终经过PGO优化完成的binary。 执行下列命令测试时间

time ./test.pgo_use 2147483647 0
real    0m6.258s
user    0m6.255s
sys     0m0.001s
time ./test.pgo_use 2147483647 1
real    0m6.905s
user    0m6.903s
sys     0m0.000s

可以看到,被优化了的branch=0分支,运行速度得到了提升;而没有被优化的branch=1分支,执行时间保持不变。 这也就说明了PGO这样的优化是有效的。



---------------------------------------------------------------------------------------

更多调优信息,请参考:

龙蜥社区:https://openanolis.cn/

KeenTune SIG:https://openanolis.cn/sig/KeenTune

阿里云龙蜥操作系统专区:https://developer.aliyun.com/group/aliyun_linux

相关文章
|
缓存 编译器
BOLT 二进制反馈优化技术
大型应用的代码往往达到数十甚至上百MB,这导致在程序执行时缓存机制无法充分利用,导致大量时间花费在CPU和内存链路上。通过对热点函数的布局进行优化,我们可以更好地利用CPU cache,从而获得较为可观的性能提升。针对这一问题,在编译技术上有PGO和Bolt两种解决办法,两者都是一种通过收集程序在运行时如跳转,调用关系,函数热度等执行信息,这些收集到的程序运行情况数据(profile data),可以更好地指导一些程序优化的策略,如是否对函数进行内联,以及对基本块和函数布局的排布来提高特定场景下的程序性能。
3953 2
BOLT 二进制反馈优化技术
|
存储 缓存 监控
安谋科技(Arm China)马闯:Arm架构下性能分析与优化介绍
2023年9月19日,系列课程第九节《Arm®架构下性能分析与优化介绍》正式上线,由安谋科技 (Arm China)主任工程师马闯主讲,内容涵盖:Arm架构下性能监控单元 (PMU) 介绍、Arm统计性能分析扩展 (SPE) 介绍、Arm性能分析工具介绍、Arm架构下性能优化案例分享,本期节目在阿里云官网、阿里云微信视频号、阿里云钉钉视频号、InfoQ官网、阿里云开发者微信视频号、阿里云创新中心直播平台 & 微信视频号同步播出,同时可以点击【https://developer.aliyun.com/topic/ecs-yitian】进入【倚天实例迁移课程官网】了解更多内容。
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
动态图 vs 静态图:深度学习框架到底该怎么选?别再被“概念战”忽悠了
动态图 vs 静态图:深度学习框架到底该怎么选?别再被“概念战”忽悠了
405 6
|
监控 关系型数据库 MySQL
MySQL 5.7在高并发下性能劣化问题的详细剖析
TL;DR MySQL 5.7高并发读写混合场景下rt飙升,业务系统大量超时报错。本文总结了阿里业务场景下遇到的坑,剖析问题背后的原因,帮助读者更好的理解MySQL内核原理,降低升级MySQL 5.7的风险。
10398 0
|
并行计算 PyTorch 算法框架/工具
《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》
torch.compile是PyTorch 2.3推出的革命性功能,通过即时编译(JIT)技术优化模型运行速度。它借助TorchDynamo提取计算图,并通过TorchInductor生成高度优化的CUDA内核,充分发挥GPU并行计算能力。支持默认、reduce-overhead和max-autotune三种模式,分别适用于不同性能需求场景。尽管在复杂模型或动态计算图中可能面临挑战,但通过调整参数或结合其他优化技术,仍可显著提升性能。这一工具极大简化了CUDA代码优化流程,为深度学习开发提供了强大支持。
828 10
|
存储 SQL 缓存
Perf Arm SPE介绍与使用
本次分享的主题是 Perf Arm-SPE 的介绍及使用,本次分享主要介绍如何在倚天 710 平台上利用 Arm-SPE 特性定位伪共享问题、分析内存访问、分析指令延时以及监控访存延时等功能。 1. 背景介绍 2. Arm SPE的原理 3. Arm SPE在倚天服务器上的应用 4. Arm SPE 更多特性与功能的探索
1594 0
|
缓存 关系型数据库 MySQL
MySQL Buffer Pool 解析:原理、组成及作用
MySQL Buffer Pool 解析:原理、组成及作用
|
Web App开发 编译器 测试技术
Go PGO 快速上手,性能可提高 2~4%!
Go PGO 快速上手,性能可提高 2~4%!
|
运维 搜索推荐 调度
Ha3搜索引擎简介
Ha3是阿里巴巴搜索团队开发的搜索引擎平台,它为阿里集团包括淘宝、天猫在内的核心业务提供搜索服务支持。
26808 1