CPU性能优化--函数分组

热点函数可以被分组一起进一步提升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.rhkb.cn/news/493362.html

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

相关文章

Unity3D仿星露谷物语开发7之事件创建动画

1、目标 掌握事件通知的Publisher - Subscriber设计模式,并通过事件通知触发动画。 2、发布者/订阅者模式 首先,定义事件Event 然后,Publisher触发事件 最后,Subscriber订阅事件并进行处理 (1)创建动作…

点击展示大图预览

原文链接在table表格里能够实现,点击里面的图片实现大图预览的效果; 一、先安装viewer — 使用npm安装 npm install v-viewer --save二、在main.js中引入 import Viewer from v-viewer //点击图片大图预览 import viewerjs/dist/viewer.css Vue.use(…

安全算法基础(一)

安全算法是算法的分支之一,还的依靠大量的数学基础进行计算,本文参照兜哥的AI安全样本对抗,做一个简单的算法安全概括,从零学习。 最新的安全算法对于我们常规的攻击样本检测,效果是不理想的,为了探究其原…

aioice里面candidate固定UDP端口测试

环境: aioice0.9.0 问题描述: aioice里面candidate固定UDP端口测试 解决方案: /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件,比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …

linux-----网络编程

网络编程基础概念 IP地址:是互联网协议地址,用于在网络中唯一标识一台设备。在IPv4中,地址是32位的二进制数,通常以点分十进制表示,如192.168.1.1。IPv6是128位的地址,用于提供更多的地址空间,格…

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮,本次基于蓝牙通信的手机遥控智能灯设计功能如下: (1)用户可以通过蓝牙通信模块的作用下,在手机端遥控切换智能灯不同的工作模式; &#x…

阿里云百炼大模型生成贪吃蛇小游戏

阿里云百炼大模型生成贪吃蛇小游戏 为了在贪吃蛇游戏中添加背景音乐,我们可以使用Pygame的mixer模块。以下是修改后的代码,包含了背景音乐的加载和播放功能: 安装Pygame(如果你还没有安装): pip install p…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍算法原理算法特点应用场景局限性 FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR1…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法,如网格和点云,适合GPU加速的光栅化操作,但缺乏灵活性。而基于神经辐射场(NeRF)的表示方式,尽管质量高,但需要高成本的训练和渲染时间。此外&#xff0…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio,网址:https://developer.android.com/studio?hlzh-cn 2.下载加速器,注册账号,开启加速器。网址:放在文末。 3.下载安卓代码,项目的路径上不能有中文,特别是…

不会心理描写,神态描写怎么办?

不会心理描写,神态描写怎么办? 文学创作,精微之处在于心理与神态之描绘。 一、夯实基础,积累素材。 欲使心理与神态描写生动,需先厚积薄发。博览群书,尤重经典之作。 “读万卷书,行万里路。…

【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】

本博客内容主要是如何在Windows系统上为Claude客户端(无需开通会员)配置模型上下文协议(Model Context Protocol, MCP)服务器。 为什么选择 MCP? MCP 可帮助您在 LLM 之上构建代理和复杂的工作流程。LLM 经常需要与数据和工具集成&#xff0…

React:闭包陷阱产生和解决

在 React 中,闭包陷阱是一个常见的问题,尤其是在处理异步操作、事件处理器、或是定时器时。理解闭包的工作原理以及它在 React 中如何与状态和渲染交互,可以帮助你避免陷入一些常见的错误。 一、闭包陷阱的产生 1、什么是闭包陷阱&#xff1…

使用xjar 对Spring-Boot JAR 包加密运行

1 Xjar 介绍 Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译。 功能特性 无需侵入代码,只需要把编译好的…

[LeetCode-Python版] 定长滑动窗口1(1456 / 643 / 1343 / 2090 / 2379)

思路 把问题拆解成三步&#xff1a;入-更新-出。 入&#xff1a;下标为 i 的元素进入窗口&#xff0c;更新相关统计量。如果 i<k−1 则重复第一步。更新&#xff1a;更新答案。一般是更新最大值/最小值。出&#xff1a;下标为 i−(k-1) 的元素离开窗口&#xff0c;更新相关…

【AIGC-ChatGPT进阶副业提示词】末日生存指南 2.0:疯狂科学家的荒诞智慧

引言 在这个不断变化的世界中&#xff0c;末日似乎总是lurking在角落。但是&#xff0c;亲爱的幸存者们&#xff0c;不要害怕&#xff01;因为我&#xff0c;疯狂科学家2099&#xff0c;正在这里为你们带来最新版本的末日生存指南。这不是你祖母的应急手册&#xff0c;而是一本…

Web3.0安全开发实践:探索比特币DeFi生态中的PSBT

近年来&#xff0c;部分签名比特币交易&#xff08;PSBT&#xff09;在比特币生态系统中获得了显著关注。随着如Ordinal和基于铭文的资产等创新的兴起&#xff0c;安全的多方签名和复杂交易的需求不断增加&#xff0c;这使得PSBT成为应对比特币生态不断发展中不可或缺的工具。 …

Edge Scdn防御网站怎么样?

酷盾安全Edge Scdn&#xff0c;即边缘式高防御内容分发网络&#xff0c;主要是通过分布在不同地理位置的多个节点&#xff0c;使用户能够更快地访问网站内容。同时&#xff0c;Edge Scdn通过先进的技术手段&#xff0c;提高了网上内容传输的安全性&#xff0c;防止各种网络攻击…