实现Agree Predictor
- 题目分析
现代CPU通常使用超标量的深度流水线来提高性能,而超标量和深度流水线通常需要分支预测技术来加以配合。尤其是在多发射的深度流水线架构中,分支预测的准确率直接影响流水线效率、取指带宽利用率等性能指标。了解分支预测的实现、提升分支预测的准确率可以说,至具有很大的现实意义。
本实验需要使用C/C++语言,利用Pin工具进行代码插桩,在spec的实际程序上模拟实现分支预测器,统计预测的准确性。对于分支预测器而言,需要根据每条分支指令的地址,每条分支指令对应的分支历史情况,全局历史、局部转移历史的情况,以及多个不同的分支预测器的预测准确性来,来做出该条指令是否会产生分支跳转还是顺序执行的预测(以及给出目标分支地址)。
指令的地址可以通过Pin插桩的方式在代码直接中获得,其他的辅助信息则需要构建更多的数据结构来保持与维护。因而在分支预测器实现的过程中,首先需要构建饱和计数器、移位寄存器等类、以及分支预测器的基类;在此基础上进一步地编写动态分支预测器、锦标赛分支预测器,在不同的预测器中引入饱和计数器、移位寄存器来保存分支历史、全局/局部历史信息、预测历史信息,并作出预测。
饱和计数器类似于“状态机”,根据分支情况进行状态的更新与分支预测的输出,其示意图如下。
预测器的工作大都可以分为两步:第一步是预测,根据各种已知信息预测出后续指令将会顺序执行还是出现跳转;第二部是更新,根据预测结果与指令的实际跳转情况,更新维护的各种辅助信息,为未来的分支预测做好准备。
在The Agree Predictor:A Mechanism for Reducing Negative Branch History Interference中,作者指出,在二阶段全局历史预测器中,GHR的使用会导致PHT干扰,即原本由一个分支处理的一个PHT条目,由于GHR的散列处理,导致这个条目由不同的分支进行更新,如下图所示。
文章通过提出一种新的PHT结构来试图从整体上消解这种干扰。如下图所示,在agree predictor中,我们将一个偏置位(即一个1位的饱和计数器)附加到每个分支,用以指示最可能的结果,根据每次程序的是否跳转进行更新。PHT中的2位饱和计数器不再是预测被驱动的分支的方向,而是预测分支是否沿着偏置位指示的方向前进,即分支的实际方向是否与偏置位一致;当每次经过分支语句时,PHT中的2位计数器将被更新。在这种预测方案中,如果分支的方向与偏置位一致,PHT中的2位计数器就增加;如果分支与该位不一致,计数器就减少。
- 实验过程
根据论文的说明,该预测器需要维护1个2位饱和计数器数组作为PHT,1个1位饱和计数器数组,以及一个移位寄存器GHR存储分支历史。根据论文与博客的说明,对预测器的预测、更新函数进行调整,实现代码如下:(以下省略)