x86 ASM 上读取寄存器的延迟语义

x86 ASM 上读取寄存器的延迟语义

根据 A. Fog 的指令表,Ivy Bridge 在 MOV 指令上有 3 个周期的延迟。

因此以下操作将花费 3 个周期将 RAX 移动到 RCX 中的地址:

  mov               [rcx], rax

我的问题是,这是否意味着正在读取的 RAX 在接下来的 2 个时钟内无法修改?具体来说,以下情况是否会导致执行延迟:

  mov               [rcx], rax
  inc               rax

答案1

简而言之,是的。这将导致处理器在等待该指令完成且数据可用后才能运行下一条指令时停滞。无法轻松预测将到达哪些数据,因此该指令在完成之前根本inc无法运行。mov

但这可能不是一个大问题,因为处理器可能能够安排不依赖于该mov指令结果的指令,以保持核心正常工作。

这就是所谓的无序执行并且它可以帮助减轻在等待这些长指令时处理器停顿的成本。


进一步澄清...

我应该更好地阅读你的例子,我不相信该mov [rcx], rax指令会导致指令停顿inc rax,但会导致任何依赖于rcx停顿的事情。

您链接的页面列出了可发出该类型另一条指令的互惠吞吐量。具体来说,我假设在这段时间内任何可以发出具有类似依赖关系的指令。

因此我假设 RAX 寄存器是改名当指令被发送执行或被编码到指令的 u-op 中时,下一个指令可以在该寄存器上工作,只要它不依赖于存储的上一个操作的结果该寄存器。

因此,在你的问题中举个例子,我相信应该实际情况是,CPU 实际上有两条指令,它们的唯一依赖项是 RAX 寄存器的当前值,并且其中的值仅由第二条指令修改。应该分派第一条指令,然后几乎立即开始执行第二条 ( inc) 指令。

相关内容