【问题标题】:How does branch prediction speed up anything? [duplicate]分支预测如何加快速度? [复制]
【发布时间】:2019-04-14 23:02:47
【问题描述】:

如果我有以下结构:

if( condition() ){
    doA();
} else {
    doB(); 
}

那么分支预测对我有什么帮助?即使分支 A 被正确预测,我仍然需要评估 doA() 和 condition() - 只是不是按这个顺序。还是并行执行分支预测?在这种情况下,它会与其他线程竞争 CPU 时间吗?一般来说,分支预测的最大预期加速是多少?

【问题讨论】:

标签: branch-prediction


【解决方案1】:

由于现代 CPU 的流水线特性,新指令在之前的指令完成处理之前就开始处理。具体数字取决于 CPU 架构和指令类型。流水线的原因是为了使 CPU 更有效地利用其组件,从而提高指令的吞吐量。例如,设计用于获取下一条指令的电路将至少闲置几个周期,而前一条指令在没有流水线的情况下执行其阶段(如源寄存器读取、数据缓存访问、算术执行等)。

但它也带来了自己的挑战:一个例子是在管道中存在条件跳转指令的情况下,指令提取部分应该如何知道接下来要提取哪条指令。条件跳转(例如上面的if 所必需的跳转)需要对条件进行评估以确定接下来要获取哪条指令 - 但是此评估稍后会在管道中的几个阶段发生。在其通过流水线阶段的过渡期间,流水线必须继续运行并且必须继续加载新指令 - 否则您将不得不等待直到已知条件的解决而失去效率(流水线停顿:CPU试图避免的条件) .在不确定下一条指令应该来自哪里的情况下,CPU 必须猜测:这称为分支预测。如果猜测正确,则在评估条件并确认目标跳转地址后,流水线可以继续全速前进。如果它猜错了,则必须清除流水线在条件跳转后开始的所有指令,并从正确的目标跳转地址重新开始:高效分支预测算法试图最小化的代价高昂的条件。

应用到您上面的示例:如果分支预测在很大比例的时间内正确猜测了condition() 的结果,则后续执行(doA()doB())将在没有管道刷新的情况下继续:否则条件语句会影响性能。如果 condition() 的评估在每次调用中是随机的,或者遵循分支预测算法难以预测的模式,就会发生这种情况。

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 2014-01-14
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2019-07-18
    • 2012-12-10
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多