CPU性能优化-基于源代码的CPU调优

一 在第二部分,我们将讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。对于性能敏感型应用程序,如大型分布式云服务,科学高性能计算软件,3A 级游戏等,了解底层硬件的工作原理是非常重要的。若在程序开发对没有关注硬件,那么从一开始就注定会失败。

标准的算法和数据结构在性能敏感型负载上并不总能表现得很好。传统链表的每个节点都是动态分配的,除了引入很多耗时的内存分配动作,很可能让链表中的所有元素分散在内存中,遍历该数据结构需要对每个元素进行随机内存访问。即使算法复杂度仍然是O(N), 但是实际上🎨耗时比简单数组还要多,有些数据结构比如二叉树,有着天然的类似链表的结构表示,所以使用指针追踪的方式实现他们可能性能更好。不过,这些数据结构还有更高效的扁平化版本,比如boost::flat_map和boost::flat_set。

即使你选择的算法在解决特定问题时最有名,但是在你的特定场景上它不一定表现最优。例如,二分搜索在排序数组中查找元素方面时最优的。然而,该算法经常会有很多分支预测错误的问题,因为每次元素值的检查都只有50%的概率为真。这就是为何线性搜索通常在小型整型数组上表现得更好。

性能工程时一门艺术,和其他艺术类似,可能的场景范围是没有边界的。本章尝试专注于与CPu微架构相关的优化,而不是覆盖所有你能想到的优化机会。尽管如此,我想还是有必要列出一些上层的优化点。

1 如果程序是使用解释语言开发的,那么可以使用开销更低的语言重写程序的性能关键部分。

2 分析程序中使用的算法和数据结构,看看是否可以找到更好的。

3 调优编译器参数,检查是否至少使用了这三个编译器标签:-O3 -march 启用针对待定CPU系列的优化功能和-flto 启用过程间优化功能。

4 如果问题是高度并行化的计算,那么把程序线程化或者考虑吧程序放在GPU上运行。

5 当等待IO操作时,使用同步IO以避免阻塞

6 利用更多RAM来减少必须使用的CPU和IO量

数据驱动的优化

数据驱动的优化是最重要的调优技术之一,它基于对程序正在处理的数据结构的洞察。该方法聚焦于数据的分布及其在程序中的转化方式,该方法的典型例子是数组结构体(structure-Of-array, SOA)到结构体数组。

这类优化需要知道程序会处理哪些数据和数据的分布情况,然后相应的修改程序。

现代CPU是非常复杂的设备,我们几乎不可能预测某段代码如何运行。CPU指令的执行依赖很多因素,变化的组件太多了,以至于人们不得不认真对待。幸运的是,借助第6章讨论过的性能监控功能,我们可以从CPU的角度观察代码。

注意,实现的优化不一定对所有的平台都有效果。例如,循环阻塞非常依赖系统内存的层次特征,尤其是L2和L3缓存的大小。因此,为具有特性L2和L3缓存大小的CPU调优的算法,在具有较小缓存的CPU上表现不一定好,在程序将要运行的平台上测试这些变化是非常重要的。

接下来的三章是按最便于使用TMA方法的方式组织的,这样分类的初衷是为工程师提供某种检查清单,以便他们高效的消除TMA揭露的低效问题。同样这里并不打算给出能到的转换。

相关推荐
Web3&Basketball15 小时前
LLM 峰谷定价怎么吃满:一个能对账的错峰调度器
python·性能优化·大模型·任务调度·成本优化·deepseek·推理优化
yunwei3716 小时前
eBPF 教程:追踪 CUDA GPU 操作
linux·后端·性能优化
狼爷19 小时前
磁盘IO打满怎么办?我用5个真实案例,总结了这套可复用的排查方法论
后端·性能优化
hhzz1 天前
【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化
人工智能·python·opencv·性能优化
HwJack201 天前
HarmonyOS批量数据与性能优化实战:万条数据入库与不卡 UI 的查询
ui·性能优化·harmonyos
长征coder1 天前
【无标题】
java·性能优化
昇腾知识体系1 天前
昇腾 950 RegBase 性能优化:从 msprof 采数到优化手法
人工智能·华为·性能优化·知识图谱
风哥2号2 天前
数据库教程FGMT13‑Oracle性能优化之数据仓库与分区表
数据库·oracle·性能优化
爱喝水的鱼丶2 天前
SAP-ABAP:隐式/显式增强开发规范与避坑指南:10 类典型错误与运维方案
运维·性能优化·sap·abap·增强·经验交流
风哥2号2 天前
数据库教程FGMT17‑Oracle性能优化之故障诊断与性能优化
数据库·oracle·性能优化