Cpu architecture load指令后,但add指令后,管道暂停

Cpu architecture load指令后,但add指令后,管道暂停,cpu-architecture,Cpu Architecture,我正在做一些关于管道的问题。这个我需要帮助 为什么在加载指令之后,而不是加载指令之后,会出现管道暂停 添加指令 我知道管道中未使用的插槽称为管道失速。我的猜测是,它可能是加载指令后的管道暂停,因为我们需要等待可能更新的寄存器。但是,对于为什么add指令不能创建管道暂停,我无法给出答案。可能是因为在此阶段,我们已经从寄存器中读取了数据?管道暂停用于解决通常由数据依赖性引起的危险。一个Adpe实际上可以产生一个流水线档位,但是让我们先考虑一个不这样的例子。 SUB r2, r3 ADD r1, r2

我正在做一些关于管道的问题。这个我需要帮助

为什么在加载指令之后,而不是加载指令之后,会出现管道暂停 添加指令


我知道管道中未使用的插槽称为管道失速。我的猜测是,它可能是加载指令后的管道暂停,因为我们需要等待可能更新的寄存器。但是,对于为什么add指令不能创建管道暂停,我无法给出答案。可能是因为在此阶段,我们已经从寄存器中读取了数据?

管道暂停用于解决通常由数据依赖性引起的危险。一个Adpe实际上可以产生一个流水线档位,但是让我们先考虑一个不这样的例子。
SUB r2, r3
ADD r1, r2
即使add指令使用减法运算的结果,也不会出现暂停。这是因为EX阶段可以访问上一个EX阶段的数据

现在让我们考虑一个例子,在这个例子中,Adx会产生一个失速。

LOAD r2, RAM[a]
ADD r1, r2
这里,MEM stage从load指令生成的数据需要作为ADD指令的EX stage的输入。EX-stage只能访问前一个EX-stage中的数据,因此,由于存在先读后写的危险,管道将暂停。此图说明了这一点

这可以通过在管道中引入气泡(如NOP)来解决,该气泡可以解决数据依赖性,而无需在时间上向后传播数据(这是不可能的)


通过阅读,您可以更详细地了解这方面的更多信息,

管道暂停用于解决通常由数据依赖性引起的危险。一个Adpe实际上可以产生一个流水线档位,但是让我们先考虑一个不这样的例子。
SUB r2, r3
ADD r1, r2
即使add指令使用减法运算的结果,也不会出现暂停。这是因为EX阶段可以访问上一个EX阶段的数据

现在让我们考虑一个例子,在这个例子中,Adx会产生一个失速。

LOAD r2, RAM[a]
ADD r1, r2
这里,MEM stage从load指令生成的数据需要作为ADD指令的EX stage的输入。EX-stage只能访问前一个EX-stage中的数据,因此,由于存在先读后写的危险,管道将暂停。此图说明了这一点

这可以通过在管道中引入气泡(如NOP)来解决,该气泡可以解决数据依赖性,而无需在时间上向后传播数据(这是不可能的)


通过阅读,您可以更详细地了解这方面的更多信息,

Add通常只有1个周期的延迟,因此通过转发(也称为旁路),Add的结果可以被下一条指令使用,但是我没有读过。Add通常只有1个周期的延迟,因此通过转发(也称为旁路),Add的结果可以被下一条指令使用,但是我没有读到它。我认为,add使用的加载数据并不是真正产生暂停的
add
。我认为这是由于加载,而不是消费者,因为加载在管道中产生的结果比ALU操作晚。此外,加载地址是否需要在这个经典RISC管道示例的前阶段准备好,或者,它是否可以在1c延迟的情况下执行指针跟踪,只是将加载的数据从MEM stage转发回MEM stage?@PeterCordes我认为add正在产生一个暂停。这是因为没有指令,就不会发生失速。暂停是由导致数据依赖性的指令产生的。如果删除了add指令,则不会发生暂停。因此,我认为“添加”确实会产生失速。至于第二个问题,通过操作数转发,指针跟踪成为可能。与“EX”阶段可以从上一个“EX”阶段读取数据的方式相同,“MEM”阶段可以从上一个“MEM”阶段读取数据。谢谢。我认为MEM输出可能必须转到EX输入,用于带有偏移量的寻址模式。(我猜只有一种寄存器寻址模式,但是,MEM阶段的专用AGU只是一个加法器,您可能需要它。)Re:归咎于加法或加载:这是公平的,实际上只是将它们安排在一起这是个问题,而不是一个单独的问题。我是从这样的角度来看的,如果
add
的输入是由ALU指令而不是加载生成的,那么就不会出现暂停。我认为,add所使用的加载数据并不是真正产生暂停的
add
。我将其归因于加载,而不是消费者,由于加载在管道中产生的结果晚于ALU操作。此外,加载地址是否需要在经典RISC管道示例的前一阶段准备好,或者,它是否可以在1c延迟的情况下执行指针跟踪,只是将加载的数据从MEM stage转发回MEM stage?@PeterCordes我认为add正在产生一个暂停。这是因为没有指令,就不会发生失速。暂停是由导致数据依赖性的指令产生的。如果删除了add指令,则不会发生暂停。因此,我认为“添加”确实会产生失速。至于第二个问题,通过操作数转发,指针跟踪成为可能。与“EX”阶段可以从上一个“EX”阶段读取数据的方式相同,“MEM”阶段可以从上一个“MEM”阶段读取数据。谢谢。我认为MEM输出可能必须转到EX输入,用于带有偏移量的寻址模式。(我猜只有一种寄存器寻址模式,但是,MEM阶段的专用AGU只是一个加法器,您可能需要它。)Re:归咎于加法或加载:这是公平的,实际上只是将它们安排在一起这是个问题,而不是一个单独的问题。我是从这样的角度来看的,如果
add
的输入是由