以下是一段代码,用于记录记录标志,该标志负责所有L1-dcache丢失的10%,但该块完全是在zmm寄存器之间移动。这是perf命令字符串:

perf record -e L1-dcache-load-misses -c 10000 -a -- ./Program_to_Test.exe
代码块:
Round:
vmulpd zmm1,zmm0,zmm28
VCVTTPD2QQ zmm0{k7},zmm1
VCVTUQQ2PD zmm2{k7},zmm0
vsubpd zmm3,zmm1,zmm2
vmulpd zmm4,zmm3,zmm27
VCVTTPD2QQ zmm5{k7}{z},zmm4

VPCMPGTQ k2,zmm5,zmm26
VPCMPEQQ k3 {k7},zmm5,zmm26
KADDQ k1,k2,k3

VCVTQQ2PD zmm2{k7},zmm0
VDIVPD zmm1{k7},zmm2,zmm28 ; Divide by 100
VPXORQ zmm2{k7},zmm2,zmm2
vmovupd zmm2,zmm1
VADDPD zmm2{k1},zmm1,zmm25
对于其他L1度量(例如l1d.replacement),该代码块也得到了类似的结果。
我的问题是,仅zmm寄存器移动的块如何产生L1缓存未命中?我认为寄存器根本不会存入内存。实际上,最后一次内存访问是在此代码块上方的10条指令;其他9条指令均为寄存器到寄存器指令。

最佳答案

事件L1-dcache-load-misses映射到Sandy Bridge和更高版本的微体系结构上的L1D.REPLACEMENT(或映射到旧的微体系结构上的类似事件)。此事件不支持精确采样,这意味着样本可以指向无法生成被采样事件的指令。 (请注意,当前任何Atom都不支持L1-dcache-load-misses。)
从在Haswell +或Silvermont +微体系结构上运行的Linux 3.11开始,可以通过指定满足以下两个条件的采样事件来使用事件指令指针捕获样本:

  • 该事件支持精确采样。例如,您可以使用任何代表内存uop或指令退出的事件。事件的确切名称和含义取决于微体系结构。有关更多信息,请参阅Intel SDM Volume 3。没有任何事件支持精确采样,并且具有与L1D.REPLACEMENT相同的确切含义。在支持扩展PEBS的处理器上,只有一部分PEBS事件支持精确采样。
  • 在事件上启用了精确的采样级别。在Linux性能中,可以通过在事件名称或原始事件编码后附加“:pp”,或在PMU语法中指定的原始事件的末斜杠后附加“pp”来完成。例如,在Haswell上,可以将事件mem_load_uops_retired.l1_miss:pp指定给Linux性能。

  • 对于这样的事件,当事件计数器溢出时,PEBS硬件便已布防,这意味着它现在正在寻找最早的机会来收集精确的样本。当在此时间段内至少有一条指令引起事件时,PEBS硬件最终将被这些指令之一触发,偏向于高延迟指令。当触发PEBS的指令退出时,PEBS微代码例程将执行并捕获一条PEBS记录,其中包含触发PEBS的指令IP(与体系结构IP不同)。 perf用于显示结果的指令指针(IP)是此事件IP。 (我注意到可能有很少数量的样本指向可能不会导致事件的指令。)
    在较旧的微体系结构上(在Haswell和Silvermont之前),还支持“pp”精确采样级别。这些处理器上的PEBS将仅捕获体系结构事件,该事件指向以程序顺序紧随PEBS触发指令之后的静态指令。如果可能,Linux性能会使用LBR,它包含源-目标IP对,以确定捕获的IP是否是跳转目标。如果是这种情况,它将把源IP作为事件IP添加到样本记录中。
    一些微架构支持一个或多个事件具有更好的采样分布(更好的情况取决于微架构,事件,计数器以及计数器即将溢出时正在执行的指令)。在Linux perf中,可以通过指定精确级别“ppp”来启用精确分发(如果支持)。

    10-04 18:22