看来您已经发现了取消分层与常规多微指令指令相比的缺点,也许是在微融合微指令到达 IDQ 头部时与 4 宽问题/重命名/分配的交互中。
假设:也许由未层压产生的两个 uop 必须属于同一问题组,所以unlaminated; nop
重复仅实现每个时钟 3 个融合域微指令的前端吞吐量。
如果取消分层仅发生在 IDQ 的头部(当它们到达分配/重命名阶段时),那么这可能是有意义的。而不是将它们添加到 IDQ 中。去测试this,我们可以看到 Haswell 上的 LSD(循环缓冲区)容量是否取决于取消层压之前或之后的 uop 计数 -@AndreasAbel 的测试显示包含 55x 的循环cmp rbx, [r14+rax]
从 Haswell 上的 LSD 运行,因此这是分配/重命名期间发生取消分层的有力证据,not在 IDQ 本身中获取多个条目。
为了比较,cmp dword [rip+rel32], 1
首先,在解码器中不会出现微熔丝,因此它不会分层。如果它达到 0.75c 的吞吐量,这将是支持在同一问题组中需要空间的非层压的证据。
Perhaps times 2 nop; unlaminate
or times 3 nop
也可能是一个有趣的测试,看看未层压的 uop 是否会自行发出,或者在从问题组中的任何位置延迟后是否可以可靠地再获取 2 个 NOP。从你的背靠背cmp
-unlaminate 测试,我预计我们仍然会看到大部分完整的 4-uop 问题组。
你的问题提到了退休,但没有提到问题。
Retire 至少与 Issue 一样宽(从 Core2 到 Skylake 为 4 宽,在 Ice Lake 为 5 宽)。
桑迪布里奇/哈斯韦尔退役 4 个融合域微指令/时钟。 Skylake 每个时钟可以停用 4 个融合域微指令每个超线程,如果两个逻辑核心都忙的话,允许在一个旧的停滞 uop 最终完成后更快地释放资源,例如加载缓冲区。目前还不是 100% 清楚在单线程模式下运行时是否可以退休 8/clock,我发现相互矛盾的说法,并且 Intel 的优化手册中没有明确的声明。
真正造成退休瓶颈(但不是问题),即使不是不可能,也是非常困难的。任何持续的流都必须经过发行阶段,该阶段不比退休更宽。 (性能计数器uops_issued.any
表明未层压发生在发布前的某个时刻,因此这并不能帮助我们通过前端塞入超出退休处理能力的更多微指令。除非这具有误导性;在同一物理核心的两个逻辑核心上运行相同的循环应该具有相同的整体瓶颈,但如果 Skylake 运行得更快,那就会告诉我们并行 SMT 退役有所帮助。不太可能,但如果有人想排除它,需要检查一下。)
这也是 IACA 报告的吞吐量
IACA 的管道模型看起来相当幼稚;我认为它不知道 Sandybridge 的 4 uop 倍数问题效应(例如 6 uop 循环的成本与 8 uop 相同)。 IACA 也不知道 Haswell 能否保留add eax, [rdi+rdx]
在整个管道中进行微融合,因此对未分层的索引微指令的任何分析都是错误的。
我不相信 IACA 会做更多的事情,除了计算 uops 以及对它们将如何分配给端口进行一些疯狂的猜测。