AMD:TLB miss 循环性能计数器

5

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

可能它有不同的名称吗?有任何建议吗?


“consumed by” - 你的意思是页面行走活动并且核心被阻塞,没有uops在执行吗?因为OoO exec 可以在某些情况下隐藏一些页面行走延迟。(如果一个行走是由TLB预取触发的,理想情况下它完全隐藏了延迟,你就不会有TLB miss,或者一个很快就完成了的问题。但实际上,更可能的是,推测性的早期页面行走只缩短了停顿时间,而没有完全隐藏它,特别是当OoO exec已经必须工作来隐藏其他延迟时。) - Peter Cordes
1个回答

4
似乎你正在寻找类似于英特尔的 *.WALK_DURATION 或者 *.WALK_ACTIVE 在 AMD Zen 处理器上的事件。没有与这些完全相同含义的事件,但是有类似的事件。
最接近的事件是 IBS 性能数据字段 IbsTlbRefillLat 和 IbsItlbRefillLat,它们分别测量 L1 DTLB 或 L1 ITLB miss 的周期数,在所选的指令获取或 uop 的情况下。请注意,在 perf record 中,可以使用 ibs_fetch PMU 捕获 IbsTlbRefillLat,并使用 ibs_op PMU 捕获 IbsItlbRefillLat。
事件 Core::X86::Pmc::Core::LsTwDcFills 也很有用。它计算每个数据源(本地 L2、同一芯片上的 L3、另一个芯片上的 L3、DRAM 或 IO 上的同一芯片、DRAM 或 IO 上的另一个芯片)中在 L1 中缺失页表行走的 L1 数据缓存填充次数。来自更远源的行走更昂贵,可能对性能产生更大的影响。此事件不计算命中 L1 数据缓存的行走,尽管有其他事件计算 L2 TLB miss。此外,此事件仅计算 L2 DTLB miss,而不是 ITLB miss。
在上游内核的当前版本中,LsTwDcFills 不在 perf list 中列出,因此 perf 不知道事件名称。所以你需要使用语法 cpu/event=0x5B, umask=0x0/ 指定事件代码。该事件表示任何具有分配 MAB 的数据加载或存储的页表行走(这意味着 walker 在 L1D 中缺失)。你可以按照手册中定义的适当 umask 值过滤计数。例如,事件 cpu/event=0x5B, umask=0x48/ 表示响应来自本地或远程主存储器的行走。

利用所有这些监测设施作为微架构性能分析方法的一部分,一个好的方法是首先监测 LsTwDcFills。如果与总内存访问次数(不包括指令获取)相比超过某个阈值,则捕获采样uops的 IbsTlbRefillLat 来定位你的代码中发生这些昂贵查找的位置。同样地,对于指令获取查找,使用事件 Core::X86::Pmc::Core::BpL1TlbMissL2Hit 计算总查找次数,如果计数相对于总获取太大,则使用 IbsItlbRefillLat 来确定你的代码中最昂贵查找发生的位置。


Hadi Brais,感谢您的评论。我使用的perf版本不支持ibs_fetchibs_op参数,因此我必须输入原始值。我使用了libpfm4来检索CPU支持的所有可用事件列表,但它没有列出IbsTlbRefillLatIbsItlbRefillLat - Mark
@Mark IbsTlbRefillLatIbsItlbRefillLat并不是真正的事件,因此它们不会出现在支持事件列表中。它们是可以通过IBS样本捕获的附加信息。除非您使用的是非常旧的内核版本,否则必须支持ibs_fetchibs_op。请指定perf版本、内核版本、CPU型号,并显示命令dir /sys/bus/event_source/devices/的输出。展示您正在获取的确切命令和错误。(编辑您的问题以包括这些信息。) - Hadi Brais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接