Linux C/C++ PGO优化说明

2023-11-03

PGO (Profile Guided Optimization)

是指利用程序运行过程中采集到的 profile 数据,来重新编译程序以达到优化效果的 post-link 优化技术。其原理认为,对于特征相似的 input,程序运行的特征也相似,因此,我们可以把运行期的 profile 特征数据先采集一遍,再用来指导编译过程进行优化。

方案实施

方案一:

  1. 添加编译参数:-fprofile-instr-generate完整编译项目
  2. 启动项目进程,像平常一样运行程序,尽可能多覆盖常用的功能点。会自动在当前目录生成default.profraw文件
  3. 执行命令llvm-profdata merge -output=profile.profdata default.profraw将采样文件转化成llvm编译认识的指导文件。程序每次运行都会生成新的profraw文件,如果不指定名称会覆盖上次的default.profraw,可以使用环境变量LLVM_PROFILE_FILE=${WOKR_DIR}/${PROGRAM_NAME}.profraw来指定生成的文件名,然后执行llvm-profdata merge -output=profile.profdata *.profraw来生成profdata文件
  4. 移除参数-fprofile-instr-generate,添加参数-fprofile-instr-use=${WORK_DIR}/profile.profdata重新编译项目源码
  5. 运行程序执行相同的操作,验证效率优化的结果。

方案二:

此方案需要CPU支持IBS

  1. 添加编译参数:-funique-internal-linkage-names -fdebug-info-for-profiling,添加链接参数-Wl,--no-rosegment编译项目源码(-funique-internal-linkage-names clang9不支持,这里升级到了clang15)
  2. 启动项目进程。
  3. 利用perf工具对程序进行采样,运行perf record -p <pid> -e cycles:up -j any,u -a -- sleep 60,在此期间点击程序常用操作和功能。生成perf.data文件
  4. 执行create_llvm_prof --profile perf.data --binary <运行的可执行程序> --out=llvm.prof生成llvm.prof编译指导文件
  5. 去掉之前的编译参数,加上编译参数-fprofile-sample-use=llvm.prof重新编译项目源码
  6. 运行程序执行相同的操作,验证效率优化的结果。

