【LLVM】学习使用PGO优化

笔者在查看PGO优化时看到了本站的这篇文章,其中代码和命令行部分贴上了序号,且命令行带上了$符号,不便于读者调试。
遂将代码重新整理到gitee,链接在此。

汇编代码分析

目前笔者使用的llvm版本为llvm-19,主要改动发生在生成的汇编文件上,可以看到,在使用PGO优化的版本里,已经没有了分支指令(不再存在两个不同的分支)。在这里插入图片描述优化前的汇编代码:

main:                                   # @main.cfi_startproc
# %bb.0:movl	XX(%rip), %eaxmovl	YY(%rip), %ecxcmpl	$2, %edijl	.LBB0_2
# %bb.1:addl	$2, %eaximull	%eax, %ecx
.LBB0_3:movl	%eax, XX(%rip)movl	%ecx, YY(%rip)xorl	%eax, %eaxretq
.LBB0_2:decl	%eaxsubl	%eax, %ecxjmp	.LBB0_3

可以看到,首先将XX分配给eax寄存器,然后将YY分配给ecx寄存器,分别有%bb.1和.LBB0_2两处不同的处理,对应着源代码中true分支和false分支的处理。

优化后的汇编代码:

main:                                   # @main.cfi_startproc
# %bb.0:movl	XX(%rip), %eaxmovl	YY(%rip), %ecxleal	2(%rax), %edxmovl	%ecx, %esiimull	%edx, %esidecl	%eaxsubl	%eax, %ecxcmpl	$2, %edicmovgel	%edx, %eaxcmovgel	%esi, %ecxmovl	%eax, XX(%rip)movl	%ecx, YY(%rip)xorl	%eax, %eaxretq

关键在于true分支的值存放在edx和esi中,false分支的值放置在eax和ecx中,当程序进行到判断结构时,如果为true的情况,就将edx移动到eax,将esi移动到ecx中,使得最终的结果始终分别存放在eax和ecx两个寄存器当中。

涉及代码分析

lib/CodeGen/MachineBlockPlacement.cpp
此文件的部分主体逻辑基本未变化,把BranchProbability SuccProb = getAdjustedProbability(RealSuccProb, AdjustedSumProb);看成计算出一个可用的概率的结果就可以了,其他部分基本无障碍。

/// The helper function returns the branch probability that is adjusted
/// or normalized over the new total \p AdjustedSumProb.
static BranchProbability
getAdjustedProbability(BranchProbability OrigProb,BranchProbability AdjustedSumProb) {BranchProbability SuccProb;uint32_t SuccProbN = OrigProb.getNumerator();uint32_t SuccProbD = AdjustedSumProb.getNumerator();if (SuccProbN >= SuccProbD)SuccProb = BranchProbability::getOne();elseSuccProb = BranchProbability(SuccProbN, SuccProbD);return SuccProb;
}

贴一个Chatgpt的解释:
这个函数的作用是根据给定的原始分支概率(OrigProb)和调整后的总和概率(AdjustedSumProb),返回一个调整后的分支概率(SuccProb)。

具体来说,函数的步骤如下:

  1. 获取原始分支概率的分子 SuccProbN,这是原始概率的分子部分。
  2. 获取调整后总和概率的分子 SuccProbD,这是调整后总和概率的分子部分。
  3. 检查原始概率的分子部分 SuccProbN 是否大于等于调整后总和概率的分子部分 SuccProbD。如果是,则将调整后的分支概率 SuccProb 设置为最大可能的分支概率,即 BranchProbability::getOne(),这表示概率为100%。
  4. 否则,根据 SuccProbN 和 SuccProbD 创建一个新的 BranchProbability 对象 SuccProb,这个对象将成为函数的返回值。

因此,这个函数的核心目的是根据原始分支概率和调整后的总和概率,计算并返回一个调整后的分支概率,确保它在有效的概率范围内(0到1之间),以反映新的条件或上下文下的分支可能性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362405.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql从小白到高手 九 : psql高级查询及内部视图使用

Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询 文章目录 Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询一、多表查询二、pgsql内部表1.内部表2.内部表查询应用 一、多表查询 内联 :inner join on 简写 join on 结果集只有符合 筛选条件…

【Golang】Steam 创意工坊 Mod 文件夹批量重命名

本文将介绍一个使用Go语言编写的脚本,其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名,并且重命名规则依赖于XML文件内容的情况。 脚本功能概述 Steam创意工坊下载的Mod文件夹批量重命名为id名称 运行前…

maven仓库的作用以及安装 , DEA配置本地Maven

ay12-maven 主要内容 Maven的作用Maven仓库的作用Maven的坐标概念Maven的安装IDEA配置本地Maven 一、maven概述 1.1、项目开发中的问题 1、我的项目依赖一些jar包,我把他们放在哪里?直接拷贝到项目的lib文件夹中?如果我开发的第二个项目还是需要上面…

Linux系统编程(七)进程间通信IPC

进程间通讯的7种方式_进程间通信的几种方法-CSDN博客 管道 pipe(命名管道和匿名管道);信号 signal;共享内存;消息队列;信号量 semaphore;套接字 socket; 1. 管道 内核提供&#x…

亿发进销存管理系统+:多终端无缝协同,实现经营销售场景全覆盖

