【问题标题】:2 bit branch predictor with two for loops具有两个 for 循环的 2 位分支预测器
【发布时间】:2017-07-09 03:59:10
【问题描述】:

我有一个 2 位的分支预测器,我的起始状态是弱取的,我需要计算预测精度:

for (int i=0; i < 100; i++)
{
   for (int j=0; j < 50; j++)
   {
   ...
   }
}

所以在 i = 0 时,我们采用分支,所以我们在 i = 0 和 j = 0 处,并将我们的预测器设置为强烈采用,对吧?因此,如果我们现在迭代 j,这是否意味着我们没有采用新的分支?由于我们仍在 i = 0 分支中,还是每次迭代都算作一个新分支?

【问题讨论】:

  • 尽量明确它是关于分支预测的。其他我读过这个,不明白这是一个明确定义的主题......

标签: cpu-architecture


【解决方案1】:

让我们先手动将其编译成 x86 程序集以便更好地理解(任何其他都可以这样做):

    mov ebx, 0        // this is our var i
.L0:
# /------------ inner loop start -----------\ 
    mov eax, 0        // this is our var j
.L1: 
    // ...
    add     eax, 1
    cmp     eax, 50
    jl      .L1       // jump one
# \------------ inner loop end -------------/
    add     ebx, 1
    cmp     ebx, 100
    jl      .L0       // jump two

即使你不熟悉汇编,我认为这段代码也很简单:

  • ebx 设置为 0
  • 跳二回这里
    • eax设置为0
    • 跳一个回到这里
      • 执行我们的循环代码// ...
      • 1 添加到eax
      • 比较 eax50(这会设置标志寄存器中的一些位)
      • 如果 eax 不是 50,则跳转到标签 .L1:
    • 1 添加到ebx
    • 比较 ebx50(这会设置标志寄存器中的一些位)
    • 如果 ebx 不是 100,则跳转到标签 .L0:
  • 循环结束

所以在第一次迭代中,我们到达 jump one 并预测它将被采用。从eax &lt; 50 开始,我们接受它并将其更新为强烈接受。现在我们再做 48 次。在第 50 次迭代中,我们不会跳转,因为 eax == 50。这是一个单一的错误预测,我们更新为弱采用。

现在我们第一次到达跳二。因为ebx &lt; 100 我们接受它并将其更新为强烈接受。现在我们通过跳转到L0 重新开始那个内部循环。我们又这样做了 98 次。在内部循环的 100 次迭代中,我们不会跳转,因为 ebx == 100。这是一个单一的错误预测,我们更新为弱采用。

所以我们执行内循环 100 次,每次 一次错误预测,对于 跳一次,总共 100 次错误预测 em> 和 100 * 49 = 4900 正确预测。外层循环只执行一次,并且只有 1 个错误预测99 正确预测

【讨论】:

  • 很抱歉我的回复晚了,因为我已经写了考试,所以我完全忘记检查了,但下学期我会再次需要它。非常感谢您的帮助。
  • @llllllIIIIll 如果您认为它是一个好的答案,请随时投票;)
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 2012-08-28
  • 2016-05-16
  • 2013-11-08
  • 2021-12-20
  • 2018-11-30
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多