所以从我的延迟槽的了解,他们在一个分支指令被称为发生和之后的下一条指令的分支也被从内存中加载。 这样做有什么意义呢? 你会不会想到之后的分支没有的情况下运行的代码分支被采用? 难道以节省时间的情况下所采取的分支心不是?
我在看一个管道图,似乎该指令分支得到执行反正以后。
所以从我的延迟槽的了解,他们在一个分支指令被称为发生和之后的下一条指令的分支也被从内存中加载。 这样做有什么意义呢? 你会不会想到之后的分支没有的情况下运行的代码分支被采用? 难道以节省时间的情况下所采取的分支心不是?
我在看一个管道图,似乎该指令分支得到执行反正以后。
大多数处理器这些天使用的管道。 从H&P书(S)的想法和问题得到了广泛的。 在这些原始的文字的时候,我将承担实际的硬件相匹配的管道的特定概念。 取指,译码,执行,写回。
基本上,管道是一条流水线,随着线四个主要阶段,所以你必须在最多四个指令,在参与过。 这混淆了它需要多少个时钟执行一条指令,以及它需要多于一个时钟的概念,但如果你有一些平行/多然后执行“平均”可以接近或超过每时钟之一。
当你把一个分支,虽然装配线失败。 在提取和解码阶段的指令都被扔了,你必须重新开始填充,所以你需要几个时钟的命中取指,译码,然后再返回到执行。 分支阴影或延迟槽的想法是要收回这些时钟之一。 如果您声明一个分支之后的指令总是被执行,然后在转移取指令的解码插槽也被执行,在取插槽指令被丢弃,你有时间不是两个一个孔。 因此,而不是执行,空,空,执行,执行你现在有执行,执行,空,执行,执行......在流水线的执行阶段。 该分支是50%,那么痛苦,您的整体平均执行速度提高,等等。
ARM没有延迟槽,但它提供了一个管道的幻想中,通过宣布该程序计数器是提前两个指令。 依赖于程序计数器的任何操作(PC相对寻址)必须计算使用PC则前面两条指令,对于ARM指令,这是原来的拇指4个字节,当你向它就会变得混乱Thumb2指令加8个字节偏移。
这些都是在这个点之外的学者,管道较深,有很多的技巧等,为了遗留代码继续工作,和/或不必重新定义的指令对每个架构的变化是如何工作的(想象MIPS转幻想的x,1个延迟时隙,转速Y 2延迟槽,转速Z 3个时隙如果条件a和2个时隙,如果条件b,如果条件c 1个时隙),处理器前进并执行分支后的第一条指令,并丢弃其他少数或打后,它重新填充管。 有多深的管道真的是往往不与公众共享。
我看到了有关这是一个RISC的事情评论,它可能已经开始有,但CISC处理器使用完全相同的招数,只是让原有指令集的错觉,有时在CISC处理器只不过是一个RISC或VLIW内核与多一个包装仿效传统CISC指令集(微编码)。
观看其如何做表演。 可视化的组装线,在所述线中的每个步骤具有一个任务。 如果其中有一步线跑出蓝色whatsits的,并让你需要的蓝色whatsits蓝色和黄色产物。 而且因为有人搞砸了,你不能让一个星期新的蓝色whatsits。 所以,你必须停止生产线,改变耗材每个阶段,使红色和绿色产品的同时,通常会被正确地分阶段进行,而不倾线。 这就像什么用树枝发生,在流水线的某个地方深,什么使这一行必须改变,转储线。 延迟槽是从具有在该行被丢弃回收一种产品的方法。 替代N产品出来行停止之前,N + 1周的产品出来了每生产运行。 代码的执行就像是生产运行的突发状况,你经常会得到短,有时长,创下了分支前直线执行路径去另一个短的执行路径,另一支短执行路径...
你会不会想到之后的分支没有的情况下运行的代码分支被采用?
但已经太晚了。 一个CPU流水线的全部目的就是要完成每个周期的指令。 你可以做到这一点的唯一方法是通过获取每个周期的指令。 所以分支指令后的代码已经被取出,并在飞行中采取该分支具有CPU通知书之前。
这样做有什么意义呢?
无关紧要。 这不是一个功能,它只是这种管道设计的神器。
即使指令分支后出现在节目中,它实际上分支被采用之前运行。 退房的维基百科页面关于延迟槽和分支危险 。
该RISC结构的想法是为了简化解码,优化管线速度。 CPU试图通过流水线等若干指令被同时执行重叠指令执行。
延迟槽的点特别是执行一个已经使得它通过管道的一部分,现在是一个插槽,否则就必须被扔掉的指令。
优化器可以采取的分支目标的第一条指令并将其移动到延迟槽,得到它执行的“免费”。
该功能并没有成为主流,主要是因为全球标准化现有的ISA 1级的设计,即x86和x86-64的,也是另一个原因。
在晶体管数量的二次爆炸提出了非常复杂的解码器成为可能。 当架构可见ISA正在翻译成微操作,无论如何,如延迟槽小黑客变得不重要。
在流水线执行的典型例子,一个CPU 读取 , 解码 , 执行 ,和写回 。 因此,实际上,每条指令在4个周期完成这些阶段都发生在不同时钟周期。 然而当第一操作码是即将从内存解码,接下来的负荷。 当CPU被完全占用,也有同时处理的4个不同的指令部分和CPU的吞吐量是每个时钟周期一条指令。
当在机器代码有一个序列:
sub r0, #1
bne loop
xxx
该处理器可以反馈从写回的阶段信息sub r0, #1
来执行的阶段bne loop
,但在同一时间的xxx是已经在阶段取 。 为了简化展开管道的必要性时,CPU设计师选择使用延迟槽代替。 后在延迟槽的指令被取出,取指单元具有分支目标的正确地址。 优化编译器很少需要投入的延迟插槽NOP,但插入那里,必然需要在两个可能的分支目标的指令。