Assembly 小分支预测练习(非家庭作业)

Assembly 小分支预测练习(非家庭作业),assembly,branch-prediction,micro-architecture,Assembly,Branch Prediction,Micro Architecture,这不是家庭作业。我在读一本书,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 第一条add指令位于地址0处 如果

这不是家庭作业。我在读一本书,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
第一条add指令位于地址0处

  • 如果我们只使用一个包含2个条目的模式历史表,预测失误率是多少?[预测失误率=#预测失误/#预测失误]
  • 如果我们将本地历史预测器与2个条目的本地历史表和4个条目的模式历史表一起使用会怎么样
  • 首先,我想知道条件中是否有错误,两条add指令必须像其他指令一样,都是addi,立即数为0,而不是$0。熟悉这个主题的人能对此发表评论吗

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

    1。预测失误率为8/10(8次预测失误,10次预测)
    两个人。预测失误率为13/5(13次预测失误,5次预测)
    熟悉这门学科的人能检查一下吗?只是想知道我是否真的理解了讲座的内容。 谢谢。

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

    如果我们以类似于C的方式编写汇编代码,它将如下所示:

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

    希望这有帮助。

    寄存器$0可能总是0,类似于
    addi$11,0,0
    的内容将是非法的,因为没有CPU支持带有两个立即操作数的指令,因为它们实际上没有用处。同意。我是说smth。比如addi$2,$0,0。但是,在这个上下文中必须是相同的。asm有
    do{}while()
    循环,就像asm的普通循环一样。启用优化后,您可能希望您的C循环能够在第一次迭代之前优化掉检查,因为它可以证明循环至少运行一次。但是,如果您不打算使用与asm相同的循环结构来编写它,那么您可以将其作为
    for
    循环来编写。这是公平的。然而,我的目标是让代码更容易理解,我觉得while循环比whiles更干净。这当然是有争议的。我觉得理解
    do{}while()
    循环对于理解正常的asm()是至关重要的。一旦习惯了阅读asm,就可以轻松地阅读C中的do/while循环。