在阅读了《超标量处理器设计》这本书中有关局部历史分支预测和全局历史分支预测的部分之后,刚开始对于它们之间的区别还有些疑问,后面经过查看资料和多次阅读,对它们有了一些理解,在此记录一下。
流水线中有无分支预测的比较
无分支预测
如果没有分支预测,在五级流水中,如果我们通过在DF(decode fetch)阶段添加比较器已经把分支相关指令(这里指beq)的实际执行阶段从EX(execute)阶段提前到DF阶段,这个做法就已将很好了。但当我们指令要跳转的话,那就需要浪费两个时钟周期。
有分支预测
如果一个分支指令在程序中的执行上下是有关系的,比如beq,它在一个程序中的执行可能呈现下面的结果。
我们可以通过一个通过分支预测,用两位的饱和计数器来记录指令beq的已经执行的结果来为即将要执行的beq做一个参考,这样就可以与上面无分支预测相比就可以提升命中概率(但是如果预测错误依然要浪费两个时钟周期)
局部历史分支预测与全局历史分支预测
局部历史分支预测:需要用指令(如beq)的PC中的k位去寻找一个n位的BHR(branch history register),其中n代表我们可以记录一个指令的n个历史结果,然后我们再根据这个历史结果,找到对应的PHT里饱和计数器的值val,根据val决定是否跳转
全局历史分支预测:与局部分支预测不同,全局历史分支预测会用GHR(Global history register)记录所有跳转指令(beq、bneq等)的结果,相当于和前面的相比就是把BHR换成GHR,其他的相同。