Memory 为什么较新的英特尔CPU不支持后端暂停周期的性能计数器?

Memory 为什么较新的英特尔CPU不支持后端暂停周期的性能计数器?,memory,intel,performancecounter,perf,intel-pmu,Memory,Intel,Performancecounter,Perf,Intel Pmu,我正在使用内存预取来对抗内存延迟。英特尔的某些(较旧)CPU支持性能计数器,用于计算CPU因等待内存而浪费的周期(stalled cycles backend),例如英特尔E5-2690 在较新的CPU上(例如,Gold6230和Gold6226),我找不到这个计数器。是否有其他方法可以计算CPU在等待内存控制器加载缓存线时浪费的周期数?perf调用“stalled cycles backend”的事件是一个“通用”事件,在不同的处理器型号上以不同的方式实现。这些定义很难找到,但在CentOS

我正在使用内存预取来对抗内存延迟。英特尔的某些(较旧)CPU支持性能计数器,用于计算CPU因等待内存而浪费的周期(
stalled cycles backend
),例如英特尔
E5-2690

在较新的CPU上(例如,
Gold6230
Gold6226
),我找不到这个计数器。是否有其他方法可以计算CPU在等待内存控制器加载缓存线时浪费的周期数?

perf调用“stalled cycles backend”的事件是一个“通用”事件,在不同的处理器型号上以不同的方式实现。这些定义很难找到,但在CentOS 7.6内核源代码中,这些定义位于“arch/x86/events/intel/core.c”中。对于Sandy Bridge(Xeon E5-26xx),定义为事件0xB1、Umask 0x01、INV=1、CMASK=1。在《英特尔体系结构软件开发人员手册》(文档325384-071199年10月)第3卷第19章中查找此事件,表19-3指出,在Skylake Xeon(和Cascade Lake Xeon)上,此事件的含义相同:“统计每个线程没有从保留站(RS)调度UOP的周期。”

如果您想了解统计的内容,我建议不要使用这些“通用”事件。在内核源代码中寻找定义,或者构建一个测试程序来读取执行程序的实际MSR,都是一件痛苦的事情。我今天测试的第一个事件实际上是错误的——在Xeon E5 v4系统上,事件“uops_executed.core_cycles_none”被编程为事件0xb1,Umask 0x02,INV=1,但CMASK未设置为1。SWDM第3卷第18.2节指出,如果CMASK为零,则忽略INV,因此这实际上统计执行的总UOP,而不是未执行UOP的周期。(同一事件在运行完全相同内核的SKX盒上正确编程。)

运行“英特尔内存延迟测试仪”时统计总周期、未调度Uop的周期和至少调度一个Uop的周期的示例:

perf stat -e r0043003c -e r01c301b1 -e r014301b1 ./mlc --idle_latency
  Intel(R) Memory Latency Checker - v3.7
  Command line parameters: --idle_latency 

  Using buffer size of 2000.000MiB
  *** Unable to modify prefetchers (try executing 'modprobe msr')
  *** So, enabling random access for latency measurements
  Each iteration took 182.4 core clocks (   87.1    ns)


 Performance counter stats for './mlc --idle_latency':

    91,815,806,587      r0043003c                                                   
    64,132,006,584      r01c301b1                                                   
    27,683,941,060      r014301b1                                                   

      14.587156882 seconds time elapsed

暂停循环前端
仅在Nehalem、Westmile、Sandy Bridge和Ivy Bridge上受支持。它映射到所有这些微体系结构上的
事件0x0e、umask=0x01、inv=1、cmask=1
<代码>暂停循环后端在Nehalem、Westmile和Sandy Bridge上受支持。在前两个上,它被映射到
event=0xb1、umask=0x3f、inv=1、cmask=1
。在SnB上,它被映射到
事件=0xb1,umask=0x01,inv=1,cmask=1

从内核v4.6-rc1开始,如果当前处理器不支持这些事件中的任何一个,则它不会显示在
perf stat
的输出中。在早期版本的内核中,它将显示

Andi Kleen(英特尔)在《线程》中说,Ivy Bridge(正式)不支持
event=0xb1、umask=0x01、inv=1、cmask=1
,并且列出事件的manaul表已经过时。这就是为什么IvB上不支持
stalled cycles backend
。但根据手册V3(2019年5月)的表19-15,它仍然被列为IvB。它也为Broadwell和更高版本列出,但不是Haswell。但是,性能监控事件手册确实为Haswell列出了它。也许是哈斯韦尔的马车?我不知道


另一位专家表示,这两个事件似乎已经从Haswell开始完全放弃,转而采用自上而下的方法进行一级周期分解。

Skylake的
资源暂停。任何
计数器都可能是您要找的。不确定这是否完全等同于Sandybridge上的
stalled cycles后端
;通过
perf list
output搜索您要查找的内容。e、 g.从我的SKL(Skylake客户端)
mem\u load\u retired。l3\u miss
专门计算负载insn(而不是周期)。或者,
cycle\u activity.stalls\u l3\u miss
在三级缓存未命中请求负载未完成时统计执行暂停。这与未交付UOP的周期不同,只是未执行,因此我假设即使ROB/RS未满,它也可以计数。感谢Peter,我将提供
cycle\u活动。暂停l3\u错过
一次尝试。未执行事件
UOP\u的
cmask
可能是一个错误,这似乎存在于Broadwell和更早的版本中。我在第3B卷的Broadwell表中有一个Kaby Lake和许多计数器,它们没有出现在Kaby Lake表工作中(当我使用驱动程序对应用程序进行基准测试时,我使用wrmsr直接编程PMC EVTSELs,然后使用rdpmc-rdpmc),并显示不同的,但对具有相同事件但不同Umask的受支持计数器的可行值。例如,UOPS\u已发布。任意和标志\u合并。两个不同PMC的rdpmc指令(4*2)之间的UOP数量(4*2)之间的值始终存在显著差异,这两个指令对同一runI的受支持和不受支持计数器进行基准测试,这意味着UOP已失效。所有UOP均未发布。任何。看一看