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

Mar*_*ark 5 performance tlb mmu perf amd-processor

我正在寻找 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它似乎也没有。

也许它有不同的名字?有什么建议么?

Had*_*ais 4

在我看来,您正在寻找与英特尔*.WALK_DURATION*.WALK_ACTIVEAMD Zen 处理器类似的事件。不存在具有相同确切含义的此类事件,但存在类似的事件。

最接近的事件是 IBS 性能数据字段IbsTlbRefillLatIbsItlbRefillLat,它们分别测量在所选指令获取或微指令未命中的情况下完成 L1 DTLB 或 L1 ITLB 未命中所需的周期数。注意, 中perf record,可以用PMUIbsTlbRefillLat捕获,也可以用PMU 捕获。ibs_fetchIbsItlbRefillLatibs_op

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

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

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