计算 Amd Zen 2 处理器上的 L3 缓存访问事件

Counting L3 cache access event on Amd Zen 2 processors

我正在尝试找出与 perf stat 命令一起使用的事件,以计算 AMD Zen 2 处理器上的 L3 缓存访问。根据 PPR (http://developer.amd.com/wordpress/media/2017/11/54945_PPR_Family_17h_Models_00h-0Fh.pdf),第 2.1.13.4.1 节,第 168 页,对于“[L3 缓存访问] (L3RequestG1)”,事件是 x01,umask 是 x80。据我了解,在 perf stat 命令中使用的事件因此是 r8001。但是下面的命令总是 returns 计数为零,不管我 运行:

perf stat -a -e r8001 -- 睡眠 10

'system wide' 的性能计数器统计信息:

             0      r8001                                                       

10.001105322 秒时间过去了

我是不是误解了 PPR,或者 [L3 缓存访问] (L3RequestG1) 有别的意思吗?

此外,有没有一种方法可以指定 L3 缓存的切片来监视 perf 中的事件,因为大多数具有高内核数的较新架构都有多个 L3 切片。

L3 缓存事件只能在 L3 PMU 上计数,如您要测量的事件的物理助记符(L3PMCx01)和逻辑助记符(Core::X86::Pmc::L3::L3RequestG1)中明确指定的. L3 PMU 的正式名称为 L3PMC。这类似于 Intel 处理器上的 cbox PMU。

perf 中原始事件的默认 PMU 是 cpu,这是 perf_events 子系统赋予核心 PMU 的名称。使用没有显式 PMU 的原始事件代码指定的事件(例如 r8001)等同于 cpu/r8001/。核心事件 0x001 表示事件 Core::X86::Pmc::Core::FpSchedEmpty 并且 umask 0x80 未为此事件定义(请参阅第 2.1.15.4.1 节)。所以你在计算一个未定义的事件。在这种情况下,如果事件碰巧被实现但没有记录,那么事件计数可能不为零,具体取决于它是否发生在正在分析的程序的执行过程中。否则,事件计数将为零。 perf_events 不会阻止您计算未定义的事件。

从上游内核版本 v5.4-rc1 开始,L3PMC 在 perf_events 中受支持,名称为 amd_l3。要确定您使用的内核是否支持此 PMU,请使用命令 ls /sys/devices/*/format 检查它是否被枚举。如果不支持,则无法通过 perf.

测量该内核上的 L3 事件

如果支持 amd_l3,您必须像 amd_l3/r8001/amd_l3/event=0x01,umask=0x80/ 中那样明确指定 PMU,以便在正确的 PMU 上计算事件。或者您可以只使用 perf 事件名称 l3_request_g1.caching_l3_cache_accesses.

你知道L3RequestG1事件代表什么吗?文档仅将其描述为“Caching: L3 cache accesses”,意义不大。在我看来,它统计的交易类型是事件涵盖的交易类型的一个子集 L3LookupState。 Table 2.1.15.2 节中的 19 表示 L3 访问和未命中应分别使用 rFF04 (L3LookupState) 和 r0106 (L3CombClstrState) 进行计数。不要盲目地期望这些事件中的任何一个实际上都算你想衡量的任何东西。

您链接的 PPR 不适用于任何 Zen2 处理器,它适用于某些 Zen 和 Zen+ 处理器(特别是型号 00h-0Fh)。您需要了解处理器型号和系列才能找到正确的 PPR。