相关分支预测

时间:2018-01-27 14:26:19

标签: mips branch-prediction

我有与相关预测因子相关的练习,其中说明了以下内容:

A:BEQZ R1,D
...
D:BEQZ R1,F
...
F:不是R1,R1
G:JUMP A

预测的工作如下:

  1. 获取当前指令

  2. 如果是分支,则确定预测变量的当前状态并预测分支:

    a.row由分支地址(在这种情况下为A或D)确定 b.column由当前的全球移位寄存器确定 c。使用单元格中的值来确定状态机的预测(当前状态保存在单元格中)

  3. 执行分支,并确定实际决策 (拍摄:1,未拍摄:0):

    根据当前状态和更新来更新单元格 实际决定
    b.更新全局移位寄存器(向左移位并将实际决策位添加到右侧)

  4. 转到第1步

  5. 这是解决方案 Solved exercise

    我理解这个方案并且知道2位预测器意味着更少的错误,但是我无法解决这个问题而且我很难找到解决方案是如何找到的,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这是Agner Fog's microarchitecture paper(第15页)中简要描述的两级自适应预测器与全局历史表的变体。

在此变体中,历史记录寄存器在所有分支中共享,但模式历史记录表是分支 1 的本地。

记住最后 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而通常对寄存器的算术是模2 n

在练习中,假设是:

  1. 模式历史表作为2D表格给出,其中行对应于分支的完整地址,列对应于全局历史寄存器的值。
  2. 所有计数器都以状态01b开始(弱未被采用)。
  3. 重置时全局历史记录寄存器为00b。
  4. R1在开头为0。
  5. 让我们看一下第一次迭代。

    第一次迭代

    指令是BEQZ R1, D(显然是分支),地址是A 由于R1为0,因此分支将采取(朝向D)。 使用全局历史00b和地址A索引到表中会给出计数器值01b(弱未采用),因此预测未采用

    一旦CPU执行了分支并刷新了错误预测的阶段,就必须更新表格 由于分支被采用,计数器从01b增加到10b 最后,全局历史从00b到01b,因为分支被采用(1从右侧移入)。

    First iteration as solved in the OP

    请注意,黄色突出显示的条目是在执行相应指令时读取的条目,而绿色条目是由先前预测更新的条目。

    因此,要查看计数器值已递增,您必须查看下一行。

    由于采用了分支,CPU处于DBEQZ R1, F),这与之前完全相同,只有全局历史寄存器的值为01b。

    执行该指令后,CPU处于F,因此R1变为111..11b(解决方案只是将其指示为1),并重新执行上述两个分支。

    1 这是一个简化,表几乎总是一个缓存。对于可以找到分支的每个可能的存储器地址的条目是不切实际的。

    2 部分地址用作缓存中的索引,一旦选择了一个集合,地址将再次与集合中每个方式的标记进行比较。