亿发软件凭借产品、市场、业务的深入理解,在进销存基础上进行了延伸,推出多终端、一体化的“进销存管理系统”多元产品矩阵。对企业经营中进货、出货、销售、付款等进行全程跟踪管理。有效辅助企业解决业务管理、销售管理、库存管理、财务管理等一系列问…

如何做到高级Kotlin强化实战?(一)

高级Kotlin强化实战(一) 第一章 Kotlin 入门教程1.Kotlin 入门介绍2.Kotlin 与 Java 比较 第一章 Kotlin 入门教程 1.Kotlin 入门介绍 Kotlin 概述 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言。它主要是 JetBrains 开发团队所开发出来的编程…

卸载vmware时2503,2502报错的解决办法

1.背景 windows 卸载vmware时,显示2503报错,无法完全卸载 2. 解决方案 2.1 参考安装报错2502,2503的处理方式 文献:https://blog.csdn.net/zhangvalue/article/details/80309828 2.1 步骤: 2.1.1 cmd 管理员打开…

实时美颜技术解析:视频美颜SDK如何改变直播行业

实时美颜技术的出现,尤其是视频美颜SDK的应用,正逐渐改变着直播行业的生态。 一、实时美颜技术的原理 实时美颜技术利用人工智能和图像处理算法,对视频中的人物面部进行优化和修饰。该技术通常包含以下几个步骤: 1.人脸检测和识…

MMCV【mmclassification】 从0到1 之 Docker 容器环境搭建步骤总结

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 📙 Linux 下 Docker 安装环境检查Docker 安装 [ root 或者 sudo 权限用户可安装 ]给 普通用户 加入 Docker …

RedisConnectionException: Unable to connect to localhost/<unresolved>:6379

方法一:删除配置密码选项 一般是因为你在启动redsi服务的时候没有以指定配置文件启动 把application.yml文件中的redis密码注释掉 方法二 以指定配置文件启动 这样就不用删除yml文件中密码的选项了 在redis,windows.conf 中找到requirepass,删除掉前…

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击

import pyautogui import cv2 import numpy as np import mathdef find_and_click(template_path, target_x, target_y, match_threshold0.8):"""在屏幕上查找目标图片并点击。Args:template_path: 目标图片的路径。target_x: 预设的坐标 x 轴值。target_y: 预设…

ComfyUI中运行Stable Audio Open,实现背景音乐、音效自由

🧨背景 stability在一个月之前默默的发布了Stable Audio Open 1.0的音频音效生成模型,不过好像影响力一般,也没有太多文章分享测试,而今天看comfyui作者的一篇介绍文档,他已经让comfyui默认支持了这个模型。 原开源地…

学分制系统 WebService_PantoSchool SQL注入致RCE漏洞复现

0x01 产品简介 学分制系统由上海鹏达计算机系统开发有限公司研发,是基于对职业教育特点和需求的深入理解,结合教育部相关文件精神,并广泛吸纳专家、学者意见而开发的一款综合性管理系统。系统采用模块化的设计方法,方便学校根据自身教学改革特点、信息化建设进程情况选择、…

如何预防和处理他人盗用IP地址?

IP地址的定义及作用 解释 IP 地址在互联网中的作用。它是唯一标识网络设备的数字地址,类似于物理世界中的邮政地址。 1、IP地址盗窃的定义 解释一下什么是IP地址盗用,即非法使用他人的IP地址或者伪造IP地址的行为,这种行为可能引发法律和安…

uniapp 实人认证

最下面有demo 首先Dcloud创建云服务空间,开启一键登录并充值 下一步 1. 右键项目 》 创建uniCloud云开发环境 》右键uniCloud》关联云服务空间 2. cloudfunctions右键 新建云函数,任意命名(例:veify),然…

elasticsearch重置密码

0 案例背景 Elasticsearch三台集群环境,对外端口为6200,忘记elasticsearch密码,进行重置操作 注:若无特殊说明,三台服务器均需进行处理操作 1 停止es /rpa/bin/elasticsearch.sh stop 检查状态 ps -ef|grep elast…

【Linux】ss 命令使用详解

目录 一、ss命令介绍 二、ss命令格式和使用 1、命令格式 2、ss命令的常用选项 3、命令的常见用法 3.1 找出打开套接字/端口应用程序 3.2 检查系统的监听套接字 3.3 显示所有状态为established的SMTP连接 3.4 查看建立的 TCP 连接 3.5 通过 -r 选项解析 IP 和端口号 …

UI(三)布局

文章目录 1、Colum和Row——垂直方向容器和水平方向容器2、ColumnSplit和RowSplit——子组件之间插入一条分割线3、Flex——弹性布局子组件的容器4、Grid和GridItem——网格容器和网格容器单元格5、GridRow和GridCol——栅格容器组件和栅格子组件6、List、ListItem、ListItemGr…

Mac OS 安装frida

安装frida和frida-tools Python是基础,提前装好Python 终端执行 python3 -m pip install frida 如果出现error 按照提示处理 信息提示:brew install pipx 于是终端执行: brew install pipx 安装frida: pipx install frida…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下,长沙市政府正积极拥抱智慧城市建设,以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验,成功中标长沙市政务共性能力建设项目,这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…