【问题标题】:small branch prediction exercise (not homework)小分支预测练习(非作业)
【发布时间】:2017-01-14 07:38:33
【问题描述】:

这不是家庭作业。我正在阅读this site,IMO 对分支预测有很好的介绍,并决定在讲座后尝试解决一个问题:

考虑以下代码[无分支延迟槽]:

  add  $2, $0, $0
  addi $11, $0, 5
  addi $12, $0, 3
outer:
  addi $2, $2, 1
  add  $1, $0, $0
inner:
  addi $1, $1, 1
  bne  $1, $11, inner
  bne  $2, $12, outer

第一个加法指令位于地址 0。

  1. 如果我们只使用包含 2 个条目的模式历史表,我们的误预测率是多少? [错误预测率 = # 错误预测 / # 预测]
  2. 如果我们使用具有 2 项本地历史表和 4 项模式历史表的本地历史预测器会怎样?

首先,我想知道,如果条件中有错误,并且两个添加指令都必须像其他指令一样,是立即为 0 而不是 $0 的 addi。有熟悉该主题的人可以评论一下吗?

第二,我试图解决这个问题(考虑add是立即为0的addi,如上所述),并考虑饱和计数器的初始状态强烈不采取强>。我的回答是:

对于 1. 错误预测率 8/10(8 个错误预测,10 个预测)
2. 误预测率 13/5(13 个误预测,5 个预测)
熟悉这个主题的人可以给它检查一下吗?只是想知道我是否真的理解了讲座的材料。 谢谢。

【问题讨论】:

  • Register $0 可能总是 0,而像 addi $11, 0, 0 这样的东西是非法的,因为没有 CPU 支持带有两个立即操作数的指令,因为它们实际上并没有用。
  • 同意。我的意思是比如 addi $2, $0, 0。不过,在这种情况下它必须是相同的。

标签: assembly branch-prediction micro-architecture


【解决方案1】:

$0(也称为 r0 或 $zero)是一个始终为零的寄存器。便于比较和设置变量,在您的示例中,它用于设置变量。请注意,“add $2, $0, $0”等价于“addi $2, $0, 0”,即(在类似 C 的表示法中)“$2 = 0;”。相同的表达式使用不同格式的 mips 指令编码(R and I respectively)

如果我们以类似 C 的方式编写该汇编代码,它看起来像这样:

$11 = 5;
$12 = 3;

$2 = 0;
while ($2 != $12){
    $2++;
    $1 = 0;
    while ($1 != $11)
        $1++;
    }

希望这会有所帮助。

【讨论】:

  • asm 有 do{}while() 循环,就像 asm 的正常情况一样。启用优化后,您会期望您的 C 循环可以在第一次迭代之前优化检查,因为它可以证明循环至少运行一次。但是如果你不打算用与 asm 相同的循环结构来编写它,你不妨把它写成一个for 循环。
  • 这很公平。然而,我的目标是让代码更容易理解,我觉得 while 循环比 do-while 更干净。这当然值得商榷。
  • 我觉得理解 do{}while() 循环对于理解普通 asm (Why are loops always compiled into "do...while" style (tail jump)?) 至关重要。一旦习惯了阅读 asm,就可以轻松阅读 C 中的 do/while 循环。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2014-04-25
  • 2014-03-03
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多