perf 功耗测量:它是如何工作的?

perf power consumption measure: How does it work?

我注意到 perf list 现在可以选择测量功耗。您可以按如下方式使用它:

$ perf stat -e power/energy-cores/ ./a.out 
Performance counter stats for 'system wide':

              8.55 Joules power/energy-cores/

       0.949871058 seconds time elapsed

此测量的准确性如何,perf 如何估算功耗?

在 x86 系统上,这些值基于 RAPL (Running Average Power Limit) - 一个提供内置 CPU 能量计数器的接口。虽然最初由 Intel 设计,但 AMD 也在 Zen 系统上提供了兼容接口。

准确性取决于实际的微体系结构。最初,RAPL 由具有某些偏差的模型支持。自 Haswell 架构以来,在 Intel CPUs 上,它基于非常准确的测量。据我所知,对 AMD 的 Zen RAPL 实现的准确性没有很好的理解。

您必须考虑的一件重要事情是测量的范围。在大多数系统上,仅涵盖封装和 DRAM1。因此,如果您需要知道整个系统消耗了多少功率/能量 - 您通常无法使用 RAPL 轻松回答。

另请注意,RAPL 每 1 毫秒更新一次,因此较短的工作负载会因更新率而出现重大误差。

1 - Skylake 桌面系统 可以 实现全系统 RAPL。它的准确性取决于制造商。

power/energy-cores/ perf 计数器基于一个名为 MSR_PP0_ENERGY_STATUS 的 MSR 寄存器,它是英特尔 RAPL 接口的一部分(英特尔似乎将每个单独的 RAPL MSR 称为 RAPL 接口).基于系统 activity 事件的复杂模型用于估算(静态和动态)能耗。 MSR 寄存器名称中有 PP0,它指的是电源平面 0,它是 RAPL 域之一,其中包含套接字的所有核心,包括核心的私有缓存。然而,PP0 不包括末级缓存、互连、内存控制器、图形处理器以及非核心中的所有其他内容。无法测量 MSR_PP0_ENERGY_STATUS 的准确性,因为没有其他方法可以仅估算电源平面 0 的能耗。

虽然可以测量其他 RAPL 域的准确性。其中包括 Package、DRAM 和 PSys 域。例如,可以通过与整个系统的能耗(可以使用功率计测量)和 运行 将所有事物的能耗保持在外部的工作负载进行比较来衡量封装域能量估算的准确性封装尽可能多的已知常量。 MSR_PKG_ENERGY_STATUSMSR_DRAM_ENERGY_STATUS 的准确性已由不同的人在许多不同的处理器上以不同的方式测量。可以参考最近的论文RAPL in Action: Experiences in Using RAPL for Power Measurements for more information, which also includes summaries of previous works. The paper covers Sandy Bridge, Ivy Bridge, Haswell, and Skylake. The conclusion is that MSR_PKG_ENERGY_STATUS and MSR_DRAM_ENERGY_STATUS appear to be accurate on Haswell and Skylake (the implementation has changed on Haswell, see : An Energy Efficiency Feature Survey of the Intel Haswell Processor)。但这不一定适用于所有类型的工作负载、P 状态和处理器。所以精度不仅仅取决于微架构。

英特尔手册第 3 卷第 14.9 节中讨论了 RAPL 接口。我注意到该节中有错误。例如,它说客户端处理器不支持 DRAM 域,这是不正确的。我用来编写此答案的客户端 Haswell 处理器支持 DRAM 域。该部分可能已过时并且仅适用于 Sandy Bridge 和 Ivy Bridge 处理器。我认为最好阅读要使用 RAPL 的处理器的数据表。

power/energy-pkg/perf计数器可用于测量包域的能耗。这是已知的唯一一个在从 Sandy Bridge 开始的所有 Intel 处理器上受支持的域。