管道停滞和绕过示例

时间:2013-09-27 01:26:50

标签: pipeline computer-architecture

我正在修读计算机体系结构课程。我在另一所大学找到了这个网站,其中包含了迄今为止帮助我的笔记和视频:CS6810, Univ of Utah。我正在处理these系列笔记,但我需要对一些示例问题进行一些解释。我目前正在查看问题7,第17-18页。解决方案在第18页的注释中给出,但我不确定教授如何得出结论。他在他的班级网页上表示,他没有提供任何解决方案,所以这是不可能的。

对于那些无法查看pdf的人,问题如下:

  

考虑一个8级流水线,其中寄存器读取(RR)和寄存器写入(RW)需要一个完整的周期。密钥:指令获取= IF,解码= DE,ALU = AL,数据存储器= DM,锁存#= L#

     

L1 - > IF - > L2 - > DE - > L3 - > RR - > L4 - > AL - > L5 - > AL- - > L6 - > DM - > L7 - > DM - > L8 - > RR - > L9

     

鉴于以下一系列指令,确定第二条指令的停顿数,有或没有绕过

     
      
  1. ADD R1 + R2 - > R3,ADD R3 + R4 - > R5:没有绕过5,绕过1
  2.   
  3. LD [R1] - > R2,ADD R2 + R3 - > R4:没有绕过5,绕过3
  4.   
  5. LD [R1] - > R2,SD [R2] - > R3:没有绕过5,绕过3
  6.   
  7. LD [R1] - > R2,SD [R3] - > R2:没有绕过5,绕过1
  8.   

我理解他们每个人如何在没有绕过的情况下产生5个档位,并且我理解第一个档位如何仅绕行产生1个档位,但我不确定如何用2-4产生绕行档位。

任何帮助都将不胜感激。

编辑(为了进一步说明,我理解案例的外观): ST =失速,暗示锁存

1

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->AL-->AL-->DM-->DM-->RW                     (with)

没有旁路,I2在进入RR之前停止并且必须等到R3被写入才能进入RR;这种理解在所有案例中都是普遍的。通过旁路,I2可以进入RR但是停止直到算法由I1完成,这是在第二个ALU阶段之后。

2

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->ST-->ST-->AL-->AL-->DM-->DM-->RW           (with)

通过旁路,I2可以进入RR,但必须等到R2处理完毕,这发生在I1的第二个DM阶段之后。

3

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->ST-->ST-->AL-->AL-->DM-->DM-->RW           (with)

通过旁路,I2可以进入RR,但必须等到R2被处理,这发生在I1的第二个DM阶段之后。

4

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->AL-->AL-->ST-->DM-->DM-->RW                     (with)

通过旁路,I2可以沿着管道继续,直到第二个ALU阶段,它必须在此等待,直到它可以拉动R2,直到第二个DM阶段之后才由I1处理。

还有一个,只是为了确保我理解一切:

I1:R1 + R2-> R3,I2:SD [R4]< -R3

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW                          (with)

据我所知,没有绕过它,它会在相同数量的档位(5)停在同一个地方。然而,通过旁路,将有0个停顿,因为I2将使用ALU级来计算寄存器地址,并且当到达存储时,它可以从I1中的第二个ALU级获取信息。

1 个答案:

答案 0 :(得分:1)

情况2和3中的停顿来自第二条指令,取决于它在前一条指令中的加载结果的第一个ALU阶段(直到第二个数据存储器阶段之后才可用,所以如果是早期指令的第二个ALU阶段和两个数据存储器阶段)。 (第一条指令的L8与第二条指令的L4对齐。)

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->L3-->RR-->STALL---->STALL---->STALL---->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9

对于情况4,在第一数据存储器级和第二指令的地址生成部分不依赖于第一指令之前(可能)不需要第二条指令存储在存储器中的值。 (第一条指令的L8与第二条指令的L6对齐。)

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->STALL---->L6-->DM-->L7-->DM-->L8-->RW-->L9

(由于写入内存是一种类似于写入寄存器的架构状态的承诺,因此管道可能更典型,直到RW阶段才需要存储的值。)

不绕过所有寄存器源操作数从寄存器读取阶段的寄存器文件中检索。由于在寄存器写入阶段将新值写入寄存器文件,因此在不绕过给定的8级流水线的情况下,对于此类相关情况将需要5个停顿周期。

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->STALL---->STALL---->STALL---->STALL---->STALL---->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9

通过旁路,可以从可用的最早阶段(用于算术指令的第二个ALU阶段的结束,用于加载指令的第二个数据存储器阶段的结束)传递从属值 - 而不是寄存器写入阶段 - 到需要值的从属指令的最早阶段(在算术指令和地址计算的ALU阶段之前,在存储的数据存储器阶段之前,如果存储需要早期存储的值,则似乎就是这种情况)这个管道) - 而不是Register Read阶段。

(旁白:一些流水线在循环的前半部分执行寄存器写入,而寄存器在循环的后半部分读取。这不仅可以减少寄存器文件所需的访问端口数量,而且还可以允许在一个周期之前从寄存器文件中获取值,因为在写入的同一周期的后半部分中可以读取新写入的值。这样可以减少所需的旁路量。)