【问题标题】:Perf measure cache misses on AMD CPU性能测量 AMD CPU 上的缓存未命中
【发布时间】:2023-10-03 11:19:01
【问题描述】:

我正在使用 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/ 看起来很有希望,但我实际上不确定它测量的是什么)?是否有任何参考资料可以解释这些事件是什么?

【问题讨论】:

标签: linux perf amd-processor


【解决方案1】:

CPU 风格 AMD Ryzen 5 1600 基于 AMD Zen 微架构系列。快速查找Zen 告诉我,与此微架构关联的 CPUID 代码是 17h

请注意,事件cache-misses 映射到通用硬件事件PERF_COUNT_HW_CACHE_MISSES,这并非在所有平台上都可用。

根据撰写本文时最新的 linux 内核 source(即 5.3.11),可以看出 CPU 系列 17h 不直接支持事件 cache-misses以上。

请注意,要了解 AMD 的大部分性能监控计数器 (PMC) 事件,您需要查阅以下参考资料 -

AMD BIOS 和内核开发人员指南(我在 CPU 系列 17h 中找不到它)

另一个选项不是传递事件名称,而是传递事件的原始十六进制代码,格式为-e rXXXX,其中XXXX 是代码。 here 的另一个答案描述了如何为 cache-misses 等事件获取此原始十六进制代码。

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

【讨论】:

  • 你是说这个处理器不支持录制cache-misses?鉴于这是一个普遍而普遍的事件,这似乎很奇怪。
  • 我不是说不支持cache-misses。我的意思是cache-misses 没有映射到我指定的硬件事件,因此不容易获得。它很可能是另一个事件名称的别名。我建议的第二个选项可以引导你到那里。
最近更新 更多