首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道失速和绕行实例

管道失速和绕行实例
EN

Stack Overflow用户
提问于 2013-09-27 01:26:50
回答 1查看 3.4K关注 0票数 1

我正在上一门关于计算机架构的课程。我从另一所大学找到了一个网站,其中有笔记和视频,到目前为止对我有帮助:犹他州大学CS6810。我正在研究这些系列的注释,但需要对一些示例问题进行一些解释。我目前正在看问题7,第17-18页.答案在第18页的注释中给出了,但我不太确定教授是如何得出结论的。他在他的课堂网页上说,他没有提供任何解决方案,所以这是不可能的。

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

考虑一个8阶段的管道,其中寄存器读取(RR)和寄存器写入(RW)需要一个完整的周期.键:指令提取= IF,Decode = DE,ALU = AL,数据内存= DM,Latch #= L# L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RR-->L9 给定以下一系列指示,确定第二条指令的档位数目,有和不绕开

  1. 添加R1 + R2 -> R3,添加R3 + R4 -> R5 :不绕过5,绕过1
  2. LDR1 -> R2,添加R2 + R3 -> R4 :不绕过5,绕过3
  3. LDR1 -> R2,SDR2 -> R3 :不绕过5,绕行3
  4. LDR1 -> R2,SDR3 -> R2 :不绕过5,绕过1

我明白他们中的每一个人如何在不绕开的情况下产生5个档位,我也明白第一个档是如何通过旁路产生1个档位的,但我不知道如何用2-4生成旁路档。

任何帮助都将不胜感激。

编辑(为了作进一步的澄清,我对情况的理解):ST = Stall,闩锁是隐含的

1.

代码语言:javascript
复制
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.

代码语言:javascript
复制
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.

代码语言:javascript
复制
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.

代码语言:javascript
复制
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: SDR4 4<-R3

代码语言:javascript
复制
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阶段获取信息。

EN

回答 1

Stack Overflow用户

发布于 2013-09-27 23:52:52

情况2和3中的暂停来自第二指令,这取决于第一ALU阶段的前一指令中负载的结果(直到第二数据存储阶段之后才可用,因此如果对于早期指令的第二ALU阶段和这两个数据存储阶段,则停止)。(L8表示第一条指令线与第二条指令线的L4。)

代码语言:javascript
复制
 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。)

代码语言:javascript
复制
 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周期的停顿这类依赖的情况。

代码语言:javascript
复制
 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阶段之前,算术指令和地址计算阶段之前,存储的数据存储阶段之前,存储区需要存储的值,就像这个管道中的情况一样)--而不是寄存器级读取。

(旁白:一些管道在周期的前半部分执行寄存器写入,在周期的后半部分执行寄存器读取。这不仅可以减少寄存器文件所需的访问端口数量,而且还允许从寄存器文件中提前一个周期使用值,因为新写入值的读取可能发生在写入周期的后半部分。这减少了所需的绕过量。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19041315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档