首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

处理器结构体系-2

处理器结构体系-2

本帖最后由 look_w 于 2017-9-22 21:32 编辑

注意】(个人理解)
早期的没有流水线的CPU可不是一个周期执行一条指令,我们的SEQ处理器只不过是为了讲解CPU的时序而特意做成的一个周期执行一条指令,这样做,使得一个时钟周期的时间特别长(因为我们要等主存把指令加载到指令寄存器,有的指令还要等待数据寄存器把数据写入到主存)。

若按照执行时间最长的指令的执行时间作为时钟周期,则时钟的粒度太大,因为不同的指令需要的执行时间不同,时钟粒度太大会导致有些指令早早执行完毕,但CPU还得闲着,等待本周期结束。(我们的六步划分是针对所有指令整体而言的,很多指令只经历其中几步)

故早期的CPU设计者,把由一个大组合逻辑完成的执行,分割成几个阶段,由几个小组合逻辑完成。中间插入寄存器保存中间结果,就像后面讲的流水线机制那样,只是指令顺序进入,一条指令运行完,下条指令才开始进入。
这样做的好处是,由于各种指令涉及的阶段不同,有的指令经历较少的阶段就完成了,有的指令要经历较多的阶段,运行一条指令所需的时间不同了,小于等于最耗时指令的时间。(而我们设计的SEQ处理器每条指令都要经历同样的大组合逻辑,时钟周期只能定为最耗时指令的时间)
[类比内存管理的分页机制,提高内存利用率。]

1978年的Intel 8086,需要多个(通常是3~10个)时钟周期来执行一条指令。比较先进的处理器可以保持每个时钟2~4条指令的执行速率。其实每条指令从开始到结束需要长的多的时间,大约20个或者更多的周期,但是处理器使用了非常多的聪明技巧来同时处理多达100条的指令。


---------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------


流水线原理
我们通过将执行每条指令所需的步骤组织成一个统一的流程,就可以用很少量的各种硬件单元以及一个时钟来控制计算的顺序,从而实现整个处理器。不过这样一来,控制逻辑就必须要在这些单元之间路由信号,并根据指令类型和分支条件产生适当的控制信号。(CPU内有三种总线:控制总线、地址总线、数据总线)

SEQ处理器不能充分利用硬件单元,因为每个单元只在整个时钟周期的一部分时间内才被使用。我们会看到引入流水线能获得更好的性能。

在流水线化的系统中,待执行的任务被划分成了若干独立的阶段
例如在汽车清洗中,这些阶段包括喷水、打肥皂、擦洗、上蜡和烘干。通常都会允许多个顾客同时经过系统,而不是要等到一个用户完成了所有从头至尾的过程才让下一个开始。
当前面一辆汽车从喷水阶段进入擦洗阶段时,下一辆就可以进入喷水阶段了。通常,汽车必须以相同的速度通过这个系统,以避免撞车。

流水线化的一个重要特性就是增加了系统的吞吐量,也就是单位时间内服务的顾客总数,不过它也会轻微地增加延迟,也就是服务一个用户所需要的时间。(例如一个只需要喷水的汽车,在非流水线的系统,它喷完水就可以走了。而在流水线化的系统,不管你是什么需求,都要走完整个流程的时间)

(我们之前的设计是一条指令执行完,下条指令才能进入CPU,(所不同的是时钟周期的粒度)。流水线化是允许多条指令在CPU中,每条指令在CPU中的时间是一样的,哪怕你一个周期就执行完了,你也得等剩下的阶段结束,使后面的指令被延迟了。
虽然流水线化,所有指令在CPU中待的时间都一样(且都按最耗时指令算的),但它们的时间是重叠的。假设一条指令在CPU中待6ms,那么12ms能处理7条指令,而非流水线,虽然一条指令最多执行6ms,但它们的时间是相加的,12ms可能只执行3条。12=6+2+4)

【例如】
一个简单地非流水化的硬件系统:
它是由一些执行计算的逻辑以及一个保存计算结果的寄存器组成的。时钟信号控制在每个特定的时间间隔加载寄存器。
(CD播放器中的译码器就是这样的一个系统。输入信号是从CD表面读出的位,逻辑电路对这些位进行译码,产生音频信号。图中的计算块是用组合逻辑来实现的,意味着信号会穿过一系列逻辑门,在一定时间的延迟之后,输出就成为了输入的某个函数)


在这个例子中,我们假设组合逻辑需要300ps,而加载寄存器需要20ps。这个实现中,在开始下一条指令之前必须完成前一个。执行一条指令需要320ps,即每秒钟系统吞吐量3.12GIPS。

流水化的硬件系统
假设将系统执行的计算分成三个阶段(A、B和C),每个阶段需要100ps,如图所示、然后在各个阶段之间放上流水线寄存器,这样每条指令都会按照三步经过这个系统,从头到尾需要三个时钟周期。
(流水线寄存器的作用:作为电路不同部分中的组合逻辑之间的屏障。保存每步组合逻辑的运算结果。这是为了分割流水而插入的寄存器。)





流水线,在稳定状态下,三个阶段应该都是活动的,每个时钟周期,一条指令离开系统,一条新的进入。
这样,我们一个阶段的时间,相当于运行了一条指令,在这个系统中,我们将时钟周期设为100+20=120ps,得到的吞吐量大约为8.33GIPS。(这是在)
因为处理一条指令需要3个时钟周期,所以这条流水线的延迟就是3*120=360ps。非流水运行一条完整指令需要320ps。
(从宏观整体上看,一个时钟周期运行了一条指令(这条指令是由多条指令的各阶段拼合的),而从单条指令的执行看,需要3个时钟周期执行一条完整指令。)

我们将系统吞吐量提高到原来的8.33/3.12=2.67倍,代价是增加一些硬件(流水线寄存器),以及延迟的少量增加(360/320=1.12)。延迟变大是由于增加的流水线寄存器的时间开销。
时钟周期的时间就是流水线分割的一个阶段的时间,这样,从宏观上看,是一个时钟周期执行一条指令。
【注意】
如果时钟运行得太快,就会有灾难性的后果。值可能会来不及通过组合逻辑,并且当时钟上升时,寄存器的输入还不是合法的值。(即时钟周期比流水线一个阶段的时间短)
而我们减缓时钟不会影响流水线的行为。信号传播到流水线寄存器的输入,但是直到时钟上升时才会改变寄存器的状态。(即时钟周期比流水线一个阶段的时间长)
故,我们通过改变倍频器的值来提高时钟频率的超频手段,其提高是有限的。
返回列表