背景
分支预测,在高当量、深流水的高性能处理器中,分支预测发挥的作用愈发明显。目前的成熟分支预测器,已经利用分支的局部历史规律和全局历史规律,对分支进行预测
- 局部历史规律:局部历史规律根据该条条件分支指令的历史跳转结果来推测下一次是否跳转。
有研究显示,大部分的浮点应用,根据局部历史来预测,具有较好的预测精度,因为浮点应用中有大量的循环结构。 - 全局历史规律: 相对于局部历史规律,全局历史规律更注重临近分支的相关性,根据前几条的分支跳转结果来判断本条分支指令是否要跳转。有研究显示,在整数应用上,全局历史预测相对于局部历史预测更具有优势,全局历史预测更有利于处理整数应用中大量存在的if-else结构。
但是,目前的分支预测器,仍无法彻底解决分支抖动和分支别名的问题
- 分支抖动:有些分支在相同历史下,依然有可能产生不一样的跳转结果
- 分支别名:由于资源的限制,不同的分支指令可能会被索引到分支模式表的同一个表项中,如果他们的跳转方向相反,则会互相干扰。
为了减少分支抖动和分支别名所带来的影响,有研究利用预测错误在时间上的分布规律,针对分支预测集中爆发的时间,对分支预测结果进行取反,从而提高分支预测效率
论文介绍
分支错误时间的局部性
该研究选定一个局部监测时间段,记录该时间段内的分支指令发生错误的概率,如果该时间段内,预测错误率大于50%,则称之为预测错误高峰期。可以发现,无论是全局历史还是局部历史,错误高峰期都会集中出现。
如何判断该时间段是错误高峰期
利用状态机,在时间窗口内采集每条分支预测结果,如果时间段结束时,最后结果停留在M(Mistaken)上,则代表该时间段是预测错误高峰期。以下是判断状态机的一种实现:
监测粒度
监测粒度,说人话就是,对分支模式表的哪些表项进行监测。前文我们已经获得结论:无论是局部历史还是全局历史,错误爆发期都具有集中性,因此无论是对哪些表项进行监测,都是能采集到集中爆发的时间段的。
根据监测方式不同可以分为:全局监测,按组监测和局部监测。
- 全局历史监测对所有表项进行监测,所占据资源最小,但因为粒度较粗,可能会造成部分表项的错误高峰,影响另一部分表项的预测,全局比较适合连续出现预测高峰的场景。
- 局部检测器数量和预测器表项的数量一致,硬件开销很大,但能更细粒度地表项进行区分。
- 按组检测是上述两种方法份的折中,将分支模式表分为若干组,每组对应一个监测器,在监测灵敏度和硬件资源上相对比较平衡
实现方案
如下图所示,预测电路由分支模式表、监测器和数据选择器组成,检测器由图的状态机构成,分支历史信息和分支指令地址进行异或操作后得到索引值,从分支模式表中读出一个分支预测器的值作为原始分支预测器结果;同时用该索引值的一部分索引监测表,从中读出状态机的状态,如果是出于错误高峰期,对其预测结果进行取反。
监测器表中的状态机在分支预测信息被后级流水线确认后被更新,每次仅更新被确认分支指令所对应的状态机。
总结
总结来说,该研究找到了错误高峰期大量集中出现的特点,寻找错误高峰期,对错误高峰期内的分支预测结果进行取反,从而使得高峰期内的预测错误率维持在50%以下,提升了预测准确度