文章主要工作
- 从分支历史中剔除有偏向支
- 从分支历史中剔除同一分支的大量实例
- Bias-Free Neural Predictor(BF-Neural)
- Bias-Free TAGE Predictor(BF-TAGE)
剔除有偏分支的原因
一个分支若要与另一个分支建立有效关联, 则该分支方向的变化一定对另一个分支的方向有所影响。对于有偏分支,这类分支总是朝着一个方向预测(taken或not-taken),因此不存在由于其方向变化而对某个分支方向产生影响,也就不能与某个无偏分支建立相关性。
限制预测器只学习无偏分支间的相关性可以在保证全局历史长度合适的前提下更深入程序执行历史寻找相关分支,从而提供更高的预测准确率,同时存储开销不会太大。
从历史中筛选同一分支的多个实例
只跟踪全局历史寄存器中一个无偏分支的最近一次出现的历史,且试图学习与该条历史的相关性。
Bias-Free预测器中引入了一种 recency-stack-like(RS)结构用于实现上述跟踪,如图3所示。
其中PCx,PCy,PCz 是最近出现的三个分支的PC,PCnb 刚刚提交的一个无偏分支PC。当提交无偏分支 PCnb 时,会扫描 RS 结构以查找该分支的最后一次出现。如果分支 PCnb 在 RS 中命中,则将其移至 RS 的顶部并更新其最近的结果。 (图3中的4-entry的意思是只能存4个,所以这文章中说和最近3个分支PC进行比较??)(h_in是啥呀???)
Q:为什么要移动到顶部???
A:保证RS中分支的相对位置,即在时间上总是最近的最靠前。
命中条目的关联 OR 门保证下游触发器被时钟门控。这导致下游触发器保留其他非偏置分支的最新结果。 如果没有找到 PCnb 的条目,RS 就像一个传统的移位寄存器。
然而,在 RS 中捕获的分支的单个实例有时会对后续分支的两个方向都有影响。为了捕捉一个分支的不同实例与 RS 中的一个无偏分支出现历史的相关性,无偏分支应包括其位置历史 pos_hist,pos_hist 和其最近的结果都存到RS中用于训练和预测分支。pos_hist 表示过去全局历史中无偏分支与当前分支的绝对距离。
BP-Neural 预测器
算法所用相关变量描述:
- ,:是权重偏置表,是相关权重表。
- :只包括无偏分支最近出现历史的全局历史寄存器。(存分支结果历史)
- :包含所有分支结果的全局历史记录。
- :RS-like GHR的大小。
- :使用传统感知器预测器部件最近跟踪的分支的数量。
- :过去历史中无偏分支的地址数组。(存分支地址历史)
- :出现在RS中的无偏分支的 pos_list。(存分支距离历史)
- : 选中的权重向量和GHR的点积。
注释:实际上,GHR和数组A、P共同组成RS。
对于A中捕获的每个无偏分支,该函数把分支地址、无偏分支的地址以及P中历史记录的距离进行散列以选择中的一行,并使用其在A中的深度(即第几项)映射到中的一列,从而在中得到当前所选A中无偏分支对当前待预测分支的权重,计算该权重和该分支结果的点积(算法1第7行),将A中所有分支权重与结果点积相加(最终的accum)(算法1第8行),若accum非负则taken,否则not_taken。
指令提交时更新权重,有偏分支时不更新,无偏分支提交时更新GHR,A,P。
A. 折叠全局历史
即使在A中相同相关深度、过去全局历史中相同的绝对距离进行分支捕获,如果所捕获的无偏分支的执行路径不同(taken或not_taken),仍然会对待预测分支产生不同的影响。这种现象不仅增加了破坏性混叠,而且有时最终会积累来自远处路径历史中分支的显着噪声。因此,阻止这种现象的产生对预测器准确性尤为重要。
为了限制这种现象,对于A中每个捕获的无偏分支,在算法1的基础上,在散列函数中加入从该无偏分支到当前分支的全局历史位。 当全局历史位超出预测表索引长度时,通过异或对其进行折叠(如算法2所示)。
这里的表示传统感知器预测器的二维权重表。
B. 实际实现
有偏分支检测
有偏分支检测由图5的有限状态机(FSM)控制,用 BST(Branch Status Table)中的2-bit计数器对四种状态进行编码。
初始时,所有分支的FSM为 not found。
若该分支在BST中,则在分支第一次提交后,状态转变为taken或not_taken。若后续该分支执行中采取了相反方向,则FSM置为 not_biased ,后续无偏分支预测中都将用到该分支。
概率计数器:在实际实现中在BST中使用3-bit 概率计数器。其更新机制可以根据分支表现出特定方向的频率将分支分为不同的类别,并且可以随着应用程序的变化阶段从无偏向有偏向恢复。
RS中每加入一个分支,都将其放到RS顶部,将其更新为最新值。则这导致从RS首项到命中项期间的项都需移动一个位置,而导致这些分支的相对深度偏移,其中相对深度用于索引二维权重表的列。这使得之前检测到的无偏分支需重新学习新的相对深度下的相关性。
文中解决该问题通过使用一个一维相关权重表(和一维偏置权重表不是一个)。现在对于 RS 中捕获的每个无偏分支,一维权重表是 使用要预测的当前分支pc、无偏分支的地址、其在历史中的绝对深度以及到当前分支的折叠全局历史进行索引。 由于先前检测到的无偏分支不再依赖于 RS 中的相对深度来索引相关权重表中的列,因此它们不需要重新学习它们的相关性。
Q:是只用一维相关权重表不用二维权重表吗?????算法2中似乎不是,不是的话这个问题解决在哪儿???算法2中是先对二维表的权重求和,再加上一维相关权重表中的权重。
原文中的表达是:“Our implementation stores the correlations in a one-dimensional array of integer weights instead of maintaining those in a two-dimensional weight table as outlined in Algorithm 1.” 应该是用一维相关权重表代替二维权重表吧???
A:是用前者代替后者,算法2中的表示的是传统感知器预测器组件中的二维权重表。
Bias-Free预测器对那些有非常强的偏向但没有在较远历史上找到好的相关性的分支预测效果不好,因此与一个传统的感知器预测器组件相结合以捕捉一些最近的未过滤的位的相关性。
BF-TAGE预测器
由几段成几何级数长度的 RS (过滤掉有偏分支后)共同组成GHR,其中每个RS段包括来自某历史段(完整历史中的一段)的无偏分支的单个历史。在预测时,按历史深度等价的每段RS共同充当全局历史记录(GHR)。
Q:优化在哪里?难道是因为过滤了有偏分支,GHR变短(实际涉及深度为2000的历史,但由于筛选最终GHR只由150-200),从而缩小预测表的规模,减少查表的功耗吗???