AMD:TLB 未命中周期的性能计数器

AMD: performance counter for cycles on TLB miss

我正在寻找 AMD 特定的性能计数器,这些计数器计算在 TLB 未命中时页面遍历所消耗的周期。我知道英特尔有这样的指标。

但是 AMD 上有这样的东西吗?我查看了 http://developer.amd.com/wordpress/media/2013/12/56255_OSRR-1.pdf,但没有找到任何接近我需要的内容。

我也看了perf源码https://elixir.bootlin.com/linux/latest/source/arch/x86/events/amd/core.c#L248好像也没有

可能它有不同的名字?有什么建议吗?

在我看来,您正在寻找与 AMD Zen 处理器上的英特尔 *.WALK_DURATION*.WALK_ACTIVE 类似的事件。没有完全相同含义的此类事件,但有类似的事件。

最接近的事件是 IBS 性能数据字段 IbsTlbRefillLatIbsItlbRefillLat,它们分别测量完成 L1 DTLB 或 L1 ITLB 未命中所需的周期数,以防​​未命中选定的指令获取或 uop。请注意,在 perf record 中,IbsTlbRefillLat 可以使用 ibs_fetch PMU 捕获,IbsItlbRefillLat 可以使用 ibs_op PMU 捕获。

活动Core::X86::Pmc::Core::LsTwDcFills也很有用。它计算每个数据源(本地 L2、同一芯片上的 L3、另一个芯片上的 L3、同一芯片上的 DRAM 或 IO、DRAM或另一个芯片上的 IO)。从更远的来源完成的步行更昂贵,并且可能会对性能产生更大的影响。此事件不计算命中 L1 数据缓存的遍历,尽管还有其他事件计算 L2 TLB 未命中。此外,此事件仅计入 L2 DTLB 未命中,而不计入 ITLB 未命中。

在上游内核的当前版本中,LsTwDcFills 未被 perf list 列出,因此 perf 不知道该事件的名称。因此,您将使用语法 cpu/event=0x5B, umask=0x0/ 指定事件代码。此事件表示为数据加载或存储的任何页面 table 遍历,其中有分配的 MAB(意味着遍历器在 L1D 中未命中)。您可以通过指定手册中定义的适当 umask 值来根据响应过滤计数。例如,事件 cpu/event=0x5B, umask=0x48/ 表示响应来自本地或远程主内存的步行。

将所有这些监控工具用作整体微体系结构性能分析方法的一小部分的一个好方法是首先监控 LsTwDcFills。如果它与内存访问总数(不包括指令获取)相比超过了某个阈值,则捕获 IbsTlbRefillLat 以获取采样的 uops 以定位这些昂贵的遍历在您的代码中发生的位置。类似地,对于指令获取遍历,使用事件 Core::X86::Pmc::Core::BpL1TlbMissL2Hit 来计算总遍历,如果计数相对于总提取太大,则使用 IbsItlbRefillLat 来定位代码中最昂贵的遍历发生的位置.