首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据风险和停滞

数据风险和停滞
EN

Stack Overflow用户
提问于 2020-08-22 01:14:26
回答 2查看 152关注 0票数 4

我正在为明天的考试做准备,我在下面的代码中遇到了困难:

代码语言:javascript
复制
sub $2, $1, $3
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)

由于寄存器$2上的ALU-ALU依赖关系,sub指令直到第五级才写入其结果,这意味着我们必须在流水线中浪费三个时钟周期。我的问题是为什么有3个时钟周期?这种依赖性可以通过插入两个nops来解决,因此我们浪费了2个时钟周期?请向我澄清这一点,因为我试图将nops与浪费的周期联系起来,我相信我在这里有一个巨大的误解。

EN

回答 2

Stack Overflow用户

发布于 2020-08-22 02:35:48

流水线阶段的名称略低于标准。更常见的是使用IF (从指令存储器IM获取指令)、ID (指令解码和寄存器读取)、EX (执行/ALU)、MEM (数据存储器读取或写入)和WB (写回寄存器结果)。

它是2个时钟周期还是3个时钟周期取决于您的内部架构。

当设计为3个时钟周期方法时,处理器将必须停止3个周期,使得第一指令(周期5)的reg写入(WB)在第二指令的reg读取(ID)可以看到那些最新值之前完全完成。如果没有其他缓解,第二指令的reg读取阶段在时钟周期6之前不能总是获得保证的正确值(而如果没有依赖性/危险,则第二指令将优选地在周期3中完成reg读取(ID)并且被延迟到6,因此6-3=3周期延迟)。

当设计为2个时钟周期时,这意味着在时钟周期5中的第一指令的reg写入(WB)级5与也在时钟周期5中的第二指令的解码(ID) reg读出级重叠。

这样做的原因有以下两种:

  1. Half cycles

代码语言:javascript
复制
- The WB stage is very quick, and, its data is ready at the absolute beginning of the clock cycle (nothing has to be computed at all) — it effectively is completed in the first half of cycle 5 (this example).
- The ID stage is slow and gets the data in the second half of cycle 5 — thus, it obtains data that is up-to-date as of reg writes that happen in this cycle.

  1. 注册转发

代码语言:javascript
复制
- The WB stage's data is available at the absolute beginning of the clock cycle, though WB takes the full cycle.
- The ID stage accesses the register file, but the register file knows about the write happening in this cycle and has an internal forward to ensure that reads read either register values or new values that are being written.  The register file effectively has an internal bypass allowing written values to be read in the same cycle.

我们说这些停顿是有条件的-如果我们不这样做,那么每条指令都会停顿2-3个周期,以防下一条后续指令使用ALU结果。这几乎(但可能不完全)否定了流水线的好处。

让我们注意到,我断言,当我们由于ALU/ALU依赖而需要停止时,检测条件逻辑与执行ALU/ALU旁路(因为它们是同一个测试)的逻辑一样复杂。. 由于旁路完全缓解了性能问题,设计人员总是更喜欢旁路。

旁路的思想是,在第二条指令的EX/ALU阶段中所需的值实际上在CPU中的某处可用-因为它已经在前一个时钟周期中被计算(该值只是不在正确的位置). 问题是第二条指令的reg read (ID)获得陈旧的值:在适当的时候刷新它们(忽略那些陈旧的值并直接从ALU输出中获取它们)是绕过的解决方案。

因此,我觉得谈论ALU/ALU依赖/危险的停滞是很奇怪的,当存在缓解解决方案(例如,旁路)时,我认为即使是原始的MIPS也不需要软件NOP来缓解ALU/ALU危险。(它要求加载后使用,这是一个MEM/ALU危险,需要旁路和停顿,后者在原始MIPS中没有提供,所以软件必须确保使用与加载分开至少一条指令,可能是通过插入NOP)。

票数 2
EN

Stack Overflow用户

发布于 2020-08-22 01:29:36

来自https://courses.cs.washington.edu/courses/cse378/09wi/lectures/lec12.pdf

基本上,受危险影响的第一条指令( and)会损失2个周期,后面的指令( or)会损失1个周期。这里的停顿会影响整个流水线,而不仅仅是下面的指令。

有关这方面的图片,请参阅PDF的第8- 10页。这里是它的一个快速ASCII:

代码语言:javascript
复制
     1   2   3   4   5  
sub IM  Reg ==> DM  Reg 
and     IM   X   X  Reg 
or          IM   X  Reg 

其中X代表摊位。请注意,andor停顿在其流水线的第二阶段,等待来自sub指令的阶段5的结果。

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

https://stackoverflow.com/questions/63527298

复制
相关文章

相似问题

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