【问题标题】:Difference between data dependence and control dependence数据依赖和控制依赖的区别
【发布时间】:2021-11-02 11:27:56
【问题描述】:
我很难理解数据依赖和控制依赖之间的区别。
所以我看到的例子是:
数据依赖例如,指令使用另一条指令创建的数据
控制依赖例如,指令等待更新的reg进行比较
让我难以理解的是,例如在 beq 我等待寄存器更新但我也依赖他的数据。
所以我不知道如何知道它们之间的区别。
【问题讨论】:
标签:
dependencies
pipeline
cpu-architecture
branch-prediction
instruction-reordering
【解决方案1】:
instruction waits to update reg for comparison是对控件依赖的错误描述,难怪
条件分支指令本身在可以检查分支条件之前对其输入寄存器具有数据依赖性。
Instructions after 分支对分支有控制依赖。 前端需要知道要获取/解码哪些指令,基于分支是否被采用或不。 (或者对于间接分支,目标地址是什么)。
分支预测做出的猜测后来可能会被发现是错误的。 (当分支指令实际执行并检查预测时)。
在简单(标量)有序流水线中,相关指令无法在分支指令之前到达 exec 阶段。发现分支错误预测并从中恢复只是意味着重新引导前端从正确的地址获取,丢弃来自错误路径的已获取(和解码)的指令。
但是在乱序的 exec CPU 中可能会发生。特别是如果分支的输入是长依赖链的一部分,但具有控制依赖关系的指令没有数据依赖关系。 (即它们是独立的工作,乱序的后端可以推测性地开始。)
当预测正确时,分支预测 + 推测执行有效地隐藏了控制依赖关系。这就是为什么编译器通常会将if (a==0) return a; 转换为if (a==0) return 0; 和类似的;如果他们无论如何都要分支(控制依赖),请使用返回值打破/避免代码的数据依赖。
相关: