CPU 性能优化指南序言

首次发布时间:
Hui Zhang's avatar
张辉

欢迎阅读本系列关于 CPU 性能分析和优化方法的博客。本系列将定期更新,请密切关注。

在深入探讨具体细节之前,强烈建议读者熟悉 CPU 硬件性能分析工具和计数器。

在本篇初始博客中,我们将首先阐明一些重要概念:什么是性能、如何测试性能以及如何实现高性能。在回答了这三个问题后,一条通往性能优化的清晰路径将浮现,供读者遵循。后续的博客文章将详细阐述其中的细节。我们希望本系列博客能为您的项目带来价值。

第一章 - 性能概述

高性能程序通常意味着更快的速度,而普遍的标准就是速度。然而,“更快”是一个相对的术语。仅仅更快并不总是等同于更好的性能。在某些情况下,两者相比的程序性能都可能很差。

此外,效率和速度是相关的概念,但它们彼此独立。效率特别关注资源的最佳利用,没有任何浪费。它强调程序能够充分利用硬件资源为其优势。

确实,性能与某些指标挂钩。最普遍的指标是速度,它直接反映了程序的执行速度。此外,IPC(每周期指令数)和 CPI(每指令周期数)等指标提供了更严格的评估。然而,需要注意的是,这些指标本身并不能决定整体性能。

1.1. 延迟

延迟是 CPU 上每单位指令数的执行时间。一般来说,低延迟意味着程序需要更少的响应时间。该指标由每条指令的时钟周期数 (CPI) 来衡量,值越低越好。因此,延迟无疑是评估性能最关键的标准之一。

1.2 吞吐量

吞吐量是 CPU 在单位时间内执行的指令数。一般来说,高吞吐量意味着程序可以在相同的时间内执行更多操作。该指标通过每时钟周期的指令数 (IPC) 来量化,值越高越好。因此,吞吐量是评估性能的另一个关键标准。

1.3. 功耗

显然,程序也会在手机等移动设备上运行,此时功耗变得至关重要。一般来说,低功耗意味着程序更节能。这由功耗来衡量。因此,功耗是移动设备评估的重要标准之一。

1.4 稳定性

程序运行时间可能会有所不同。如果平均速度可以接受,那么注意力可能会转移到偶尔出现的高延迟情况。通常,一个稳定的程序运行起来不会卡顿。这由性能数据的方差和最高延迟数据来衡量。

1.5. 总结

总而言之,性能由各种指标定义,并取决于具体的应用场景。一个好的程序在所有场景下都表现良好,并且能够在不同指标之间取得良好的平衡。

第二章 - 性能测试

在进行性能分析之前,性能测试至关重要。准确的结果为所有后续分析奠定了坚实的基础。性能指标对于得出有意义的见解至关重要,这些指标完全来自性能测试数据和性能分析工具。

2.1. 微基准测试

我们应该尝试为程序构建一个合理且最小化的基准测试。对整个程序进行性能测试存在以下缺点:

  • 根据帕累托法则,尽管只有一小部分代码可能导致性能问题,但这并不意味着程序的其余部分不花费任何时间。不相关的代码也可能影响性能测试结果。例如,程序可能需要相当长的时间才能到达需要分析的确切代码。
  • 此外,构建整个程序可能非常耗时。对于大型项目,几个小时的构建时间是很常见的。处理项目依赖性更是噩梦。浪费时间在这种事情上是不明智的。

因此,控制测试范围、尽量减少干扰源以及缩短构建时间至关重要。为感兴趣的代码创建一个专门的基准测试程序,并针对这些基准测试进行性能测试和分析,会更加可行。这种方法就是我们所说的微基准测试。

2.2 高精度计时器

通过基准测试,收集性能数据最简单的方法是运行它并测量每次运行所需的时间,而高精度计时器在此至关重要。

C++ chrono 库提供了一些出色的计时工具,可以轻松测量程序中任意两点之间的时间。根据定义,std::chrono::steady_clock 最适合用于计时测量。

2.3. 性能分析

虽然计时统计数据只能提供大致情况,但精确测量需要性能分析器来查明热点代码段及其消耗的 CPU 周期。

大多数现代性能分析器都可以跟踪 CPU 硬件性能计数器 (PMC)。这些计数器可以追踪硬件事件,从而识别特定代码段中的 CPU 时钟周期和硬件级别的性能问题。

熟练使用性能分析器需要熟悉汇编语言和 PMC。例如,AMD CPU 通常使用 AMD μProf 分析器。关于 PMC 的详细描述可以在《AMD 处理器编程参考》(Processor Programming Reference (PPR) for AMD) 中找到。您可以从 https://www.amd.com/ 搜索并下载此参考资料。例如,在《AMD Family 19h Model 11h, Revision B1 Processor Programming Reference (PPR)》中,有关 PMC 的部分是 *2.1.13 Performance Monitor Counters*。

第三章 - 如何实现高性能

3.1. 评估性能

开发人员经常猜测性能,但这是一个非常糟糕的主意。性能指标只能来自测试和分析。

有时会听到一些模糊的说法,比如“使用模板而不是宏”或“虚函数更慢”。这些说法是否正确,需要针对具体场景进行测试才能回答。

有时编译器可能会给我们惊喜——相同的逻辑代码可能生成完全不同的汇编代码,而相同的汇编代码在不同的 CPU 上性能可能不同。因此,性能分析最可靠的来源是汇编和 PMC。不要完全信任编译器和 CPU。

3.2 高性能

如何为您的程序获得高性能?以下是必备技能:

  • 正确的算法
  • 有效利用 CPU 资源
  • 良好的内存访问
  • 无多余计算
  • 高效使用编程语言
  • 数据测试和分析

本系列将在接下来的案例中演示这些技能。它还将探讨硬件架构,并深入研究编程语言的底层方面。这种方法将从编译器和 CPU 的角度提供对代码的见解,从而促进性能改进。

第四章 - 结语

CPU 硬件在不断变化,编程语言也在不断变化。这为开发人员优化编译器提供了机会。迈向更好的编译器和编程语言的旅程永无止境。理解计算机和程序的底层工作原理、掌握硬件利用率以及开发标准化的分析流程,对于适应这些动态变化至关重要。

在本系列中,我们将解决实际项目中常见的挑战。我们将提供基准测试和全面的分析程序,以帮助开发人员了解如何有效利用 CPU 和编程语言。此外,我们还将引入一个可重用的框架来简化这一过程,使其更容易复制并促进更深入的学习。

Hui Zhang's avatar

张辉

张辉是 AMD Devtech 团队的技术人员,他专注于帮助开发者高效利用 AMD CPU 核心,并为 AMD AI 产品开发深度学习解决方案。

相关新闻和技术文章

相关视频

© . This site is unofficial and not affiliated with AMD.