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揭露的低效问题。同样这里并不打算给出能到的转换。

相关推荐
南一Nanyi10 小时前
性能优化的方法论
前端·性能优化
SilentSamsara14 小时前
缓存策略实战:Redis + Python 多级缓存设计与失效策略
开发语言·redis·python·缓存·性能优化
wb0430720115 小时前
外卖大战——从阿明的“3 秒生死线“,看系统性能优化的全链路方法论
开发语言·性能优化·架构·php
1892280486115 小时前
NV041固态MT29F16T08GSLCEM9-QBES:C
人工智能·算法·microsoft·缓存·性能优化
qq_4523962316 小时前
第十八篇:《Docker 监控与性能优化》
docker·容器·性能优化
lulu121654407816 小时前
2026年-企业级大模型API网关实战指南: 微元算力聚合平台性能优化实测
java·人工智能·spring·性能优化·ai编程
reset202118 小时前
vllm性能优化
性能优化·vllm
小小工匠19 小时前
Redis - 异步机制与阻塞规避:Redis 单线程模型的生存之道
数据结构·redis·性能优化·集群·持久化
数据库小学妹1 天前
MySQL ORDER BY 深度解析:Using temporary 与 Using filesort 的底层机制及索引优化实战
数据库·经验分享·mysql·性能优化·dba
爱喝水的鱼丶1 天前
SAP-ABAP:SAP基础数据校验工具开发系列博客(共5篇)第三篇:SAP接口对接开发:实现数据的实时/批量校验交互
运维·数据库·学习·性能优化·sap·abap·经验交流