【发布时间】:2016-05-24 14:51:30
【问题描述】:
为了了解为什么 Bulldozer 低于标准,我一直在看 Agner Fog 的优秀微架构书,在它的第 178 页推土机下面有这一段。
最多可以在一个时钟周期内解码具有三个前缀的指令。超过三个的指令会有非常大的惩罚 前缀。带有 4-7 个前缀的指令需要额外的 14-15 个时钟周期 解码。带有 8-11 个前缀的指令需要 20-22 个时钟周期 额外的,带有 12-14 个前缀的指令需要 27-28 个时钟周期 额外的。因此不建议将 NOP 指令加长 带有三个以上的前缀。此规则的前缀计数包括 操作数大小、地址大小、段、重复、锁定、REX 和 XOP 前缀。一个三字节的 VEX 前缀计为一个,而一个两字节的 VEX 前缀不算。转义码(0F、0F38、0F3A)不算数。
当我搜索前缀时,我被非常技术性的定义击中,远远超出了我的能力范围。或者,建议每条指令限制为 4 条,这与上述摘录冲突。
所以简单来说,有人可以解释他们是什么/做什么,以及为什么您可能希望将多达 14 岁以上的人添加到一条指令上而不是分解它?
【问题讨论】:
-
非常好的问题。我想在这里阅读 Peter Cordes 和其他专家的答案。
-
@zx485:就像大家说的那样,通常你只会看到大量的前缀,当你制作一个长的
NOP时。一个NOP需要相同的时间来执行,无论长度如何,除了代码大小的副作用和前端问题。 (正如 Agner Fog 的指南所解释的那样)。您绝对不希望 14 个 NOP 在使用 uop-cache 的 CPU 上浪费 uop 缓存中的空间。除此之外,x32 ABI 经常使用地址大小前缀(因此 base+index*scale 寻址模式不会意外超出 32 位地址范围)。所以lock inc word [edi + r10d*4]需要 4: lock op-sz addr-sz REX。 -
IIRC、Atom 和 Silvermont 具有类似的解码器限制,但作为 SIMD 指令编码一部分的前缀和转义字节计数。因此,它们可能会在 SSSE3 和带有 REX 前缀的后续指令上严重瓶颈。