Mips 相关分支预测
我有一个与相关预测值相关的练习,说明如下: A:BEQZ R1,DMips 相关分支预测,mips,branch-prediction,Mips,Branch Prediction,我有一个与相关预测值相关的练习,说明如下: A:BEQZ R1,D … D:BEQZ R1,F … F:不是R1,R1 G:跳A 预测结果如下所示 获取当前指令 如果是分支,则确定预测器的当前状态并预测分支: a、 行由分支地址决定(在本例中为a或D) b、 列由当前全局移位寄存器确定 c、 使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中) 执行分支,并确定实际决策 (已拍摄:1,未拍摄:0): a、 根据当前状态和 实际决策 b、 更新全局移位寄存器(向左移位并将实际判定位添加到
…
D:BEQZ R1,F
…
F:不是R1,R1
G:跳A
预测结果如下所示
b、 列由当前全局移位寄存器确定
c、 使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中)
b、 更新全局移位寄存器(向左移位并将实际判定位添加到右侧)
我了解该方案,知道2位预测器意味着更少的错误,但我无法解决这个问题,我很难找到解决方案,希望您能提供帮助。这是(第15页)中简要描述的具有全局历史记录的两级自适应预测器的变体 在此变体中,历史记录寄存器在所有分支之间共享,但是模式历史记录表是branch1的本地表 最后n个(在您的例子中,n=2个)分支的结果被记住(0=未执行,1=执行),按时间顺序从左到右排列,形成一个n位的值,该值与分支地址2一起用于索引2位饱和计数器表 如果执行分支,每个计数器将递增,否则将递减(这是规范实现,任何4状态FSA都可以)。
每个计数器值的含义是:
00b (0) Strongly not taken
01b (1) Weakly not taken
10b (2) Weakly taken
11b (3) Strongly taken
饱和意味着大于3+1(再次执行强执行分支)=3,并且0-1(再次未执行强执行分支)=0,而寄存器上的算术通常为模2n
在您的练习中,假设如下:
R1
开头是0李>
让我们只看第一次迭代
第一次迭代
指令是beqzr1,D
(显然是一个分支),其地址是a
由于
R1
为0,将执行分支(朝向D
)。在全局历史记录为00b且地址为
a
的表中进行索引,得到计数器值01b(弱不接受),因此不接受预测
一旦CPU执行了分支并刷新了预测失误阶段,表必须更新。由于执行了分支,计数器从01b增加到10b。
最后,自执行分支以来,全局历史从00b变为01b(1从右侧移入) 请注意,黄色突出显示的条目是在执行相应指令时读取的条目,而绿色的条目是由先前预测更新的条目 因此,要查看计数器值是否已增加,必须查看下一行 由于执行了分支,CPU位于
D
(BEQZ R1,F
),这与之前完全相同,只有全局历史寄存器的值为01b
执行此指令后,CPU处于F
,因此R1
变为111..11b(解决方案仅将其指示为1),并重新执行上述两个分支
1这是一种简化,表几乎总是一个缓存。对于可以找到分支的每个可能的内存地址,为其指定一个条目是不切实际的
2将地址的一部分用作缓存中的索引,一旦选择了一个集合,地址将再次与集合中各个方向的标记进行比较。@Joe别担心;)