胱抑素c偏低的危害:数据危害和停滞(data hazards occur when)

我正在为明天的考试而学习,我在的代码中遇到困难:

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

由于这里对寄存器 $2 的 ALU-ALU 依赖性,子指令直到第五阶段才写入其结果,这意味着我们将不得不在管道中浪费三个时钟周期。我的问题是为什么 3 个时钟周期?这种依赖性可以通过插入两个 nop 来解决,因此我们浪费了 2 个时钟周期?

2

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

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

当设计为 3 个时钟周期的方法时,处理器将不得不停止 3 个周期,以便在第二个指令的 reg read(ID)可以看到那些最新值之前,第一个指令(周期 5)的 reg write(WB)完全完成。没有其他缓解措施,第二个指令的 reg 读取阶段在时钟周期 6 之前始终无法获得保证的正确值(而在没有依赖性 / 危险的情况下,第二个指令最好在 reg reg re

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

这在以下两种方式之一中工作的原因:

半周期

WB 阶段非常快,并且其数据在时钟周期的绝对开始处准备好 (根本不需要计算任何东西)-它有效地在周期 5 的前半部分中完成 (该示例)。

ID 阶段很慢,并且在周期 5 的后半部分获取数据-因此,它获得了在此周期中发生的 reg 写入时最新的数据。

寄存器转发

WB 级的数据在时钟周期的绝对开始处是可用的,尽管 WB 占用整个周期。

ID 级访问寄存器文件,但寄存器文件知道在此周期中发生的写入,并具有内部转发以确保读取正在写入的寄存器值或新值。寄存器文件有效地具有内部旁路,允许在同一周期中读取写入的值。

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

请注意,我断言,检测由于 ALU / ALU 依赖性而需要停止的条件逻辑与执行 ALU / ALU 旁路的逻辑一样复杂(因为它们是相同的测试)。

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

所以,我觉得谈论 ALU / ALU 依赖 / 危险的停顿很奇怪,当存在缓解解决方案 (例如旁路) 时,我甚至不认为原始 MIPS 需要软件 NOP 缓解 ALU / ALU 危险。(它适用于加载后使用,这是一种 MEM / ALU 危险,需要旁路和停顿,后者至少在原始 MIPS 中没有提供),因此必须确保加载与使用分开

0
Fromhttps://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 

注意,andor在它们的流水线的第 2 级停止,等待sub指令的第 5 级的结果。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(591)
客户端文件与服务器不匹配:TCP服务器客户端或客户端服务器
上一篇
Post测试工具:PHP测试工具(php unit testing frameworks)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(7条)