Linux AMD CPU上的性能测量缓存未命中

Linux AMD CPU上的性能测量缓存未命中,linux,perf,amd-processor,Linux,Perf,Amd Processor,我使用的是AMD Ryzen 5 1600 CPU,我想使用Perf来测量程序的缓存未命中率。当我运行perf stat-e cache misses./programperf总是报告0个缓存未命中。运行perf list将提供以下输出: amd_iommu_0/cmd_processed/ [Kernel PMU event] amd_iommu_0/cmd_processed_inv/ [Kern

我使用的是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]
amd\u iommu\u 0/cmd\u processed/[内核PMU事件]
amd\u iommu\u 0/cmd\u processed\u inv/[内核PMU事件]
amd\u iommu\u 0/ign\u rd\u wr\u mmio\u 1ff8h/[内核PMU事件]
amd\u iommu\u 0/int\u dte\u hit/[内核PMU事件]
amd\u iommu\u 0/int\u dte\u mis/[内核PMU事件]
amd\u iommu\u 0/mem\u dte\u hit/[内核PMU事件]
amd\u iommu\u 0/mem\u dte\u mis/[内核PMU事件]
amd_iommu_0/mem_iommu_tlb_pde_hit/[内核PMU事件]
amd_iommu_0/mem_iommu_tlb_pde_mis/[内核PMU事件]
amd_iommu_0/mem_iommu_tlb_pte_hit/[内核PMU事件]
amd_iommu_0/mem_iommu_tlb_pte_mis/[内核PMU事件]
amd\u iommu\u 0/mem\u pass\u excl/[内核PMU事件]
amd\u iommu\u 0/mem\u pass\u pretrans/[内核PMU事件]
amd\u iommu\u 0/mem\u pass\u untrans/[内核PMU事件]
amd\u iommu\u 0/mem\u target\u abort/[内核PMU事件]
amd\u iommu\u 0/mem\u trans\u total/[内核PMU事件]
amd\u iommu\u 0/页面\u tbl\u读取\u gst/[内核PMU事件]
amd\u iommu\u 0/页面tbl\u读取\u nst/[内核PMU事件]
amd\u iommu\u 0/页面\u tbl\u读取\u tot/[内核PMU事件]
amd\u iommu\u 0/smi\u blk/[内核PMU事件]
amd_iommu_0/smi_recv/[内核PMU事件]
amd\u iommu\u 0/tlb\u inv/[内核PMU事件]
amd\u iommu\u 0/vapic\u int\u guest/[内核PMU事件]
amd_iommu_0/vapic_int_non_guest/[内核PMU事件]
分支指令或cpu/分支指令/[内核PMU事件]
分支未命中或cpu/分支未命中/[内核PMU事件]
缓存未命中或cpu/缓存未命中/[内核PMU事件]
缓存引用或cpu/缓存引用/[内核PMU事件]
cpu周期或cpu/cpu周期/[内核PMU事件]
指令或cpu/指令/[内核PMU事件]
msr/aperf/[内核PMU事件]
msr/irperf/[内核PMU事件]
msr/mperf/[内核PMU事件]
msr/tsc/[内核PMU事件]
暂停周期后端或cpu/暂停周期后端/[内核PMU事件]
暂停周期前端或cpu/暂停周期前端/[内核PMU事件]
rNNN[原始硬件事件描述符]
cpu/t1=v1[,t2=v2,t3…]/modifier[原始硬件事件描述符]
(有关如何编码,请参见“人员性能列表”)
mem:[/len][:access][Hardware breakpoint]

运行
sudo perf list
会产生比上述事件多得多的事件。我不确定为什么
缓存未命中
不起作用,因为像
分支未命中
这样的事件正在起作用。也许我必须使用一个
amd\u iommu\u 0
事件(
amd\u iommu\u 0/mem\u dte\u mis/
看起来很有希望,但我不确定它到底衡量了什么)?是否有任何参考资料可以解释这些事件是什么?

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

请注意,事件
缓存未命中
映射到通用硬件事件性能计数\u硬件缓存未命中,这在所有平台上都不可用

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

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

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

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


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

如果
sudo
显示更多事件,您可以设置
perf_event_paranoid
,这样您就不需要一直使用perf。那么,您是说此处理器不支持录制
缓存未命中事件
?考虑到这是一个如此普遍和常见的事件,这似乎有些奇怪。我不是说不支持
缓存未命中。我的意思是,
缓存未命中
未映射到我指定的硬件事件,因此不可用。它很可能化名为另一个事件名称。我建议的第二个选择可以引导你实现这一目标。