X86 如何通过火箭湖性能访问RAPL?

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不能做这么多事情 有没有办法将火箭湖动力事件支持

我有一个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:

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 |
+----------------------+------------+