【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…

C++生产者-消费者无锁缓冲区的简单实现

文章目录 1. 引言2. SPSC 环形缓冲区设计思想3. 缓冲区类定义4. 追加数据5. 读取数据6. 完整代码7. 基准测试7.1. 测试代码 8. 执行结果 1. 引言 本文将介绍如何实现无锁字节缓冲区(LockFreeBytesBuffer),并通过Google Benchmark对其性能进行…

强化学习盾牌:scikit-learn模型正则化全面指南

🛡️ 强化学习盾牌:scikit-learn模型正则化全面指南 🛡️ 在机器学习中,模型正则化是一项关键技术,用于防止过拟合,提高模型的泛化能力。scikit-learn,作为Python中一个功能强大的机器学习库&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…

即时和及时的微妙区别

即时与及时在汉语中的确存在一些微妙的区别,以下是对这两个词的分析,并通过例子进行说明: 一、词义与词性 即时:具有立刻、马上的意思,强调在某个时间段立即出现、产生或做出,侧重于和当时实际情况同步。…

Leetcode-Java 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: s "bbbbb" 输出: 1 解释: 因为无重复…

无缝集成的艺术:iCloud与Apple TV的协同之旅

无缝集成的艺术:iCloud与Apple TV的协同之旅 在苹果构建的生态系统中,iCloud和Apple TV是两个重要的组成部分,它们共同为用户提供了一种无缝的娱乐体验。iCloud作为苹果的云服务,不仅存储用户的照片、视频、文档等数据&#xff0…

定位问题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需要采用一种非常灵活的方式来对其内容元模型进行定义,从而使得不同的企业可以根据自身需要对…