【发布时间】:2020-06-01 11:31:39
【问题描述】:
Whiskey Lake i7-8565U
RESOURCE_STALLS.OTHER 看起来不像英特尔文档中解释的那样:
计算由于其他原因导致执行停止时的周期数 资源问题。
我在由6400 迭代组成的循环中对16MiB 随机生成数据的内存副本示例进行了实验。
基线:
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 Stores 柜台:
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 Stores 柜台:
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 可能意味着什么。
【问题讨论】:
-
我假设它包括 RS 或 ROB 已满,例如因为旧的缓存未命中负载在数据到达之前无法退出。当然,还有其他微架构资源,例如 branch order buffer that enables fast recovery 来自错误预测而无需等待它们退休。我认为如果它已满,则无法将分支发送到后端。
-
@PeterCordes 我认为它包括 RS 或 ROB 已满,例如因为旧的缓存未命中负载在数据到达之前无法退出。我不确定 ROB 和 RS 是否包含在计数器中,因为它们有单独的 Umask。我添加了英特尔文档中可用的所有 Umask。
-
哦,是的,您更新的数据似乎表明这不太可能; ROB_FULL 和 RS_FULL 的计数太低而无法相加,因此它们不占大多数。 (假设这些事件确实在衡量我们基于名称/文档的想法)。我很惊讶
perf没有为更多不同的特定resource_stalls命名事件。我有一段时间没用ocperf.py了,也许它知道这些。
标签: performance assembly x86 x86-64