St.*_*rio 3 performance x86 assembly x86-64
Whiskey Lake i7-8565U
RESOURCE_STALLS.OTHER英特尔文档看起来并没有很好地解释:
\n\n\n计算由于其他资源问题而导致执行停滞的周期数。\n
\n
16MiB我对一个由迭代组成的循环中随机生成的数据的内存副本示例进行了实验6400。
基线:
\n\navx_memcpy_baseline:\n shr rdx, 0x3\n xor rcx, rcx\navx_memcpy_baseline_loop:\n add rcx, 0x08\n cmp rdx, rcx\n ja avx_memcpy_baseline_loop\n ret\nRun Code Online (Sandbox Code Playgroud)\n\n基线计数器:
\n\n 823\xe2\x80\xaf292\xe2\x80\xaf269 resource_stalls.any\n 181\xe2\x80\xaf045 r02a2 #LOAD\n 831\xe2\x80\xaf370\xe2\x80\xaf403 r04a2 #RS_FULL\n 49\xe2\x80\xaf659 resource_stalls.sb\n 130\xe2\x80\xaf100 r10a2 #ROB_FULL\n 63\xe2\x80\xaf386 r20a2 #FPCW\n 2\xe2\x80\xaf151\xe2\x80\xaf516 r40a2 #MSCXR\n 4\xe2\x80\xaf222 r80a2 #OTHER \nRun Code Online (Sandbox Code Playgroud)\n\n世界银行商店:
\n\navx_memcpy_forward_llss:\n shr rdx, 0x3\n xor rcx, rcx\navx_memcpy_forward_loop_llss:\n vmovdqa ymm0, [rsi + 8*rcx]\n vmovdqa ymm1, [rsi + 8*rcx + 0x20]\n vmovdqa [rdi + rcx*8], ymm0\n vmovdqa [rdi + rcx*8 + 0x20], ymm1\n add rcx, 0x08\n cmp rdx, rcx\n ja avx_memcpy_forward_loop_llss\n ret\nRun Code Online (Sandbox Code Playgroud)\n\nWB专卖店柜台:
\n\n27\xe2\x80\xaf089\xe2\x80\xaf245\xe2\x80\xaf473 resource_stalls.any\n 4\xe2\x80\xaf873\xe2\x80\xaf836 r02a2 #LOAD \n 14\xe2\x80\xaf099\xe2\x80\xaf696 r04a2 #RS_FULL \n24\xe2\x80\xaf130\xe2\x80\xaf341\xe2\x80\xaf296 resource_stalls.sb \n 5\xe2\x80\xaf790\xe2\x80\xaf969 r10a2 #ROB_FULL \n 375\xe2\x80\xaf032 r20a2 #FPCW \n 3\xe2\x80\xaf395\xe2\x80\xaf592 r40a2 #MXCSR\n 4\xe2\x80\xaf899\xe2\x80\xaf892\xe2\x80\xaf032 r80a2 #resource_stalls.other 14% of RESOURCE_STALL.ANY\nRun Code Online (Sandbox Code Playgroud)\n\n北领地商店:
\n\navx_nt_memcpy_forward_llss:\n shr rdx, 0x3\n xor rcx, rcx\navx_nt_memcpy_forward_loop_llss:\n vmovdqa ymm0, [rsi + 8*rcx]\n vmovdqa ymm1, [rsi + 8*rcx + 0x20]\n vmovntdq [rdi + rcx*8], ymm0\n vmovntdq [rdi + rcx*8 + 0x20], ymm1\n add rcx, 0x08\n cmp rdx, rcx\n ja avx_nt_memcpy_forward_loop_llss\n ret\nRun Code Online (Sandbox Code Playgroud)\n\nNT专卖店柜台:
\n\n18\xe2\x80\xaf121\xe2\x80\xaf917\xe2\x80\xaf993 resource_stalls.any\n 2\xe2\x80\xaf211\xe2\x80\xaf195 r02a2 #LOAD\n 5\xe2\x80\xaf588\xe2\x80\xaf784 r04a2 #RS_FULL\n12\xe2\x80\xaf061\xe2\x80\xaf475\xe2\x80\xaf989 resource_stalls.sb\n 3\xe2\x80\xaf156\xe2\x80\xaf129 r10a2 #ROB_FULL\n 165\xe2\x80\xaf967 r20a2 #FPCW\n 2\xe2\x80\xaf152\xe2\x80\xaf595 r40a2 #MXCSR \n 6\xe2\x80\xaf730\xe2\x80\xaf668\xe2\x80\xaf837 r80a2 #resource_stalls.other 33% of RESOURCE_STALLS.ANY \nRun Code Online (Sandbox Code Playgroud)\n\n在非临时存储的情况下,这一点非常明显,它占用了所有资源停顿的 1/3,因此我很想知道RESOURCE_STALLS.OTHER在 Skylake 或更高版本上分析内存绑定例程时这可能意味着什么。
英特尔仅记录了处理器上两个与资源相关的停顿,即RESOURCE_STALLS.ANY和RESOURCE_STALLS.SB。其他事件记录在 Nehalem/Westmere 上,但这并不意味着它们可以在 Skylake 上准确运行。在尝试理解事件计数之前,您必须验证它们。至少,我们必须检查 是否RESOURCE_STALLS.ANY等于RESOURCE_STALLS.SB和其他未记录事件的总和。看来它们确实加起来了。(IIRC,大约两年前,我不得不在 Haswell 上验证一些未记录的事件,但不幸的是,我现在不记得是哪些事件了。)
Intel手册RESOURCE_STALLS.ANY对Skylake的描述如下:
计算与资源相关的停顿周期。停顿的原因可能如下
:任何u-arch 结构已满(LB、SB、RS、ROB、BOB、LM、物理寄存器回收表 (PRRT) 或物理历史表 (PHT) 插槽)。
b. 任何u-arch 结构都变空(如 INT/SIMD FreeLists)。
C。FPU控制字(FPCW)、MXCSR等。
这对管道后端阻止来自前端的 uop 传送的周期进行计数。
此描述提供了与资源相关的停顿类别的部分列表,而不是具体的停顿原因。例如,RS类别包括许多RS特有的停顿原因。这些问题存在于大多数英特尔的乱序微架构中,但具体的停顿原因在不同的微架构上可能存在很大差异。每个类别对性能影响的相对重要性也取决于微架构。从分析的角度来看,这种分类很方便。
请注意,旧微架构上记录的性能事件的许多停顿原因现在仅在下面提到RESOURCE_STALLS.ANY,这意味着即使没有记录相应的事件,它们仍然存在。
以下是适用于所有无序微架构的每个类别的简要描述:
FLDCW可能会停止管道,直到所有较早的微指令完成执行。条件取决于微架构和修改的 FPCW 位(请参阅 Intel 优化手册第 3.8.3 节)。这些摊位都算在这里。FLDCW. 写入MXCSR寄存器的指令(例如LDMXCSR)可能会停止流水线,直到所有较早的微指令完成执行。例如,微架构可以重命名 MXCSR,但如果没有,则它必须在更改舍入模式之前完成旧的数学指令。您调用的事件RESOURCE_STALLS.OTHER包括以下类别:BOB、LM、PRRT、PHT、空闲列表等。我认为你正在拖延LM。尝试将负载更改为写入相同目标寄存器的非内存指令,并查看是否RESOURCE_STALLS.OTHER变得可以忽略不计。