我注意到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
此测量的准确性如何,如何估计功耗?
power/energy-cores/
perf
计数器基于一个称为MSR_PP0_ENERGY_STATUS
的MSR寄存器,该寄存器是Intel Rapl接口的一部分(英特尔似乎将每个单独的RAPL MSR称为RAPL接口(。基于系统活动事件的复杂模型用于估计(静态和动态(能耗。MSR寄存器名称中有PP0,它是指功率平面0,这是RAPL域之一,其中包含插座的所有内核,包括核心的私人卡车。但是,PP0不包括最后一级的缓存,互连,内存控制器,图形处理器以及Uncore中其他所有内容。不可能衡量MSR_PP0_ENERGY_STATUS
的准确性,因为没有其他方法可以估计仅动力平面0的能源消耗。
可以测量其他RAPL域的准确性。这些包括包装,DRAM和PSYS域。例如,可以通过比较整个系统的能耗(可以使用功率计测量(并运行工作负载来测量包装域能量估计的准确性尽可能恒定。MSR_PKG_ENERGY_STATUS
和MSR_DRAM_ENERGY_STATUS
的准确性已由许多不同处理器上的不同人以不同的方式测量。您可以参考最近的题为Rapl Action:使用RAPL进行功率测量的经验以获取更多信息,其中还包括以前作品的摘要。纸张覆盖了桑迪大桥,常春藤桥,哈斯韦尔和雪茄。结论是,MSR_PKG_ENERGY_STATUS
和MSR_DRAM_ENERGY_STATUS
在Haswell和Skylake上似乎是准确的(在Haswell上发生了变化,请参见:Intel Haswell处理器的能源效率功能调查(。但这在各种工作量,P状态和处理器上不一定是正确的。因此,准确性不仅取决于微体系结构。
RAPL接口在英特尔手册第3卷的第14.9节中进行了讨论。我注意到该节中存在错误。例如,它说客户处理器不支持DRAM域,这是不正确的。我用来编写此答案的客户端Haswell处理器支持DRAM域。该部分可能已过时,并且仅应用沙桥和常春藤桥处理器。我认为最好阅读要使用Rapl的处理器的数据表。
power/energy-pkg/
perf
计数器可用于测量包装域的能量消耗。这是从Sandy Bridge开始的所有英特尔处理器上支持的唯一域。
在X86系统上,这些值基于RAPL(运行平均电源限制( - 一个内置CPU Energy计数器内置的接口。虽然最初是由英特尔设计的,但AMD还提供了Zen Systems上的兼容接口。
精度取决于实际的微体系结构。最初,Rapl得到了具有某些偏见的模型的支持。自从Haswell体系结构以来,在Intel CPU上,它基于非常准确的测量值。据我所知,对AMD的Zen Rapl实施的准确性没有很好的了解。
您必须考虑的一件事是测量的范围。在大多数系统上,仅覆盖包装和DRAM 1 。因此,如果您需要知道整个系统消耗的功率/能量多少 - 通常无法轻易用Rapl回答。
还请注意,RAPL每1毫秒更新一次,因此更新的工作量将出现重大错误。
1- Skylake桌面系统 can 实现了全系统RAPL。准确性取决于制造商。