X86 如何通过火箭湖性能访问RAPL?
我有一个Rocket Lake CPU(11900K),但是perf还不支持访问电源事件,我该怎么做 性能事件列表: pastebin.com+tcsSdxUx 我的操作系统:Ubuntu 20.10内核5.12-RC6 性能版本:5.12-RC6 我可以使用Rapl read.c(链接:)读取Rapl值 但是rapl read.c不能用于分析正在运行的程序。我希望对运行程序进行评测,不仅是电源事件,还包括周期、分支等,Intel的SoCwatch不能做这么多事情 有没有办法将火箭湖动力事件支持添加到perf?我不知道原始电源事件计数器 更新#1:X86 如何通过火箭湖性能访问RAPL?,x86,intel,perf,amd-processor,energy,X86,Intel,Perf,Amd Processor,Energy,我有一个Rocket Lake CPU(11900K),但是perf还不支持访问电源事件,我该怎么做 性能事件列表: pastebin.com+tcsSdxUx 我的操作系统:Ubuntu 20.10内核5.12-RC6 性能版本:5.12-RC6 我可以使用Rapl read.c(链接:)读取Rapl值 但是rapl read.c不能用于分析正在运行的程序。我希望对运行程序进行评测,不仅是电源事件,还包括周期、分支等,Intel的SoCwatch不能做这么多事情 有没有办法将火箭湖动力事件支持
uname-a
输出:
Linux u128 5.12.0-051200rc6-generic#202104042231 SMP Sun Apr 4 22:33:57 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
更新#2:
rapl read-m
输出
RAPL read -- use -s for sysfs, -p for perf_event, -m for msr
找到RocketLake处理器类型
0(0)、1(0)、2(0)、3(0)、4(0)、5(0)、6(0)、7(0)
正在尝试使用/dev/msr接口收集结果
Listing paramaters for package #0
Power units = 0.125W
CPU Energy units = 0.00006104J
DRAM Energy units = 0.00006104J
Time units = 0.00097656s
Package thermal spec: 125.000W
Package minimum power: 0.000W
Package maximum power: 0.000W
Package maximum time window: 0.000000s
Package power limits are unlocked
Package power limit #1: 4095.875W for 0.108398s (enabled, not_clamped)
Package power limit #2: 4095.875W for 0.032227s (disabled, not_clamped)
PowerPlane1 (on-core GPU if avail) 0 policy: 16
Sleeping 1 second
Package 0:
Package energy: 62.846985J
PowerPlane0 (cores): 45.371277J
PowerPlane1 (on-core GPU if avail): 0.000000 J
DRAM: 0.000000J
PSYS: -0.000000J
注:能量测量值可能在60秒左右溢出
因此,尝试更频繁地对计数器进行采样
更新#3:
我发现很难简单地使用rapl msr获得全部功耗:
ujtoj=1000000;
bgn_energy=$(rdmsr -d 0x611);
time sh doit.sh;
end_energy=$(rdmsr -d 0x611);
printf '%.3f\n' "$(((end_energy - bgn_energy)/ujtoj))e-3"
输出:
real 2m58.411s
user 2m58.068s
sys 0m0.168s
0.197
sh是运行SPEC CPU2017 500.perlbench测试的shell脚本。对于Zen 3,性能统计输出的能耗(功率/能量)约为7486.61J,远高于简单使用rdmsr输出的“0.197”
更新#4:
现在我找到了另一种解决问题的方法。
通过添加一些“#define”和“case:”代码,可以很容易地添加RKL支持
在“英特尔rapl”驱动程序中对RKL的支持在v5.9-rc5中添加,核心和非核心性能事件在v5.11-rc1中添加。您确定有v5.12-rc6吗?
uname-a
打印什么?Ubuntu 20.10基于v5.8+其他后端口补丁(其中一个补丁支持现代Intel客户端处理器上可用的所有uncore\u imc
事件)
perf_事件子系统仅允许在不受支持的处理器模型上运行架构事件。但是您仍然可以使用perf手册页中记录的原始事件编码。此方法仅适用于无约束的事件,因为perf_event
不知道不受支持的模型上可能存在的任何约束。大多数事件没有约束,因此这不是一个大问题
我不知道你为什么认为rapl-read
不能用于分析程序。没有特定于计划或特定于核心的RAPL域。您可以使用-m
选项运行rapl read
,直接访问MSR获取能量读数,然后运行程序,然后再次运行rapl read
。两个读数之间的差异给出了每个受支持域的能耗。请注意,您必须修改rapl\u msr()
函数,以便它在读取之间调用您的程序,而不只是执行sleep(1)
。否则,它只会在大约一秒钟内报告能量消耗,与程序的能量消耗几乎没有任何关联
rapl-read
目前不支持RKL(或任何最新的英特尔处理器)。但是,您可以通过首先从cat/proc/cpuinfo
确定CPU模型,然后添加类似于当前支持的模型的宏定义,如#define CPU\u ROCKETLAKE model
,轻松添加RAPL支持。我在CPU模式上只看到两个开关语句,一个在detect\u CPU(void)
中,另一个在rapl\u msr(intcore,intcpu\u model)
中。只需为CPU\u ROCKETLAKE
添加一个案例。RKL与SKL具有相同的RAPL域,因此在这两个函数中与CPU\u SKYLAKE
放在一起。应该这样做。或者,您可以完全避免rapl read
,只需在shell脚本中使用wrmsr
和rdmsr
,该脚本将读取数据,运行程序,然后再次读取数据
MSR 0x611是MSR\u PKG\u ENERGY\u STATUS
,它报告一个32位无符号值。此值的单位为MSR\u RAPL\u POWER\u unit
,默认值为15.26uj。你似乎认为它是微焦耳。你确定这就是MSR\U RAPL\U POWER\U单元所说的吗?即使如此,表达式$((end_energy-bgn_energy)/ujtoj))e-3的结果是以千焦耳为单位的,那么您如何将其与Zen3上的功率/能量pkg
进行比较,后者显然是以焦耳为单位的
如果正确的单位为15.26uj,则英特尔处理器上的测量值为15.26*197000000=3009226220000焦耳(约3000千兆焦耳)。但由于只有MSR寄存器的最低32位有效,最大值为15.26*(2^32-1)=65541200921.7焦耳(约65千兆焦耳)。所以我认为单位不是15.26uj
使用test
输入的500.perlbench
基准测试似乎需要大约3分钟才能完成。很难知道MSR\U PKG\U ENERGY\U状态是否已结束,因为报告的数字不是负数
我认为最好在一个内核上运行500.perlbench
,然后在另一个内核上运行脚本,每隔几秒钟读取一次MSR\u PKG\u ENERGY\u STATUS
。例如,您可以将rdmsr-d0x611
放入循环中,并在每次迭代中休眠若干秒。由于500.perlbench
需要相对较长的时间才能完成,因此不必同时启动两个程序。通过这种方式,您可以模仿英特尔平台上内核支持事件power/energy pkg/
时,perf stat-a-I 1000-e power/energy pkg/
的工作方式
我已经在以下位置讨论了英特尔基于RAPL的能量测量的可靠性:。然而,我不知道是否有人验证了AMD的RAPL的准确性。我不清楚公司在多大程度上
real 2m58.411s
user 2m58.068s
sys 0m0.168s
0.197
--------------------------------------------------------------------------------
CPU name: 11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz
CPU type: Intel Rocketlake processor
CPU clock: 3.50 GHz
--------------------------------------------------------------------------------
Group 1: ENERGY
+-----------------------+---------+--------------+
| Event | Counter | HWThread 6 |
+-----------------------+---------+--------------+
| INSTR_RETIRED_ANY | FIXC0 | 996795747147 |
| CPU_CLK_UNHALTED_CORE | FIXC1 | 321084408076 |
| CPU_CLK_UNHALTED_REF | FIXC2 | 216809163858 |
| TEMP_CORE | TMP0 | 65 |
| PWR_PKG_ENERGY | PWR0 | 4050.2952 |
| PWR_PP0_ENERGY | PWR1 | 2982.4675 |
| PWR_DRAM_ENERGY | PWR3 | 0 |
+-----------------------+---------+--------------+
+----------------------+------------+
| Metric | HWThread 6 |
+----------------------+------------+
| Runtime (RDTSC) [s] | 62.0025 |
| Runtime unhalted [s] | 91.6329 |
| Clock [MHz] | 5189.3093 |
| CPI | 0.3221 |
| Temperature [C] | 65 |
| Energy [J] | 4050.2952 |
| Power [W] | 65.3247 |
| Energy PP0 [J] | 2982.4675 |
| Power PP0 [W] | 48.1024 |
| Energy DRAM [J] | 0 |
| Power DRAM [W] | 0 |
+----------------------+------------+