Whiskey Lake i7-8565U
RESOURCE_STALLS.OTHER
看起来不像是英特尔文档的充分解释:
计算由于其他原因导致执行停止的周期数资源问题。
[我在一个由16MiB
个迭代组成的循环中,对6400
个随机生成的数据的内存副本的一个示例进行了实验。
基线:
avx_memcpy_baseline:
shr rdx, 0x3
xor rcx, rcx
avx_memcpy_baseline_loop:
add rcx, 0x08
cmp rdx, rcx
ja avx_memcpy_baseline_loop
ret
基准计数器:
823 292 269 resource_stalls.any
181 045 r02a2 #LOAD
831 370 403 r04a2 #RS_FULL
49 659 resource_stalls.sb
130 100 r10a2 #ROB_FULL
63 386 r20a2 #FPCW
2 151 516 r40a2 #MSCXR
4 222 r80a2 #OTHER
WB商店:
avx_memcpy_forward_llss:
shr rdx, 0x3
xor rcx, rcx
avx_memcpy_forward_loop_llss:
vmovdqa ymm0, [rsi + 8*rcx]
vmovdqa ymm1, [rsi + 8*rcx + 0x20]
vmovdqa [rdi + rcx*8], ymm0
vmovdqa [rdi + rcx*8 + 0x20], ymm1
add rcx, 0x08
cmp rdx, rcx
ja avx_memcpy_forward_loop_llss
ret
WB存储计数器:
27 089 245 473 resource_stalls.any
4 873 836 r02a2 #LOAD
14 099 696 r04a2 #RS_FULL
24 130 341 296 resource_stalls.sb
5 790 969 r10a2 #ROB_FULL
375 032 r20a2 #FPCW
3 395 592 r40a2 #MXCSR
4 899 892 032 r80a2 #resource_stalls.other 14% of RESOURCE_STALL.ANY
NT个商店:
avx_nt_memcpy_forward_llss:
shr rdx, 0x3
xor rcx, rcx
avx_nt_memcpy_forward_loop_llss:
vmovdqa ymm0, [rsi + 8*rcx]
vmovdqa ymm1, [rsi + 8*rcx + 0x20]
vmovntdq [rdi + rcx*8], ymm0
vmovntdq [rdi + rcx*8 + 0x20], ymm1
add rcx, 0x08
cmp rdx, rcx
ja avx_nt_memcpy_forward_loop_llss
ret
NT存储计数器:
18 121 917 993 resource_stalls.any
2 211 195 r02a2 #LOAD
5 588 784 r04a2 #RS_FULL
12 061 475 989 resource_stalls.sb
3 156 129 r10a2 #ROB_FULL
165 967 r20a2 #FPCW
2 152 595 r40a2 #MXCSR
6 730 668 837 r80a2 #resource_stalls.other 33% of RESOURCE_STALLS.ANY
[在非临时性商店中,它占用了所有资源停顿的1/3,这是非常值得注意的,因此,我很想知道在Skylake或更高版本上对内存绑定例程进行概要分析时,RESOURCE_STALLS.OTHER
的含义。
Intel仅记录了处理器上两个与资源相关的停顿,即RESOURCE_STALLS.ANY
和RESOURCE_STALLS.SB
。其他事件记录在Nehalem / Westmere上,但这并不意味着它们可以在Skylake上正常工作。您必须先验证它们,然后再尝试从事件计数中弄清楚。至少,我们必须检查RESOURCE_STALLS.ANY
是否等于RESOURCE_STALLS.SB
与其他未记录事件的和。看起来他们确实加起来了。 (IIRC,大约两年前,我处于不得不验证Haswell上某些未记录事件的情况,但不幸的是,现在我不记得是哪个事件。)
Intel手册在Skylake上对RESOURCE_STALLS.ANY
的描述如下:
计算与资源有关的停顿周期。停顿原因可以是如下:一种。 any u-arch结构已满(LB,SB,RS,ROB,BOB,LM,物理寄存器回收表(PRRT),或物理历史记录表(PHT)插槽)。b。 any u-arch结构为空(如INT / SIMD FreeLists)。C。 FPU控制字(FPCW),MXCSR等。这算是周期管道后端阻止了前端的uop交付。
此描述提供了与资源相关的停顿的类别的部分列表,而不是特定的停顿原因。例如,RS类别包括许多特定于RS的停顿原因。英特尔大多数乱序的微体系结构中都存在这些问题,但是具体的停顿原因在不同的微体系结构上可能有很大的不同。就其对性能的影响而言,每个类别的相对重要性也取决于微体系结构。从分析的角度来看,这种分类很方便。
[注意,现在在RESOURCE_STALLS.ANY
下简单地提到了在旧的微体系结构上记录了性能事件的许多停顿原因,这意味着即使没有记录相应的事件,它们仍然存在。
这里是适用于所有乱序微体系结构的每个类别的简要描述:
FLDCW
,可能会使流水线停滞,直到所有较早的指令完成执行。条件取决于所修改的微体系结构和FPCW位(请参阅英特尔优化手册的3.8.3节)。这些摊位在这里计算。FLDCW
。写入MXCSR
寄存器的指令(例如LDMXCSR
)可能会使流水线停滞,直到所有较早的指令完成执行。一个微体系结构可以重命名MXCSR,但是,如果不这样,它就必须在更改舍入模式之前完成较早的数学指令。您称为RESOURCE_STALLS.OTHER
的事件包括以下类别:BOB,LM,PRRT,PHT,空闲列表和其他。我认为您正在停滞不前。尝试将负载更改为写入相同目标寄存器的非内存指令,然后查看RESOURCE_STALLS.OTHER
是否可以忽略。