Assembly 尝试理解创建MIPS管道图

Assembly 尝试理解创建MIPS管道图,assembly,mips,computer-architecture,mips32,Assembly,Mips,Computer Architecture,Mips32,我必须创建一个执行以下MIPS代码的管道图。这是一条5级管道。mul和div指令都使用4条执行指令。引用mul指令的赋值 这意味着乘法指令在管道中的运行方式如下:F-D-X0-X1-X2-X3-M-W,一次最多可以运行四条乘法指令。在使用任何乘法阶段时,所有其他指令类型都会从执行阶段被阻止 对于div 这意味着除法指令在管道中的运行方式如下:F-D-X0-X0-X0-M-W。在执行除法时,所有其他指令都会从执行阶段被阻止 这是MIPS代码 xor $r0, $r0, $r0 addiu $r

我必须创建一个执行以下MIPS代码的管道图。这是一条5级管道。
mul
div
指令都使用4条执行指令。引用mul指令的赋值

这意味着乘法指令在管道中的运行方式如下:
F-D-X0-X1-X2-X3-M-W
,一次最多可以运行四条乘法指令。在使用任何乘法阶段时,所有其他指令类型都会从执行阶段被阻止

对于div

这意味着除法指令在管道中的运行方式如下:
F-D-X0-X0-X0-M-W
。在执行除法时,所有其他指令都会从执行阶段被阻止

这是MIPS代码

xor   $r0, $r0, $r0
addiu $r1, $r0, 10
j L1
loop: 
    lw    $r3, 0($r2)
    mul   $r4, $r3, $r3
    mul   $r3, $r3, $r1
    addiu $r0, $r0, 1
    div   $r3, $r4, $r3
    sw    $r3, 0($r2)
    addiu $r2, $r2, 4
L1: 
bne $r0, $r1, -8
我要回答的全部问题是:

Q:绘制一个管道图(表),显示在循环的第一次迭代中MIPS代码的执行情况,无需绕过。 假设数据危险和结构危险 仅使用暂停来解决这些问题。假定处理器假定在解决分支之前不执行分支。 整个项目的CPI是多少

以下是我得到的:

我最大的障碍来自于试图理解跳转指令时该做什么。正如你所看到的,我只是照常办事,但我知道这很可能是完全错误的。我很有信心我正确地处理了
mul
div
之后的指令,这只是
jl1
指令,因为我没有可参考的示例,所以我对这一指令没有信心。CPI作为一种事后思考,虽然我假设我只取总循环数,然后除以指令数?因此,在这种情况下,它将是
(32个周期)/(11个指令)
So
CPI=2.91


谢谢您的时间。

在回答您的问题之前,您应该首先了解分支预测。分支可以使您从新位置获取数据,也可以按正常顺序继续获取数据。等待分支条件解析应该从哪个地址获取通常会导致暂停并浪费一些周期。为了克服处理器使用分支预测或推测的缺点,他们假设一个分支被执行或未执行,并基于此假设继续获取和执行。一旦分支条件被解决,处理器就知道它的假设是正确的还是错误的,如果它是正确的,那么您将继续正常执行,并且您已经节省了几个宝贵的周期,而不是暂停。如果假设被证明是错误的,则将错误执行的指令从管道中清除,并且惩罚通常与暂停等待分支解决的情况相同。更好的分支预测算法具有更高的正确猜测是否分支的概率

正如你在问题中所说的那样

假定处理器假定在解决分支之前不执行分支

处理器使用静态分支预测。它总是假定分支未被执行。如果发现假设错误,则从管道中清除说明


这适用于分支,但不适用于跳转,因为只有分支依赖于条件。跳转无条件执行,不进行预测。因此,在执行跳转指令后,您应该直接从L1继续。

我会回答这个问题,因为我认为它问得很好。但我认为你的MIPS代码是错误的。它跳到
L1
,然后在
bne
行无限循环,该行后退
-8
@Konrad。这只是给出的示例,代码直接从赋值中复制。理解它的第一次迭代就足够了。除非另有说明,否则我们所有的任务通常都基于第一次迭代(如果有循环)。谢谢你的帮助。但是第一次迭代显然没有按照您的想法进行。
mul
指令永远不会运行。@康拉德这里是完整的作业。我是不是完全误解了自己的任务?所以,我想我误解了。当我认为是
2
时,
bne
跳回
8
指令。因此,我将撤回关于代码错误的建议,但你仍然误解了它。执行
j
指令,然后执行
lw
指令(延迟槽),然后执行
bne
。您似乎假设指令是按照给定的顺序执行的,但是存在分支和跳转,因此情况显然不是这样。