CPU 中的错误依赖是什么?

What is False Dependency in CPU?

谁能帮我理解“虚假依赖”是什么意思?

我的教授刚刚在这张幻灯片中解释了为什么我们不能在命令 1 之前 运行 命令 3,但为什么后来他称其为“False”?

它是“false”,因为后面的指令实际上不需要前面指令的数据。唯一的冲突是找到放置结果的地方。正如幻灯片所说,“不是真正的数据依赖”;只有 WAR 个风险是真正的依赖关系。

如果CPU发明了一个临时位置来放置结果,在架构寄存器可用之前,它可以独立执行后面的指令。 您可以避免必须等待此寄存器准备就绪,因此这不是真正的依赖,而是错误的。

寄存器重命名通常避免 WAR and WAW hazards,但特殊情况除外 CPU 将指令视为具有来自寄存器的输入,即使结果不依赖于任何位那里。

由于您标记了这个 [intel],即使您的幻灯片不是 x86 asm,也许您更喜欢 x86 示例:

  • - 使用像 movss 这样的只写指令写入相同的寄存器打破了对先前值的依赖,因为执行 OoO exec 的 x86 CPUs 也会注册重命名。在矢量点积中保持多个 vfmadd 指令在运行中的一种方法是使用多个寄存器来保存总和。
  • Why does breaking the "output dependency" of LZCNT matter? - lzcnt eax, edx 应该 对 EAX 是只写的,但是 Intel Haswell 和 Broadwell 有一个 false 输出依赖性,像 bsr eax, edx 一样调度它,它在 EDX 为零的情况下读取 EAX。
  • Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviations with _mm_popcnt_u64 on Intel CPUs Same problem but for popcnt, false (output) dependency on Sandybridge-family until Ice Lake. Interestingly, it runs 作为 lzcnt / bsr / tzcnt / bsf.
  • - writing a partial register on many microarchitectures counts as read-modify-write of the full register, e.g. mov di, 123 is scheduled similarly to add edi, 123, unlike mov to a 32 or 64-bit register which both overwrite the whole register to avoid false dependencies 无需进行混乱的部分寄存器重命名。
  • - WAW 和 WAR 错误依赖不会在 SnB 系列上停止,也不会独立写入同一内​​存位置。