本文将介绍处理器分支预测器的一个重要类型:
- Bi-mode分支预测器
为了方便理解,我们使用Why, What, How的方式来分析。
Why
在一些传统的分支预测器中,比如局部分支预测,全局分支预测,我们可以使用不同的hash算法,将分支尽量打散到预测器中的不同表项中,但是由于资源的限制,依然存在分支别名的问题,特别是破坏性分支别名(两个分支索引到相同的表项中,并且他们的跳转方向相反)。我们虽然可以通过增加PHT的面积资源,来减少别名的发生,但这样的收益并不高。
如何能够减少破坏性别名的发生,并且在硬件资源上不增加太多呢?
What
Lee等人提出了Bi-mode预测器,其结构如图所示。该方法设置一个选择PHT和两个方向PHT:
- 方向PHT通过PC(指令地址)异或上GHR(全局历史信息)索引, 提供分支预测方向。
- 选择PHT直接通过分支地址索引, 根据其输出的内容决定使用哪个方向PHT的预测结果。
在训练过程中, 每次只更新被选中的那个方向PHT。选择PHT通常每次都被训炼更新, 但仅当选择PHT输出的结果和最终分支跳转结果不一致, 但被选中方向PHT中输出的结果和最终跳转结果一致时(例如被选中跳转的方向PHT中输出的结果为不跳转, 但最终预测结果正确的情况), 选择PHT不被更新。
这样的更新机制将保证偏置方向为跳转的条件分支被存储在跳转PHT中,即跳转PHT中的内容大多为跳转;对于非跳转PHT也保证一样的现象。
How
那这样的策略,是怎么能够降低破坏性分支别名的呢?
正如上图所示,Bi-mode将在方向PHT中产生别名的分支指令,在选择PHT中将其分开,根据其跳转结果,分别存到跳转PHT和非跳转PHT中,进而保证每个方向的PHT中发生破坏性分支别名的概率降低。
这样的方式相比起单纯增加硬件资源来降低别名,具有“花小钱,办大事”的作用。
拓展
相信你已经发现了,taken方向PHT中的大部分表项都是taken的,ntaken方向PHT中的大部分表项都是ntaken的,那么可不可以利用这个规律来减少面积呢?
Eden等人在Bi-mode预测方法的基础上提出了YAGS预测器,其结构如下图所示。 该方法的理论基础是方向PHT中绝大多数的值都是符合该偏置方向的, 因此只需要在每个方向PHT中存储不符合偏置规律的分支即可, 这将大大节省方向PHT的容量。
为了确认条件分支是否违背偏置规律, 该方法在每个方向PHT中增加标记位, 若标记位比较命中, 则说明该分支不符合偏置规律。 该方法通过选择PHT 存储分支偏置, 若选择PHT输出结果显示跳转, 则将非跳转PHT中的标记位和PC进行比较, 若命中, 则表示该分支不符合偏置规律, 则将非跳转PHT的输出作为最终预测结果, 反之则表示该分支符合偏置规律, 则将选择PHT的输出作为最终预测结果。
在训练过程中, 被选中的方向PHT被 更新, 另外如果分支的跳转方向与选择PHT不一致, 则相应的方向PHT也会被更新。选择PHT的更新机制与bi-mode预测器一致。