Mips 相关分支预测

Mips 相关分支预测,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、 更新全局移位寄存器(向左移位并将实际判定位添加到

我有一个与相关预测值相关的练习,说明如下:

A:BEQZ R1,D

D:BEQZ R1,F

F:不是R1,R1
G:跳A

预测结果如下所示

  • 获取当前指令

  • 如果是分支,则确定预测器的当前状态并预测分支:

    a、 行由分支地址决定(在本例中为a或D)
    b、 列由当前全局移位寄存器确定
    c、 使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中)

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

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

  • 转到步骤1

  • 这就是解决办法


    我了解该方案,知道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

    在您的练习中,假设如下:

  • 模式历史表是一个2D表,行对应于分支的完整地址,列对应于全局历史寄存器的值
  • 所有计数器均以01b状态启动(弱不使用)
  • 重置时,全局历史记录寄存器为00b
  • 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别担心;)