2 位分支预测器的状态
States of a 2-bit Branch Predictor
我正在阅读《计算机组织与设计》第 5 章中的动态分支预测部分:Patterson 和 Hennessy 的 Hardware/Software 接口第 5 版,当我遇到以下 2 位状态图时预测器:
2 位预测器应该在预测错误两次后更改它的预测。但是根据这张图,当我们从左下角的状态开始时,如果机器在分支应该是"TAKEN"的时候预测了两次[=25=],那么右上角的PREDICT TAKEN 达到状态。然而,这里机器将状态更改为右下角 PREDICT NOT TAKEN,即使它错误地预测了分支何时应该 "NOT TAKEN" 一次。
这不是错误行为吗?这是否意味着状态机错误或我遗漏了什么?
底部的NOT TAKEN深色状态当分支被TAKEN两次时,你可以看到到达的状态是浅色"unsure"状态,而根据我的说法应该是深色"sure" 状态,因为该分支连续两次执行相同的操作。
On the bottom NOT TAKEN dark colored state when the branch is TAKEN twice, you can see that the state reached is the light colored "unsure" state, whereas it should have been according to me the dark colored "sure" state, since the branch did the same action twice in a row.
浅蓝色状态预测在两个连续的采纳分支之后如您所愿。如果分支 是 从那时起将不会有进一步的错误预测。我不认为你的 "should" 是合理的。
2位饱和计数器;从 00 到 11 需要 3 步,对应于沿着该图的 3 步。
您的想法可以通过使用 2 位状态来记录最后 2 个分支中的每一个分支的方式来实现。但是您将如何区分循环分支之间的区别在再次采用一次(下一个循环的第一个 iter)之后未采用一次(从上一个循环中掉下来)and/or 与采用一次的很少采用的分支?如图所示,实际的方法是在每个循环中错误预测一次循环分支,仅在最后一次迭代失败时预测错误。下次进入循环的第一次迭代预测正确,返回strongly taken。
您可以在 retrocomputing.SE 上 How does the 68060 branch predictor work? 上的 Raffzahn 回答中找到此类预测器的详细示例,包括当您遇到 BPB 未命中时的静态预测(向后采用,向前不采用)(此分支没有预测条目)。
2 位预测器 非常 远非完美;更高级的预测器还会考虑全局历史是否比本地更好地预测该分支。 https://danluu.com/branch-prediction/
我正在阅读《计算机组织与设计》第 5 章中的动态分支预测部分:Patterson 和 Hennessy 的 Hardware/Software 接口第 5 版,当我遇到以下 2 位状态图时预测器:
2 位预测器应该在预测错误两次后更改它的预测。但是根据这张图,当我们从左下角的状态开始时,如果机器在分支应该是"TAKEN"的时候预测了两次[=25=],那么右上角的PREDICT TAKEN 达到状态。然而,这里机器将状态更改为右下角 PREDICT NOT TAKEN,即使它错误地预测了分支何时应该 "NOT TAKEN" 一次。
这不是错误行为吗?这是否意味着状态机错误或我遗漏了什么?
底部的NOT TAKEN深色状态当分支被TAKEN两次时,你可以看到到达的状态是浅色"unsure"状态,而根据我的说法应该是深色"sure" 状态,因为该分支连续两次执行相同的操作。
On the bottom NOT TAKEN dark colored state when the branch is TAKEN twice, you can see that the state reached is the light colored "unsure" state, whereas it should have been according to me the dark colored "sure" state, since the branch did the same action twice in a row.
浅蓝色状态预测在两个连续的采纳分支之后如您所愿。如果分支 是 从那时起将不会有进一步的错误预测。我不认为你的 "should" 是合理的。
2位饱和计数器;从 00 到 11 需要 3 步,对应于沿着该图的 3 步。
您的想法可以通过使用 2 位状态来记录最后 2 个分支中的每一个分支的方式来实现。但是您将如何区分循环分支之间的区别在再次采用一次(下一个循环的第一个 iter)之后未采用一次(从上一个循环中掉下来)and/or 与采用一次的很少采用的分支?如图所示,实际的方法是在每个循环中错误预测一次循环分支,仅在最后一次迭代失败时预测错误。下次进入循环的第一次迭代预测正确,返回strongly taken。
您可以在 retrocomputing.SE 上 How does the 68060 branch predictor work? 上的 Raffzahn 回答中找到此类预测器的详细示例,包括当您遇到 BPB 未命中时的静态预测(向后采用,向前不采用)(此分支没有预测条目)。
2 位预测器 非常 远非完美;更高级的预测器还会考虑全局历史是否比本地更好地预测该分支。 https://danluu.com/branch-prediction/