在AMD CPU上检测缓存未命中的性能指标

3

我正在使用AMD Ryzen 5 1600 CPU,希望使用Perf来测量程序的缓存未命中。当我运行perf stat -e cache-misses ./program时,Perf总是报告0个缓存未命中。运行perf list会得到以下输出:

  amd_iommu_0/cmd_processed/                         [Kernel PMU event]
  amd_iommu_0/cmd_processed_inv/                     [Kernel PMU event]
  amd_iommu_0/ign_rd_wr_mmio_1ff8h/                  [Kernel PMU event]
  amd_iommu_0/int_dte_hit/                           [Kernel PMU event]
  amd_iommu_0/int_dte_mis/                           [Kernel PMU event]
  amd_iommu_0/mem_dte_hit/                           [Kernel PMU event]
  amd_iommu_0/mem_dte_mis/                           [Kernel PMU event]
  amd_iommu_0/mem_iommu_tlb_pde_hit/                 [Kernel PMU event]
  amd_iommu_0/mem_iommu_tlb_pde_mis/                 [Kernel PMU event]
  amd_iommu_0/mem_iommu_tlb_pte_hit/                 [Kernel PMU event]
  amd_iommu_0/mem_iommu_tlb_pte_mis/                 [Kernel PMU event]
  amd_iommu_0/mem_pass_excl/                         [Kernel PMU event]
  amd_iommu_0/mem_pass_pretrans/                     [Kernel PMU event]
  amd_iommu_0/mem_pass_untrans/                      [Kernel PMU event]
  amd_iommu_0/mem_target_abort/                      [Kernel PMU event]
  amd_iommu_0/mem_trans_total/                       [Kernel PMU event]
  amd_iommu_0/page_tbl_read_gst/                     [Kernel PMU event]
  amd_iommu_0/page_tbl_read_nst/                     [Kernel PMU event]
  amd_iommu_0/page_tbl_read_tot/                     [Kernel PMU event]
  amd_iommu_0/smi_blk/                               [Kernel PMU event]
  amd_iommu_0/smi_recv/                              [Kernel PMU event]
  amd_iommu_0/tlb_inv/                               [Kernel PMU event]
  amd_iommu_0/vapic_int_guest/                       [Kernel PMU event]
  amd_iommu_0/vapic_int_non_guest/                   [Kernel PMU event]
  branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]
  branch-misses OR cpu/branch-misses/                [Kernel PMU event]
  cache-misses OR cpu/cache-misses/                  [Kernel PMU event]
  cache-references OR cpu/cache-references/          [Kernel PMU event]
  cpu-cycles OR cpu/cpu-cycles/                      [Kernel PMU event]
  instructions OR cpu/instructions/                  [Kernel PMU event]
  msr/aperf/                                         [Kernel PMU event]
  msr/irperf/                                        [Kernel PMU event]
  msr/mperf/                                         [Kernel PMU event]
  msr/tsc/                                           [Kernel PMU event]
  stalled-cycles-backend OR cpu/stalled-cycles-backend/ [Kernel PMU event]
  stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]

  rNNN                                               [Raw hardware event descriptor]
  cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
   (see 'man perf-list' on how to encode it)

  mem:<addr>[/len][:access]                          [Hardware breakpoint]

运行sudo perf list会列出比上面的更多事件。我不确定为什么cache-misses无法工作,因为像branch-misses这样的事件是可以工作的。也许我必须使用其中一个amd_iommu_0事件(amd_iommu_0/mem_dte_mis/看起来很有前途,但我不确定它测量的是什么)?是否有任何参考资料可以解释这些事件是什么?

如果sudo显示了更多的事件,你可以设置perf_event_paranoid,这样你就不需要一直使用 perfperf_event_paranoid == 1 对 x86 perf 实际上有什么限制? - Peter Cordes
1个回答

4

CPU型号 AMD Ryzen 5 1600 基于 AMD 的 Zen 微架构系列。根据快速查询,Zen 对应的 CPUID 代码为 17h

请注意,事件cache-misses 被映射到通用硬件事件 PERF_COUNT_HW_CACHE_MISSES,该事件在所有平台上均不容易获得。

根据本文撰写时的最新 Linux 内核源代码(即 5.3.11),可以看出事件 cache-misses 在 CPU 家族17h及以上并非直接支持。

请注意,要了解 AMD 大多数性能监视计数器 (PMC) 事件,您需要参考下面的参考资料 -

AMD BIOS 和内核开发人员指南 (我找不到适用于 CPU 家族 17h 的版本)

另一个选项是,您可以传递事件的原始十六进制代码来代替事件名称,格式为-e rXXXX,其中XXXX 是代码。堆栈溢出上有另一个答案在此处描述了如何获取像cache-misses这样的事件的原始十六进制代码。

您还可以查看这个提交,以获取有关缓存未命中如何表示的更多详细信息。


那么你的意思是说这个处理器不支持记录“缓存未命中”吗?这似乎很奇怪,因为它是如此普遍和常见的事件。 - Zach
我并不是说cache-misses不被支持。我的意思是cache-misses没有映射到我指定的硬件事件,因此无法直接使用。很可能它被别名为另一个事件名称。我建议的第二个选项可能会帮助你找到它。 - Arnabjyoti Kalita

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