分支预测如何加速任何事情?
How does branch prediction speed up anything?
如果我有以下结构:
if( condition() ){
doA();
} else {
doB();
}
那么分支预测对我有什么帮助呢?即使正确预测了分支 A,我仍然需要评估 doA() 和 condition() - 只是不按此顺序。还是并行执行分支预测?在这种情况下,它是否与其他线程竞争 CPU 时间?一般来说,分支预测的最大预期速度是多少?
由于现代 CPUs 的流水线性质,新指令在先前指令完成处理之前开始处理。确切的数字因 CPU 体系结构和指令类型而异。流水线的原因是使 CPU 更有效地利用其组件,从而提高指令的吞吐量。例如,设计用于获取下一条指令的电路将闲置至少几个周期,而前一条指令在没有流水线的情况下执行其阶段(如源寄存器读取、数据缓存访问、算术执行等)。
不过它也带来了自己的挑战:一个例子是指令获取部分应该如何知道在管道中存在条件跳转指令的情况下要获取下一条指令。条件跳转(例如上面的 if
所必需的跳转)需要评估条件以确定接下来要获取哪条指令 - 但是此评估稍后会在管道中的几个阶段发生。在其通过流水线阶段的过渡期间,流水线必须继续运行并且必须继续加载新指令 - 否则您将不得不等待直到条件的解决已知(流水线停顿:条件 CPU我们尽量避免)。在不确定下一条指令应该来自哪里的情况下,CPU 必须猜测:这被称为分支预测。如果它猜对了,在评估条件并确认目标跳转地址后,流水线可以继续全速前进。如果它猜错了,则必须清除流水线中在条件跳转后开始的所有指令,并从正确的目标跳转地址重新开始:高效分支预测算法试图尽量减少的昂贵条件。
应用到上面的示例:如果分支预测在大部分时间内正确猜测了 condition()
的结果,则以下执行(doA()
或 doB()
)将继续没有管道冲洗:否则条件语句会影响性能。如果 condition()
的评估在调用之间是随机的,或者遵循分支预测算法难以预测的模式,则可能会发生这种情况。
如果我有以下结构:
if( condition() ){
doA();
} else {
doB();
}
那么分支预测对我有什么帮助呢?即使正确预测了分支 A,我仍然需要评估 doA() 和 condition() - 只是不按此顺序。还是并行执行分支预测?在这种情况下,它是否与其他线程竞争 CPU 时间?一般来说,分支预测的最大预期速度是多少?
由于现代 CPUs 的流水线性质,新指令在先前指令完成处理之前开始处理。确切的数字因 CPU 体系结构和指令类型而异。流水线的原因是使 CPU 更有效地利用其组件,从而提高指令的吞吐量。例如,设计用于获取下一条指令的电路将闲置至少几个周期,而前一条指令在没有流水线的情况下执行其阶段(如源寄存器读取、数据缓存访问、算术执行等)。
不过它也带来了自己的挑战:一个例子是指令获取部分应该如何知道在管道中存在条件跳转指令的情况下要获取下一条指令。条件跳转(例如上面的 if
所必需的跳转)需要评估条件以确定接下来要获取哪条指令 - 但是此评估稍后会在管道中的几个阶段发生。在其通过流水线阶段的过渡期间,流水线必须继续运行并且必须继续加载新指令 - 否则您将不得不等待直到条件的解决已知(流水线停顿:条件 CPU我们尽量避免)。在不确定下一条指令应该来自哪里的情况下,CPU 必须猜测:这被称为分支预测。如果它猜对了,在评估条件并确认目标跳转地址后,流水线可以继续全速前进。如果它猜错了,则必须清除流水线中在条件跳转后开始的所有指令,并从正确的目标跳转地址重新开始:高效分支预测算法试图尽量减少的昂贵条件。
应用到上面的示例:如果分支预测在大部分时间内正确猜测了 condition()
的结果,则以下执行(doA()
或 doB()
)将继续没有管道冲洗:否则条件语句会影响性能。如果 condition()
的评估在调用之间是随机的,或者遵循分支预测算法难以预测的模式,则可能会发生这种情况。