微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据危险和停顿

如何解决数据危险和停顿

我明天要为考试而学习,在以下代码中遇到困难:

sub $2,$1,$3
and $12,$2,$5
or $13,$6,$2
add $14,$2
sw $15,100($2)

由于此处ALU-ALU对寄存器$ 2的依赖性,子指令直到第五级才写入结果,这意味着我们将不得不在流水线中浪费三个时钟周期。我的问题是为什么要3个时钟周期?这种依赖性可以通过插入两个nop解决,因此我们在浪费2个时钟周期?请在向我说明这一点,因为我正在尝试将浪费时间与浪费的周期联系起来,并且我确信我在这里存在巨大的误解。

解决方法

管道阶段的名称比标准名称少一些。更常见的是使用IF(从指令存储器IM取指令),ID(指令解码和寄存器读取),EX(执行/ ALU),MEM(数据存储器读取或写入)和WB(回写寄存器结果)。 / p>

是2个时钟周期还是3个时钟周期取决于您的内部体系结构。

当设计用于3个时钟周期的方法时,处理器将不得不停顿3个周期,以便在第二条指令的reg读取(ID)可以完成之前,第一条指令的reg写(WB)完全完成(周期5)。查看这些最新值。如果没有其他缓解措施,则第二条指令的reg读取阶段将无法始终获得适当的值,直到时钟周期6为止(而没有依赖性/危险性,第二条指令最好在周期3中完成reg读取(ID)并被延迟到6 ,因此6-3 = 3个循环延迟)。

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

此功能以下列两种方式之一起作用的原因:

  1. 半周期

    • WB阶段非常快,并且它的数据在时钟周期的绝对开始时就已经准备好了(根本不需要计算任何东西)-它实际上在周期5的前半部分完成了(此示例)。
    • ID阶段很慢,并且在周期5的后半段获取数据-因此,它获取的数据是在该周期发生的reg写入之前最新的数据。
  2. 注册转发

    • 尽管WB需要整个周期,但WB阶段的数据在时钟周期的绝对开始时可用。
    • ID阶段访问寄存器文件,但是寄存器文件知道此周期中发生的写操作,并具有内部转发功能,以确保读取操作读取寄存器值或正在写入的新值。寄存器文件有效地具有内部旁路,允许在同一周期内读取写入的值。

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

让我们注意到,我断言要检测何时由于ALU / ALU依赖性而确实需要停顿的条件逻辑与进行ALU / ALU旁路的逻辑一样复杂(因为它们是相同的测试)。由于旁路技术可以完全缓解性能问题,因此设计人员总是喜欢使用旁路技术。

绕过的想法是第二条指令的EX / ALU阶段所需的值实际上在CPU的某个位置可用-因为它已经在先前的时钟周期中计算过(该值不在正确的位置) )。问题在于第二条指令的reg读取(ID)获得了过时的值:在适当的情况下刷新它们(忽略这些过时的值并直接从ALU输出中获取它们)是旁路解决方案。

所以,我发现谈论ALU / ALU依赖/危害的停顿很奇怪,当存在缓解解决方案(例如绕过)时,我认为即使是原始的MIPS也不需要缓解ALU / ALU危害的软件NOP。 (它确实在负载之后使用,这是MEM / ALU危险,需要旁路和堵转,而最初的MIPS中未提供后者,因此软件必须确保通过将使用与负载分开来)可能至少需要插入一条NOP指令。

,

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

基本上,对于受危害影响的第一条指令(和),您损失了2个周期;对于随后的危险(或),您损失了1个周期。停滞不止是下面的指令,而且冲击了整个管道。

有关此图片,请参见PDF的8-10页。这是它的快速ASCII:

     1   2   3   4   5  
sub IM  Reg ==> DM  Reg 
and     IM   X   X  Reg 
or          IM   X  Reg 

其中X表示停转。请注意,andor停滞在其流水线的第二阶段,等待sub指令的第5阶段的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。