数据依赖与控制依赖的区别 [英] Difference between data dependence and control dependence
问题描述
我很难理解数据依赖和控件依赖之间的区别。
我看到的一个例子是:
数据依赖例如,指令使用另一条指令创建的数据
控制相关性例如,指令等待更新的注册表进行比较
我很难理解的是,例如在BEQ中,我等待寄存器更新,但我也依赖他的数据。
所以我不知道如何区分它们之间的区别。
推荐答案
指令等待更新注册表进行比较是对控制相关性的错误描述,难怪
条件分支指令本身对其输入寄存器有数据依赖关系,然后才能检查分支条件。
分支之后的指令对分支具有控制依赖关系。前端需要根据分支是否被采用来知道提取/解码哪些指令。(或对于间接分支,目标地址是什么)。
分支预测所做的猜测稍后可能会被发现是错误的。(当分支指令实际执行并检查预测时)。
在简单(标量)顺序流水线中,相关指令不可能在分支指令到达EXEC阶段之前到达执行阶段。发现分支预测错误并从中恢复只是意味着重新引导前端从正确的地址获取,丢弃已获取(并解码)的错误路径中的指令。但在无序的执行CPU中可能会发生这种情况。特别是如果分支的输入是长依赖链的一部分,但具有控制依赖关系的指令没有数据依赖关系。(即它们是独立的工作,乱序的后端可以投机性地启动它们。)
分支预测+推测执行在预测正确时有效地隐藏了控制依赖关系。这就是为什么编译器经常将if (a==0) return a;
转换为if (a==0) return 0;
或类似的;如果它们无论如何都要分支(控制依赖项),则使用返回值打破/避免代码的数据依赖项。
相关:
What exactly happens when a skylake CPU mispredicts a branch?-现代面向对象执行CPU。
Avoid stalling pipeline by calculating conditional early-最小化分支本身的数据依赖链长度,以便及早执行并验证分支预测。
Dependency chain analysis提到循环分支的控制依赖项。
CPU prediction and memory barrier-分支之前的推测执行可能会导致内存重新排序。
Why is a conditional move not vulnerable for Branch Prediction Failure?-CMOV纯粹是ALU选择操作,只是数据依赖,不是控制依赖。
- gcc optimization flag -O3 makes code slower than -O2显示CMOV如何变慢,从而创建循环承载的数据依赖性链,而不是推测执行可以隐藏的控制依赖项。
这篇关于数据依赖与控制依赖的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!