Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mips 计算机体系结构管道暂停_Mips_Pipeline_Cpu Architecture - Fatal编程技术网

Mips 计算机体系结构管道暂停

Mips 计算机体系结构管道暂停,mips,pipeline,cpu-architecture,Mips,Pipeline,Cpu Architecture,首先,对不起,我的英语很差。这个问题是我的计算机架构课程教材中的一个问题。我在网上找到了答案,但仍然无法找到细节 以下是五阶段(提取、解码、执行、存储、写入)单管道微体系结构中的指令阶段,无需转发机制除LW和SW为1+2,分支为1+1外,所有操作均为一个周期。 Loop: C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 ... LW R3, 0(R0) F D E M - -

首先,对不起,我的英语很差。这个问题是我的计算机架构课程教材中的一个问题。我在网上找到了答案,但仍然无法找到细节

以下是五阶段(提取、解码、执行、存储、写入)单管道微体系结构中的指令阶段,无需转发机制除LW和SW为1+2,分支为1+1外,所有操作均为一个周期。

Loop:             C1  C2  C3  C4  C5  C6  C7  C8  C9  C10 C11 C12 C13 C14 ...
LW   R3, 0(R0)    F   D   E   M   -   -   W
LW   R1, 0(R3)        F   D   -   -   -   E   M   -   -   W
ADDI R1, R1, #1           F   -   -   -   D   -   -   -   E   M   W
SUB  R4, R3, R2                           F   -   -   -   D   E   M   W
SW   R1, 0(R3)                                            F   D   W   M   ...
BNZ  R4, Loop                                                 F   D   E   ...
...
我有几个问题:

  • 为什么第二条指令可以在C2中启动D?据我所知,D-stage包括“寄存器读取”,但之前的指令直到C7才写回R3

  • 与前一个类似,是什么原因导致第三个仪表D从C7开始,E从C11开始

  • 为什么第四次安装必须从C7开始,而不是从C4开始


  • 这个问题源于《计算机体系结构:定量方法5e》一书,示例3.11。

    当您的管道执行内存相关操作(LW)时,它似乎冻结了整个系统,除了我想不出ADDI无法在C4中执行解码的有效原因之外。我并不是说加载操作冻结整个执行是有效的,但这似乎是“唯一”合乎逻辑的解释

    指令2可以在C3中执行解码,但它必须等到指令1将其数据写回
    R1
    。这就是为什么第二条指令的执行延迟到
    C7

    顺便说一句,当你说你在“网上”找到了答案时,是不是来源可靠?

    答案很好。如果你没有,就去看看吧

  • 为什么第二条指令可以在C2中启动D?D包括reg read,但上一条指令直到C7才写回R3
  • 我不确定,我没有花很多时间在经典的RISC管道上。根据我们对this和ADDI的了解,寄存器读取似乎发生在E阶段

    这很好地解释了在前一次加载写回之前E暂停的原因。如果您确定reg read应该发生在您正在研究的管道的D阶段,那么此解决方案与您的管道不匹配;这对于在执行之前不读取寄存器的不同管道是正确的

    第三个仪表D从C7开始,E从C11开始

    管道的D级被前一条指令占用,直到C7,此时它可以解码

    R1直到第11周期才准备就绪,此时从上一条指令的内存阶段开始,因此ADDI的执行可以与上一条指令中的写回并行进行。这被称为“旁路”

    旁路可以让ALU操作以1个周期的延迟运行,因此您可以在下一条指令中使用外接程序的输出,而不会出现暂停

  • 为什么第四次安装必须从C7开始,而不是从C4开始

  • 因为前一条指令在fetch阶段被暂停,并且它是一个顺序管道;没有无序执行。

    为什么第二条指令可以在C2中启动D?D包括reg read,但上一条指令直到C7才写回R3。

    Loop:             C1  C2  C3  C4  C5  C6  C7  C8  C9  C10 C11 C12 C13 C14 ...
    LW   R3, 0(R0)    F   D   E   M   -   -   W
    LW   R1, 0(R3)        F   D   -   -   -   E   M   -   -   W
    ADDI R1, R1, #1           F   -   -   -   D   -   -   -   E   M   W
    SUB  R4, R3, R2                           F   -   -   -   D   E   M   W
    SW   R1, 0(R3)                                            F   D   W   M   ...
    BNZ  R4, Loop                                                 F   D   E   ...
    ...
    
    Ans-这是因为MIPS simple pipleline中的解码器级有两部分/子级

    DEC=解码+RR(寄存器读取)

    指令可以被解码,也就是说,操作码可以被读取和解码,但由于这种情况下的依赖性,RR将暂停,直到第一条加载指令执行(从内存中获取R3),并且通过C7中的简单转发,下一个加载可以进入执行

    解码阶段在两个子阶段的中断是为了避免结构危险。 如果您再次阅读“计算机体系结构:定量方法”图表,您将看到一条虚线和实线,这条虚线和实线是特意绘制的,以显示总体工作分为两部分(解码操作码+REG读取)

    另外两个问题我同意@Peter Cordes

    希望这有帮助。
    Jaymin

    你能用你在哪里找到的链接来编辑这个问题吗?我认为OP关于reg read发生在D阶段的说法是错误的。ADDI延迟的原因与您确定的指令2延迟的原因相同:输入未准备就绪,没有任何奇怪的“冻结整个机器”内容。@PeterCordes如果是这样,为什么'SUB R4,R3,r2f----demw'@PeterCordes如果这是子指令解码延迟的原因?顺序执行:它前面的指令被暂停。见我回答中的第3点。@PeterCordes谢谢。看起来一切都取决于解码阶段试图读取寄存器的事实。对我来说,这没有多大意义,因为解码单元的工作告诉“在哪里”读,而不是“读什么”。谢谢,如果寄存器读取是在
    EXE
    阶段完成的,那么指令阶段就可以完全解释了!