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

相关推荐
打工仔折腾 AI10 小时前
Docker镜像分层与卷挂载到底怎么工作:一次文件系统层面的实测分析
运维·人工智能·后端·python·docker·容器·性能优化
Cx330❀13 小时前
Qt 多线程深度解析:从底层原理到 UI 线程与同步实战
开发语言·qt·ui·搜索引擎·性能优化·图形渲染
cyf3117 小时前
RDMA 写操作带宽性能建模与参数敏感性分析
性能优化·rdma·rocev2
夜之眷属18 小时前
记一次战斗服务器 CPU 打满 100% 且“无法恢复“的排查
java·linux·运维·服务器·后端·性能优化
余槐i19 小时前
WAL 下写并发仍是 1:SQLite 单写者模型实测与绕开方案
数据库·python·性能优化·sqlite·wal
晚安日记wanna1 天前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
晚安日记wanna1 天前
索引建了却不走?7 个失效原因逐层排查
数据库·mysql·性能优化
工作10年+,存储芯片行业1 天前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
Wang's Blog2 天前
Java框架 SpringCloud 快速入门: Feign 的性能优化
java·spring cloud·性能优化
打工仔折腾 AI2 天前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战