当前位置: 首页 > 知识库问答 >
问题:

相关分支预测

莘羽
2023-03-14

我有一个与相关预测因子相关的练习,它指出以下几点:

答:贝兹·R1,D

D:贝兹·R1,F

F:不是R1的R1

预测工作如下

>

  • 获取当前指令

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

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

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

    a、 基于当前状态和实际决策更新单元
    b。更新全局移位寄存器(向左移位并向右添加实际决策位)

    转到步骤1

    这是解题练习

    我理解这个方案,知道2位预测器意味着更少的错误,但我无法解决这个问题,我很难找到解决方案,任何帮助将不胜感激。

  • 共有1个答案

    龙佐
    2023-03-14

    这是Agner Fog的微架构论文(第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执行了分支并刷新了预测错误的阶段,就必须更新该表。< br >由于执行了分支,计数器从01b递增到10b。< br >最后,由于执行了分支,全局历史从00b变为01b(从右侧移入1)。

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

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

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

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

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

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

     类似资料:
    • 我想知道英特尔 i7 处理器的分支预测是如何工作的? 目前,我知道称为“动态分支预测”的预测器。 对于1位预测器:硬件总是预测分支指令的方向与上次执行时的方向相同。 在实践中效果更好的改进版本是2位预测器。为了进一步提高预测精度,引入了2位预测方案。在这些方案中,预测必须错误两次才能改变。 i7有和上面一样的预测器吗

    • 如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么

    • 分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?

    • 编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B

    • 我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要

    • 我正在读一本关于计算机体系结构的书,我在这一章讨论分支预测。有一个小练习,我很难把我的头缠绕在它周围。 考虑以下内部for循环 ------>内循环: b)1位分支预测缓冲器会改善性能吗(与a相比)?假设第一个预测是“未采取”,并且没有其他分支映射到该条目。 ----假设第一个预测是“不采取”,如果预测错误,则1位预测器反转该位。所以它将是NT/T/T。这是否使它具有与问题a)相同的性能?有1个未