perf 如何使用 offcore 事件?

How does perf use the offcore events?

一些内置 perf 事件映射到非核心事件。例如,LLC-loadsLLC-load-misses 映射到 OFFCORE_RESPONSE. 事件。这可以很容易地确定,如 . However, these offcore events require writing certain values to certain MSR registers to actually specify a particular event. perf seems to be using an array called something like snb_hw_cache_extra_regs 中所讨论的,以指定要写入哪些 MSR 寄存器的值。我想知道这个数组是如何使用的。基本上我想知道如何通过查看源代码来确定 perf 事件映射到的特定 offcore 事件。

为 SnB 存储了 offcore PM MSR 数组 here,其他架构接近。
INTEL_UEVENT_EXTRA_REGhere,它只是将 msr 设置为第二个参数,将 config_mask 设置为 0x000000FFULL,将 valid_mask 设置为第三个参数参数(第一个是对关联的普通 PMR 进行编程的事件)。

snb_hw_cache_extra_regs 的值正是将要写入所选 PM MSR 的值1.
该数组被查找 here 并使用 here to select the first PM MSR matching, where the config arg comes from the array hw_cache_event_ids.

所以它基本上是一个循环测试几个位掩码,直到找到兼容的 PM MSR,我认为您可以跳过它并查看存储在 snb_hw_cache_extra_regs 数组中的值。


1 由于定义为 snb_hw_cache_extra_regs 中的值的宏从未在源代码中重复使用,并且这些值直接映射到英特尔手册中记录的 MSR 布局,因此我没有费心验证此声明。