参考资料

  • https://blog.csdn.net/ByteDanceTech/article/details/124030419
  • https://source.android.google.cn/docs/core/perf/pgo?hl=zh-cn
  • https://www.xujun.org/note-157156.html
  • https://blog.csdn.net/Rong_Toa/article/details/124604534
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C/C++ PGO优化说明 的相关文章

  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • 人脸检测初级心得——分享一些比较易懂的经验与方法

    一 最重要的是一定一定 要谨慎一些 尤其是在安装配置深度学习环境时 尽量找一些比较好的教程跟着来 不要换教程 因为可能方法都不一样 导致环境安装失败 很头疼 二 我建议大家可以先不要着急 可以先看一些理论的知识 然后慢慢去实现 这样会理解的
  • 判断数组的方式(原型链,instanceOf)

    var arr 1 2 3 Array isArray arr true Object prototype toString call arr object Array arr constructor Array true arr inst
  • linux 提高文件读写速度 mmap,linux读写文件速度测试

    一 文件一次读入速度 linux下读文件这东西最后都是要通过系统调用sys read fd buf count 来实现的 所以如果要提高速度 就是最简单地调用sys read的封装 比如直接用read 或fread 下面是我在linux下的
  • 记一次javaMetaspace导致CPU200%的排查

    记一次javaMetaspace导致CPU200 的排查 1 场景 2 装arthas 3 分析代码 4 罪魁祸首 1 场景 insertMotionDataByWxCallBack方法并发多 其实也没多少 可能就3个 就导致CPU200
  • 校园网自动登录、断网重连

    校园网自动登录 断网重连 适用北航 其他学校可以照着模板自行修改 在ubuntu测试 windows应该也能用 需要下载chrome以及对应版本的chrome driver from selenium import webdriver fr
  • 数控加工插补功能指令

    1 G00 快速定位指令 格式 G00 XYZ 格式含义 G00 指令使刀具以点位控制方式从刀具当前点以最快速度运动到另一点 其轨 迹不一定是两点一线 有可能是一条折线 须知 1 刀具从上向下移动时 G00 XY Z 先定 XY 面 然后
  • vue.js -- 组件传值校验及单项数据流

    目录 组件间传值 静态传值 动态传值 params传值 传值校验 type校验 required校验 default校验 validator校验 单项数据流 总结 组件间传值 父子组件间传值 子组件通过props这个属性接受父组件传递过来的
  • 二十九、java版 SpringCloud分布式微服务云架构之Java 数据结构

    Java 数据结构 Java工具包提供了强大的数据结构 在Java中的数据结构主要包括以下几种接口和类 枚举 Enumeration 位集合 BitSet 向量 Vector 栈 Stack 字典 Dictionary 哈希表 Hashta
  • OpenCV 中的 remap 函数

    上一篇文章中提到 warpAffine 会分块处理 将坐标映射和插值系数分别存储下来 然后借助 remap 来实现最终的映射 而 remap 会根据映射关系取源像素并加权计算出目的像素值 其最核心的计算为 RemapVec 8u cv re
  • Python-leetcode1

    1 题目 给定一种规律 pattern 和一个字符串 str 判断 str 是否遵循相同的规律 这里的 遵循 指完全匹配 例如 pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律 示例1 输入 pat
  • MATLAB——讨论系统的极点位置对系统响应的影响

    题目1 研究z右半平面的实数极点对系统响应的影响 已知系统的零 极点增益模型分别为 H 1 z z
  • win7+vue+element-ui初始化

    win7最高支持nodejs13 14版本 vue cli脚手架版本不能过高 我这边安装的是4 5 13的版本 1 卸载原有的vue cli 原版本为2 9 6 npm uninstall g vue cli 2 安装最新版的vue cli
  • 【DL】第8章 序列到序列的映射

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • file转化为binary对象发送给后台

    具体代码如下 function filechange e var file filed get 0 files 0 var fileSize file size fileType file type if file name lastInd
  • 微信公众帐号开发教程第1篇-引言 .

    接触微信公众帐号已经有两个多月的时间了 在这期间 除了陆续完善个人公众帐号xiaoqrobot以外 还带领团队为公司开发了两个企业应用 一个是普通类型的公众帐号 另一个是会议类型的公众帐号 经过这3个公众帐号的开发 对目前微信公众平台开放的
  • 二叉树之小球下落问题(js)

    有一棵二叉树 最大深度为D 且所有叶子的深度都相同 所有结点从上到下从左到右编号为1 2 3 2 D 1 在结点1处放一个小球 它会往下落 每个内结点上都有一个开关 初始全部关闭 当每次有小球落到一个开关上时 它的状态都会改变 当小球到达一
  • HDFS——如何将文件从HDFS复制到本地

    下面两个命令是把文件从HDFS上下载到本地的命令 get 使用方法 Hadoop fs get ignorecrc crc 复制文件到本地文件系统 可用 ignorecrc选项复制CRC校验失败的文件 使用 crc选项复制文件以及CRC信息
  • windows网络模型

    完成端口 详解 解释的不错 http blog csdn net beyond cn article details 9336043 Windows Socket五种I O模型 http www cppblog com beautyking
  • Grayhill 072 16进制键盘扫描器的Verilog实现

    知识点 1 按键的机械原理 如何用一个module 模拟出按键的功能 体现的是抽象描述的能力 2 同步装置 因为按键输入的是异步信号 必须经过同步 因为s row 信号在经过同步装置后立马进入一个组合逻辑 为了消除潜在的冒险 这个例子中同步
  • Linux C/C++ PGO优化说明

    PGO Profile Guided Optimization 是指利用程序运行过程中采集到的 profile 数据 来重新编译程序以达到优化效果的 post link 优化技术 其原理认为 对于特征相似的 input 程序运行的特征也相似