处理器中的流水线技术

处理器中的流水线技术处理器中的流水线技术在现代处理器中,流水线是一个最基本的概念。在了解cpu的时候,很多时候会提及拥有多少级流水线。虽然这个概念并不是在计算机技术中诞生的,但是这个技术却在处理器世界中大放异彩。流水线(Pipeline)技术是指程序在执行时候多条指令重叠进行操作的一种准并行处理实现技术。通俗的讲将一个时序过程,分解成若干个子过程,每个过程都能有效的与其他子过程同时执行。这种思想最初是在RIS

大家好,欢迎来到IT知识分享网。

处理器中的流水线技术

在现代处理器中,流水线是一个最基本的概念。在了解cpu的时候,很多时候会提及拥有多少级流水线。虽然这个概念并不是在计算机技术中诞生的,但是这个技术却在处理器世界中大放异彩。

流水线(Pipeline)技术是指程序在执行时候多条指令重叠进行操作的一种准并行处理实现技术。通俗的讲将一个时序过程,分解成若干个子过程,每个过程都能有效的与其他子过程同时执行。这种思想最初是在RISC的架构中出现的,旨在提高处理器处理效率,争取在一个时钟周期中完成一条指令。

最经典的当属MIPS(无内部互锁的流水线处理器)的五级流水线技术。MIPS体系结构本身就是为了流水线而设计的,cpu在高速缓存中运行,每条指令的执行过程都分成五级。每一级成为一个流水线阶段,每个阶段占用固定的时间,通常是一个时钟周期。

处理器中的流水线技术

上图是MIPS的五级流水线

其中:

IF(instruction fetch),从指令高速缓存中获取下一条指令。

RD(Read register),从指定的源寄存器域中指定的cpu寄存器中读取数据。

ALU(arithmetic/logic  unit),算术和逻辑运算操作。

MEM(memory R/W),读写数据高速缓存中的内存变量。

WB(Write back),将结果写入寄存器堆中。

 

很明显,如果只执行一条指令的话,流水线是不会提高效率的。但是如果要完成多条指令,利用流水线的并行原理,其实是可以提高几倍的处理速度。

由于流水线技术的高效性,后来所有的处理器都引进了该实现,当然包括x86的处理器,当年奔四号称20级的流水线结构。但是,是不是流水线级数越多越好呢?流水线级数越多,在处理多指令的时候确实也会越高效,但必然以高成本为代价,同时也会出现很多相关的一些副作用。

流水线的更多详细说明可以参阅更多书籍或者wiki。对于基础书籍推荐一下《大话处理器》的部分章节。

 

处理器中的冒险

流水线给处理器带来了效率,当然也有问题。称之为流水线冒险(HaZard)。

1、  结构冒险

由于处理器资源冲突,而无法实现某些指令或者阶段的组合实现,就称之为处理器有结构冒险。

比如,早期的处理器中,程序和数据是存储在一起的,那么容易出现下图的情况:在第四个cycle中,IF和MEM同时访问存储器导致有一个操作要等待,此时hazard就出现了。现在的处理器已经解决了该问题:指令存储在L1P cache中,数据存储L1D cache中,单独访问,不会影响相互操作。

处理器中的流水线技术

2、  数据冒险

如果流水线中原来有先后顺序的指令同一时刻处理时,可能会导致出现访问了错误的数据的情况。

处理器中的流水线技术

在汇编语句中,add R1,R2,R3 将寄存器R2和R3的和赋予R1,改变R1的值;而紧接着下面的语句:add R4,R1,R5则会使用R1的值,可是R1必须在第一条语句中的第5个cycle才能更新到寄存器中,语句二是在第4个cycle就要访问R1,也就是说第二,条指令此时在使用错误的R1的值。这是数据hazard出现了。

很容易就能想到一种方式解决:在两条指令中添加一条空指令:nop。但是会影响处理器的指令的执行效率。在现代处理器技术中,已经用forwarding的方式解决了。如下图,如果处理器在检测到当前指令的源操作数正好在流水线的EX或者MEM阶段,接直接将ex和mem寄存器的值传递给ALU的输入,而不是再从寄存器堆中获取数据了。因为此时寄存器堆中的数据可能是没有被及时更新的。

当然不仅在EX阶段有这种问题出现,在mem阶段也容易出现。

 处理器中的流水线技术

3、  控制冒险

在流水线中的的执行指令时,由于并行处理的关系,后面很多指令其实都在流水线中开始处理了,包括预取值和译码。那么,如果此时程序中出现一条跳转语句怎么办呢?因为程序已经跑到其他地址处执行,流水线中之前已经做好的预取值和译码动作都不能使用了。这些会被处理器的专有部件flush掉,重新开始新的流水线。此时我们可以称之为出现了控制hazard。这种情况对于程序和效率来说是存在很大损失的。

当然,我们也有解决方案,也就是在jump指令后面(不会被真正使用,但是会进入流水线)添加nop。在MIPS程序中,经常在jump指令后面添加nop语句。

在X86架构中,是通过硬件来实现flush,将无效的流水线排空,以保证正确运行流水线。这里会涉及到分支预测技术的使用。

在其他一些处理器中,用软件的方式来处理,添加nop。同时在编译器中通过乱序的思想用有效指令代替nop。这样也可以避免转跳带来的性能损失。

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21468.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信