Assembly 延迟槽有什么意义?

Assembly 延迟槽有什么意义?,assembly,mips,cpu-architecture,branch-prediction,pipelining,Assembly,Mips,Cpu Architecture,Branch Prediction,Pipelining,因此,根据我对延迟槽的理解,它们发生在调用分支指令时,并且分支后的下一条指令也从内存加载。这有什么意义?在分支被执行的情况下,您不希望分支后的代码不运行吗?是否为了节省时间,以防分支机构未被占用 我正在看一个管道图,看起来分支后的指令仍在执行。即使该指令出现在分支后的程序中,它实际上在执行分支之前运行。查看关于和的维基百科页面 在分支被执行的情况下,您不希望分支后的代码不运行吗 但是已经太晚了。CPU管道的全部用途是希望在每个周期完成一条指令。实现这一点的唯一方法是每个周期提取一条指令。因此,分

因此,根据我对延迟槽的理解,它们发生在调用分支指令时,并且分支后的下一条指令也从内存加载。这有什么意义?在分支被执行的情况下,您不希望分支后的代码不运行吗?是否为了节省时间,以防分支机构未被占用


我正在看一个管道图,看起来分支后的指令仍在执行。

即使该指令出现在分支后的程序中,它实际上在执行分支之前运行。查看关于和的维基百科页面

在分支被执行的情况下,您不希望分支后的代码不运行吗

但是已经太晚了。CPU管道的全部用途是希望在每个周期完成一条指令。实现这一点的唯一方法是每个周期提取一条指令。因此,分支指令之后的代码已经被提取,并且在CPU注意到必须执行分支之前正在运行

这有什么意义


没有意义。它不是一个特性,它只是这种流水线设计的产物。

在教科书中的流水线实现示例中,CPU获取、解码、执行和写回。这些阶段都在不同的时钟周期内发生,因此实际上,每条指令在4个周期内完成。然而,当第一个操作码即将被解码时,下一个操作码将从内存加载。当CPU完全被占用时,同时处理4条不同指令的部分,CPU的吞吐量为每时钟周期一条指令

机器代码中有一个序列时:

      sub r0, #1
      bne loop
      xxx

处理器可以将
sub r0、#1
的写回阶段的信息反馈到
bne循环的执行阶段
,但同时xxx已经处于提取阶段。为了简化展开管道的必要性,CPU设计者选择使用延迟槽代替。在提取延迟槽中的指令后,提取单元具有正确的分支目标地址。优化编译器很少需要在延迟槽中放入NOP,而是在延迟槽中插入两个可能的分支目标上都需要的指令。

现在大多数处理器使用管道。H&P手册中的想法和问题随处可见。在撰写这些原始著作时,我假设实际的硬件与管道的特定概念相匹配。获取、解码、执行、写回

基本上,管道是一条装配线,生产线中有四个主要阶段,因此一次最多只能处理四条指令。这混淆了执行一条指令需要多少个时钟的概念,它需要多个时钟,但是如果有一些/多个并行执行,那么“平均”可能接近或超过每个时钟一个

当你在装配线出故障的情况下进行分支时。获取和解码阶段的指令必须被抛出,并且您必须再次开始填充,因此您需要点击几个时钟来获取、解码,然后返回执行。分支阴影或延迟槽的想法是恢复其中一个时钟。如果声明始终执行分支后的指令,则当执行分支时,解码槽中的指令也会执行,取回槽中的指令将被丢弃,并且只有一个时间孔而不是两个时间孔。所以你现在有了execute,execute,empty,execute,execute,execute。。。在管道的执行阶段。分支减少了50%的痛苦,总体平均执行速度提高,等等

ARM没有延迟槽,但它通过声明程序计数器前面有两条指令,也给人一种管道的错觉。任何依赖程序计数器(pc相对寻址)的操作都必须使用一台pc计算偏移量,该pc超前两条指令,对于ARM指令,原始thumb指令为8字节,原始thumb指令为4字节,当您添加thumb 2指令时,它会变得混乱

在这一点上,这些都是学术界以外的幻觉,管道更深入,有很多技巧等,以便遗留代码继续工作,和/或不必重新定义指令如何为每个架构更改工作(假设mips rev x,1个延迟插槽,rev y 2个延迟插槽,rev z 3个插槽(如果条件a),2个插槽(如果条件b),1个插槽(如果条件c)处理器继续执行分支后的第一条指令,并在重新填充管道时丢弃其他少量或十几条指令。管道的实际深度通常不会与公众共享

我看到一条关于这是RISC的评论,它可能是从那里开始的,但CISC处理器使用相同的技巧,只是给人一种传统指令集的错觉,有时CISC处理器只是一个RISC或VLIW内核,带有一个包装器来模拟传统CISC指令集(微码)

看看它是如何制作的。想象一条装配线,生产线中的每一步都有一个任务。如果生产线中的一步用完了蓝色的东西,而要生产蓝色和黄色的产品,你需要蓝色的东西。而且你不能再获得新的蓝色的东西,因为有人搞砸了。所以你必须停止生产线,更换供应商s到每个阶段,生产红色和绿色的产品一段时间,通常可以在不倾倒生产线的情况下适当地分阶段生产。这就像在装配线深处的某个分支发生的情况一样,某些事情导致生产线必须改变,倾倒生产线。延迟槽是一种从必须拆卸的产品中恢复一个产品的方法在生产线中打卡。不是在生产线停止前生产N个产品,而是在每次生产运行中生产N+1个产品。代码的执行就像是生产运行的爆发,你经常会出现短缺,有时甚至是低成本