【问题标题】:Correlated branch prediction相关分支预测
【发布时间】:2018-07-06 16:51:19
【问题描述】:

我有一个与相关预测变量相关的练习,其中陈述了以下内容:

A: BEQZ R1, D

D: BEQZ R1, F

F:不是 R1,R1
G:跳A

预测如下

  1. 获取当前指令

  2. 如果是分支,判断预测器的当前状态,预测分支:

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

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

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

  4. 转到步骤 1

这就是解决方案 Solved exercise

我了解该方案,并且知道 2 位预测器意味着更少的错误,但我无法解决这个问题,而且我无法找到解决方案,我们将不胜感激。

【问题讨论】:

    标签: mips branch-prediction


    【解决方案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,而通常寄存器上的算术是模 2n

    在你的练习中,假设是:

    1. 模式历史表以二维表的形式给出,其中行对应于分支的完整地址,列对应于全局历史寄存器的值。
    2. 所有计数器都以状态 01b 开始(弱未采用)。
    3. 全局历史寄存器在复位时为 00b。
    4. R1 开头为 0。

    我们只看第一次迭代。

    第一次迭代

    指令是BEQZ R1, 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 别担心 ;)
    猜你喜欢
    • 2014-04-25
    • 2014-03-03
    • 2012-07-01
    • 2016-07-01
    • 2011-02-01
    • 2015-11-24
    • 2018-01-20
    • 2012-07-02
    • 2015-11-04
    相关资源
    最近更新 更多