CPU性能优化--函数分组

news/2024/12/22 19:32:35/

热点函数可以被分组一起进一步提升CPU前端缓存利用率当热点函数分组在一起时候他们可能共用相同缓存行这会减少CPU需要读取缓存行数量

44给出了被分组函数foo,barzoo图形化展示默认布局需要读取四个缓存行优化布局函数foobarzoo代码只需要三个缓存行此外当我们foo调用zoozoo开始部分已经指令缓存中因为我们读取过缓存行

前面优化类似函数分组提升了指令缓存DSB缓存利用率当有很多小热点函数优化表现最好

连接器负责程序最终二进制输出所有函数排列布局虽然开发者可以尝试自己重排程序函数但是不能保证产生期望物理布局几十年人们一直使用连接器脚本完成这项工作如果使用GNU连接器那么你还需要使用这种方法Gold连接器 更简单方法可以做这件事要使用Gold连接器生成期望函数顺序可以先用-ffunction-sections 选项编译代码从而每个函数放到单独分区然后使用--section-ordering-file=order.txt 选项编译选项可以输入一个包含反应最终期望布局函数排序列表文件LLD连接器LLVM编译器基础设施一部分也有相同功能可以通过--symbol-ordering-file选项使用

调用函数一起函数放一起

另一种解决热点函数分组问题方法HFSort工具实现工具可以基于剖析数据自动生成分区排序文件通过工具工程师类似Facebook百度维基百科这样分布式应用实现2% 性能提升最近HFSort集成到了FaceBook HHVM不再作为单独工具LLD连接器采用HFSort算法实现根据剖析数据分区进行排序

7.7 基于剖析文件编译优化

编译程序乘胜最优汇编代码都是启发式行为在特定场景为了达到最优性能代码转码算法很多多边场景因为编译器需要做很多决策所以需要基于某些典型场景猜测最好选择例如决定某个函数是否需要內联编译器需要考虑函数调用次数但是问题编译器并不能提前知道这些信息

如果剖析信息方便获得的话基于指定剖析信息编译器可以做出更好优化决策大多数编译器中都有一组转换功能可以根据反馈给他们剖析数据调整算法这组转换功能被称为基于剖析文件编译优化Profile Guided Optimization, PGO 在文献中有时可以发现反馈定向优化FDO这个术语本质PGO同一个概念通常有剖析数据时编译器依赖剖析数据没有剖析数据时编译器会依赖剖析数据没有剖析数据使用启发标准算法

使用PGO真实负载性能优化15%很常见PGO不仅可以提升內联功能代码布局还会优化寄存器分配

剖析数据可以通过两种方法生成代码插桩和基于采样剖析两者用法都相对简单并且5.8我们也讨论它们相应优缺点

第一种方法需要先利用LLVM编译器使用-fprofile-instr-generate 选项编译器程序这样告诉编译器生成插桩代码这些插桩会在运行采集剖析信息然后LLVM编译器使用-fprofile-instr-use选项利用剖析数据重新编译器程序生成PGO调优二进制文件使用Clang PGO指导参考LLVM文档GCC编译器使用了不同编译器选项-fprofile-generate -fprofile-use具体请参考GCC文档

第二种方法基于此阿阳生成编译器所需要的剖析数据然后利用AutoFDO工具Linux perf生成采样数据转为类似GCCLLVM编译器可以理解的格式

编译器盲目使用你提供剖析数据编译器会假设所有负载表现都一样只会针对单一负载优化应用程序PGO用户需要非常小心选取需要剖析负载因为优化应场景另一个场景可能会劣化幸运的事由于不同负载剖析数据可以合并在一起代表应用程序一组使用场景所以不一定只是一个负载场景

7.8 ITLB优化

内存地址中虚拟地址无力地址翻译调优前端性能另一个重要领域这些翻译主要TLB完成TLB在某些条目缓存最近使用过内存页面翻译地址TLB不能完成翻译请求时需要进行耗时内核页表遍历一计算每个引用虚拟地址正确物理地址TMA显示ITLB开销,下面提供建议可能有所帮助

通过吧应用程序性能关键代码部分映射到大页可以减少ITLB压力需要这需要重新链接二进制文件子啊合适边界对齐代码准备大页映射除了使用大页用于优化指令缓存性能标准技术也可以用于提升ITLB性能重拍函数让热点函数更集中通过LTO/IPO减小热点区域大小使用PGO避免过度內联

转换

如何转换

为何有益

什么场景

执行者

基本块布局

维护热点代码直

避免分支耗时缓存利用率高

分之多代码

编译器

基本块对齐

使用NOP指令对热点代码进行移位

缓存利用率高

热点循环

编译器

函数拆分

冷代码放到独立函数中

缓存利用率更高

编译器

函数分组

热点函数分组到一起

缓存利用率更高

有很多热点函数

链接器


http://www.ppmy.cn/news/1557270.html

相关文章

solon 集成 activemq-client (sdk)

原始状态的 activemq-client sdk 集成非常方便&#xff0c;也更适合定制。就是有些同学&#xff0c;可能对原始接口会比较陌生&#xff0c;会希望有个具体的示例。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client&l…

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

ip_forward函数

ip_forward 函数是 Linux 内核中用于处理 IP 数据包转发的重要函数。它负责将数据包从一个网络接口转发到另一个网络接口。以下是这个函数的一些关键点和工作流程的概述: 1. **数据包接收**:当一个数据包到达网络设备(如以太网卡)时,内核会首先接收到这个数据包。 2. **路…

删除链表的倒数第N个结点(最优解)

题目来源 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]…

一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析

本文作为一个引入&#xff0c;作用是让读者理解熟知IIC协议关键内容&#xff0c;结合实际手册内容&#xff0c;深度解析协议本质&#xff0c;作为后续嵌入式linux驱动IIC子系统的一个铺垫。 目录 1. 硬件连接 2. IIC传输时序 2.1.写操作 2.2.读操作 2.3.I2C信号 3.IIC协议…

中间件介绍

中间件是一种位于操作系统和应用软件之间的系统软件&#xff0c;它提供了数据交换、应用集成、流程管理和安全保障等服务。以下是中间件的一些基本概念和应用场景&#xff1a; 中间件的定义 中间件是一种独立的系统软件或服务程序&#xff0c;它位于操作系统和应用软件之间&…

字符串解析 Python Basic (工业设备通用语言)

Basic&#xff1a; 通过字符串的操作来进行数据解析。先按照字母将字符串分割&#xff0c;然后对每个部分取合适的子串以得到需要的值。 代码 s "X79.004Y73.0022U0.0108444ALL" parts [] start 0 for i in range(1, len(s)): if not s[i].isdigit() a…

方正畅享全媒体新闻采编系统 reportCenter.do Sql注入漏洞复现(附脚本)

0x01 产品描述: 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、…