【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.mzph.cn/pingmian/36365.shtml

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

相关文章

RK3588编译环境配置

安装Ubuntu18.04 安装Ubuntu请参考其他教程 安装vmware-tools 如果vmware版本过低,vmware-tools安装可能会出现各种问题。 建议直接用apt-get install安装vmware-tools sudo apt-get update sudo apt-get install open-vm-tools open-vm-tools-desktop vmware-…

从CVPR 2024看域适应、域泛化最新研究进展

域适应和域泛化一直以来都是各大顶会的热门研究方向。 域适应指:当我们在源域上训练的模型需要在目标域应用时,如果两域数据分布差异太大,模型性能就有可能降低。这时可以利用目标域的无标签数据,通过设计特定方法减小域间差异&a…

Flutter笔记(一)- 安装和配置Flutter

一、下载Flutter 访问网址:https://docs.flutter.dev/get-started/install?hlzh-cn 根据电脑所使用的操作系统的平台进行选择。笔者电脑的操作系统为Windows,因此选择如图1-1的Windows图片: 图1-1 Flutter网站(一) …

国行版苹果Vision Pro即将发售 高昂定价吓退普通消费者?

2024年2月2日,苹果第一代空间计算设备Vision Pro在美国上市。6月28日,国行版苹果Vision Pro也将正式发售,别为256GB版29999元、512GB版31499元、1TB版32999元。不过从此前Vision Pro预售情况来看,Vision Pro的“杀手锏”在“价格”…

【应届应知应会】Linux常用指令

SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:保留赤子之心也许是种幸运吧 本文封面由 凯楠📸友情提供 目录 文件与目录管理 目录操作命令: ls [选项] [目录或文件] mkdir 文件操作命令&#xf…

多媒体本地化的五个步骤

多媒体本地化为试图在多个全球目的地建立市场的企业提供了许多好处。 由于多媒体并不局限于一个内容标签,因此您需要注意一些元素。 这个过程通常从翻译开始,但因为我们处理的是视频和音频,所以从一开始就要处理一个附加层。让我们从这里开…

SqlServer 2008远程过程调用失败,错误代码[0x800706be]

1、解决方式: 将SQL 2008 R2升级到SP1或SP2 下载地址:SQL Server 2008 R2 Service Pack 2下载地址

非最大值抑制(NMS)函数

非最大值抑制(NMS)函数 flyfish 非最大值抑制(Non-Maximum Suppression, NMS)是计算机视觉中常用的一种后处理技术,主要用于目标检测任务。其作用是从一组可能存在大量重叠的候选边界框中,筛选出最具代表…

初学51单片机之长短键应用定时炸弹及扩展应用

51单片机RAM区域划分 51单片机的RAM分为两个部分,一块是片内RAM,一块是片外RAM。 data: 片内RAM从 0x00 ~0x7F 寻址范围(0-127) 容量共128B idata: 片外RAM从 0x00~0xFF 寻址范围(0-255) 容量共256B pdata&am…

定位问题6.27 petal数据接口问题

petal接口响应结果 响应结果为空的数据,而我们需要的是正确的响应结果。 排查问题 确认接口是否正确 以下是爬虫的配置文件内容,我查看了PETAL_URL的接口,并询问接口开发人员,得知接口地址并未改变 确认接口请求体是否正确 我使…

记一次对ouija渗透测试c语言逆向学习

概要 初始知识 web应用枚举 二进制逆向 文件枚举 堆栈溢出 学到知识 hash长度攻击 任意文件读取 二进制逆向分析 信息收集 端口扫描 nmap --min-rate 1000 -p- 10.129.30.104 发现22,80,3000端口 网站探测 目录枚举 feroxbuster -u http://10.1…

“数字政协”平台如何提高政协工作效率?正宇软件助力建设!

随着信息技术的飞速发展,数字化已成为推动各行各业转型升级的重要力量。在政协工作中,数字政协平台的建设与运用,正成为提高政协工作效率、促进民主协商的重要手段。本文将从数字政协平台的功能特点、优势分析以及实践应用等方面,…

何用Vue3和Plotly.js打造交互式3D图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 利用 Plotly.js 创建交互式动画图表 应用场景 本代码适用于需要创建交互式动画图表的数据可视化项目。例如,可以用来展示时间序列数据或比较不同函数的行为。 基本功能 该代码使用 Plotly.js 库…

架构师篇-5、架构语言-ArchiMate

内容摘要: TOGAF内容元模型TOGAF架构语言ArchiMate3ArchiMate实践案例分享 TOGAF内容框架【核心内容元模型】 作为一个通用且开放式的标准,TOGAF需要采用一种非常灵活的方式来对其内容元模型进行定义,从而使得不同的企业可以根据自身需要对…

头歌——机器学习——决策树案例

第1关:基于决策树模型的应用案例 任务描述 本关任务:使用决策树算法完成成人收入预测。 相关知识 为了完成本关任务,你需要掌握:1.数据特征处理,2.使用决策树算法完成成人收入预测。 数据处理及特征工程 本次任务…

2024最新特种设备(锅炉作业)题库分享。

1.锅炉蒸发量大小是由(  )决定的。 A.压力的高低 B.受压元件多少 C.受热面积大小 答案:C 2.哪项不是自然循环的故障?( ) A.停滞 B.倒流 C.下降管带汽 D.上升管带汽 答案:D 3.水冷壁被现代大型锅炉广泛采用的是(  )。 A.光管水冷壁 B.膜…

【C++】继承(详解)

前言:今天我们正式的步入C进阶内容的学习了,当然了既然是进阶意味着学习难度的不断提升,各位一起努力呐。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C学习 👈 &#…

RabbitMQ安装部署

简介 RabbitMQ一款知名的开源消息队列系统,为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见,课程为大家演示快速搭建RabbitMQ环境。 安装 rabbitmq在yum仓库中的版本比较老,所以我们需要手动构建yum仓库…

# Kafka_深入探秘者(8):kafka 高级应用

Kafka_深入探秘者(8):kafka 高级应用 一、kafka 消费组管理 1、kafka 命令行工具 参考官网: http://kafka.apache.org/22/documentation.html 2、kafka 消费组管理:查看消费组 # 切换到 kafka 安装目录 cd /usr/local/kafka/…

leetCode.91. 解码方法

leetCode.91. 解码方法 题目思路 题解 class Solution { public:int numDecodings(string s) {int n s.size();// dp 中f[0]一般不做使用&#xff0c;只是存一个初值1&#xff0c;表示默认由一种方案s s;vector<int> f( n 1 );f[0] 1;for ( int i 1; i < n;…