【发布时间】:2022-01-10 05:56:43
【问题描述】:
谁能帮我理解“错误依赖”是什么意思?
我的教授刚刚在这张幻灯片中解释了为什么我们不能在命令 1 之前运行命令 3,但为什么后来他称之为“假”?
【问题讨论】:
标签: dependencies cpu pipeline intel cpu-architecture
谁能帮我理解“错误依赖”是什么意思?
我的教授刚刚在这张幻灯片中解释了为什么我们不能在命令 1 之前运行命令 3,但为什么后来他称之为“假”?
【问题讨论】:
标签: dependencies cpu pipeline intel cpu-architecture
这是“错误的”,因为后面的指令实际上并不需要前面指令中的数据。唯一的冲突是找到一个放置结果的地方。就像幻灯片说的那样,“不是真正的数据依赖”;只有 WAR 危险才是真正的依赖关系。
如果 CPU 发明了一个临时位置来放置结果,直到架构寄存器可用,它可以独立执行后面的指令。 必须等待这个寄存器准备好是可以避免的,因此它不是真正的依赖,它是错误的。
寄存器重命名通常会避免WAR and WAW hazards,除非在特殊情况下,CPU 将指令视为具有来自寄存器的输入,即使结果不依赖于寄存器中的任何位。
由于您标记了此 [intel],即使您的幻灯片不是 x86 asm,也许您更喜欢 x86 示例:
movss 这样的只写指令写入相同的寄存器会破坏对先前值的依赖,因为执行 OoO exec 的 x86 CPU 也会执行寄存器重命名。在矢量点积中保持多个vfmadd 指令在运行的一种方法是使用多个寄存器来保存总和。lzcnt eax, edx 应该对 EAX 是只写的,但是 Intel Haswell 和 Broadwell 有一个 错误的输出依赖,像 bsr eax, edx 一样调度它,它确实读取 EAX如果 EDX 为零。popcnt,在冰湖之前对 Sandybridge-family 的错误(输出)依赖。有趣的是,它以lzcnt / bsr / tzcnt / bsf 运行on the same execution unit。mov di, 123 的调度与add edi, 123 类似,不像mov 用于32 位或64 位寄存器,overwrite the whole register to avoid false dependencies 无需进行混乱的部分寄存器重命名。【讨论】: