性能功耗测量:如何工作?

use*_*717 6 energy cpu-architecture perf

我注意到,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
Run Code Online (Sandbox Code Playgroud)

此测量的准确度如何,性能如何估计功耗?

Zul*_*lan 10

在 x86 系统上,这些值基于 RAPL(运行平均功率限制) - 一个提供内置 CPU 能量计数器的接口。虽然最初由 Intel 设计,但 AMD 也在 Zen 系统上提供了兼容的接口。

准确性取决于实际的微架构。最初,RAPL 受到具有某些偏见的模型的支持。在 Haswell 架构之后的 Intel CPU 上,它基于相当准确的测量。据我所知,对于 AMD Zen RAPL 实现的准确性还没有很好的理解。

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

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

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


Had*_*ais 5

power/energy-cores/ perf计数器基于一个名为MSR的寄存器MSR_PP0_ENERGY_STATUS,该寄存器是Intel RAPL接口的一部分(Intel似乎将每个单独的RAPL MSR称为RAPL接口)。基于系统活动事件的复杂模型用于估计(静态和动态)能耗。MSR寄存器名称中带有PP0,它表示电源平面0,它是RAPL域之一,其中包含套接字的所有核心,包括核心的专用缓存。但是,PP0不包括最后一级的高速缓存,互连,内存控制器,图形处理器以及非核心中的所有其他内容。无法测量其准确性,MSR_PP0_ENERGY_STATUS因为没有其他方法只能估算电源平面0的能耗。

不过,可以测量其他RAPL域的准确性。这些包括Package,DRAM和PSys域。例如,可以通过与整个系统的能耗(可以使用电表测量)进行比较,并运行使包装外的所有组件的能耗保持已知的工作量,来测量“包装”域能耗估算的准确性尽可能恒定。的准确性MSR_PKG_ENERGY_STATUSMSR_DRAM_ENERGY_STATUS已经在许多不同的处理器不同的方式由不同的人进行了测量。您可以参考最近发表的题为《行动中的RAPL:使用RAPL进行功率测量的经验》的论文有关更多信息,还包括以前的作品摘要。论文涵盖了桑迪桥,常春藤桥,哈斯韦尔和Skylake。结论是,MSR_PKG_ENERGY_STATUSMSR_DRAM_ENERGY_STATUS似乎是准确的Haswell上和SKYLAKE微架构(的实现已经在Haswell的变化,请参见:英特尔的Haswell处理器的节能特性调查)。但这不一定适用于所有类型的工作负载,P状态和处理器。因此,精度不仅取决于微体系结构。

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

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