计算机组成原理 第七章(CPU的工作过程)—第三节(指令流水)

写在前面:

  1. 本系列笔记主要以《计算机组成原理(唐朔飞)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
  2. 视频链接:计算机组成原理(哈工大刘宏伟)135讲(全)高清_哔哩哔哩_bilibili

一、概述

        为了提高访存速度,一方面要提高存储芯片的性能,另一方面可以从体系结构上,如采用多体、Cache等分级存储措施来提高存储器的性能/价格比。

        为了提高主机与I/O交换信息的速度,可以采用DMA方式,也可以采用多总线结构,将速度不一的I/O分别挂到不同带宽的总线上,以解决总线的瓶颈问题。

        为了提高运算速度,可以采用高速芯片和快速进位链,以及改进算法等措施。

        为了进一步提高处理机速度,通常可从提高器件的性能和改进系统的结构,开发系统的并行性两方面入手

        所谓并行,包含同时性和并发性两个方面,前者是指两个或多个事件在同一时刻发生,后者是指两个或多个事件在同一时间段发生。也就是说,在同一时刻或同一时间段内完成两种或两种以上性质相同或不同的功能,只要在时间上互相重叠,就存在并行性

二、指令流水原理

1、指令的串行执行

        完成一条指令实际上也可分为许多阶段。为简单起见,把指令的处理过程分为取指令和执行指令两个阶段。在不采用流水技术的计算机里,取指令和执行指令是周而复始地重复出现,各条指令按顺序串行执行的

        取指令的操作可由指令部件完成,执行指令的操作可由执行部件完成。进一步分析发现,这种顺序执行虽然控制简单,但执行中各部件的利用率不高,如指令部件工作时,执行部件基本空闲,而执行部件工作时,指令部件基本空闲。

2、指令的二级流水

        如果指令执行阶段不访问主存,则完全可以利用这段时间取下一条指令,这样就使取下一条指令的操作和执行当前指令的操作同时进行,这就是两条指令的重叠,即指令的二级流水。

        由指令部件取出一条指令,并将它暂存起来,如果执行部件空闲,就将暂存的指令传给执行部件执行,与此同时,指令部件又可取出下一条指令并暂存起来,这称为指令预取,显然,这种工作方式能加速指令的执行。

        如果取指和执行阶段在时间上完全重叠,相当于将指令周期减半,然而进一步分析流水线,就会发现存在两个原因使得执行效率加倍是不可能的。

        ①指令的执行时间一般大于取指时间,因此,取指阶段可能要等待一段时间,也即存放在指令部件缓冲区的指令还不能立即传给执行部件,缓冲区不能空出。

        ②当遇到条件转移指令时,下一条指令是不可知的,因为必须等到执行阶段结束后,才能获知条件是否成立,从而决定下条指令的地址,造成时间损失。通常为了减少时间损失,采用猜测法,即当条件转移指令从取指阶段进入执行阶段时,指令部件仍按顺序预取下一条指令,如果条件不成立,转移没有发生,则没有时间损失;若条件成立,转移发生,则所取的指令必须丢掉,并再取新的指令。

        尽管这些因素降低了两级流水线的潜在效率,但还是可以获得一定程度的加速。

3、指令的六级流水

        为了进一步提高处理速度,可将指令的处理过程分解为更细的几个阶段。

        ①取指(FI):从存储器取出一条指令并暂时存入指令部件的缓冲区。

        ②指令译码(DI):确定操作性质和操作数地址的形成方式。

        ③计算操作数地址(CO):计算操作数的有效地址,涉及寄存器间接寻址、间接寻址、变址寻址、基址寻址、相对寻址等各种地址计算方式。

        ④取操作数(FO):从存储器中取操作数(若操作数在寄存器中,则无须此阶段)。

        ⑤执行指令(EI):执行指令所需的操作,并将结果存于目的位置(寄存器中)。

        ⑥写操作数(WO):将结果存入存储器。

        假设上述各段的时间都是相等的(即每段都为一个时间单元),于是可得下图所示的指令六级流水时序。在这个流水线中,处理器有6个操作部件同时对6条指令进行加工,加快了程序的执行速度。当然,下图所示的是理想情况,而且假设了不存在存储器访问冲突、没有转移指令等不确定因素,事实上并不会这么理想。

三、影响流水线性能的因素

1、结构相关

(1)结构相关是当指令在重叠执行过程中,不同指令争用同一功能部件产生资源冲突时产生的,故又有资源相关之称。

(2)解决冲突的方法之一是让流水线在完成前一条指令对数据的存储器访问时,暂停(一个时钟周期)取后一条指令的操作

(3)解决访存冲突的另一种方法是设置两个独立的存储器分别存放操作数和指令,以免取指令和取操作数同时进行时互相冲突,使取某条指令和取另一条指令的操作数实现时间上的重叠。还可以采用指令预取技术,例如,在CPU(8086)中设置指令队列,将指令预先取到指令队列中排队,不过需要说明的是,指令预取技术的实现基于访存周期很短的情况。

2、数据相关

(1)数据相关是流水线中的各条指令因重叠操作,可能改变对操作数的读写访问顺序(这将影响最终结果),从而导致了数据相关冲突。(举一个不是很恰当的例子,C语言中的前置递增就是先写后读,后置递增则是先读后写,写即改变其中的值,读则是读取其中的值,读写顺序颠倒,可能会引发不可预知的后果)

(2)为了解决这种数据相关,可以采用后推法,即遇到数据相关时,就停顿后继指令的运行,直至前面指令的结果已经生成

(3)另一种解决方法是采用定向技术,又称为旁路技术或相关专用通路技术,其主要思想是不必待某条指令的执行结果送回到寄存器后,再从寄存器中取出该结果,作为下一条指令的源操作数,而是直接将执行结果送到其它指令所需要的地方。

(4)根据指令间对同一寄存器读和写操作的先后次序关系,数据相关冲突可分为写后读相关、读后写相关和写后写相关。例如,有i和j两条指令,i指令在前,j指令在后,则三种不同类型的数据相关含义如下。

写后读相关:指令j试图在指令i写入寄存器前就读出该寄存器内容,这样,指令j就会错误地读出该寄存器旧的内容。

读后写相关:指令j试图在指令i读出寄存器之前就写入该寄存器,这样,指令i就错误地读出该寄存器新的内容。

写后写相关:指令j试图在指令i写入寄存器之前就写入该寄存器,这样,两次写的先后次序被颠倒,就会错误地使由指令i写入的值成为该寄存器的内容。

        上述三种数据相关在按序流动的流水线中,只可能出现RAW相关。在非按序流动的流水线中,由于允许后进入流水线的指令超过先进入流水线的指令而先流出流水线,则既可能发生RAW相关,还可能发生WAR和WAW相关。

3、控制相关

(1)控制相关主要是由转移指令引起的,当转移发生时,流水线的连续流动将受到破坏。当执行转移指令时,根据是否发生转移,它可能将程序计数器PC内容改变成转移目标地址,也可能只是使PC加上一个增量,指向下一条指令的地址(简单说,下一条指令不是确定的,比如对于条件转移而言,没有执行完它的上一条指令,都无法确定是否需要转移)。

(2)如下图所示,假设指令3是一条条件转移指令,即指令3必须待指令2的结果出现后(第7个时间单元)才能决定下一条指令是4(条件不满足)还是15(条件满足)。由于结果无法预测,此流水线继续预取指令4,并向前推进,当最后结果满足条件时,发现对第4、5、6、7条指令所做的操作全部报废。在第8个时间单元,指令15进入流水线,在时间单元9~12之间没有指令完成,这就是由于不能预测转移条件而带来的性能损失。

(3)为了解决控制相关,可以采用尽早判别转移是否发生,尽早生成转移目标地址,预取转移成功或不成功两个控制流方向上的目标指令,加快和提前形成条件码,提高转移方向的猜准率等方法。

四、流水线性能

1、吞吐率

(1)在指令级流水线中,吞吐率是指单位时间内流水线所完成指令或输出结果的数量。吞吐率又有最大吞吐率和实际吞吐率之分。

(2)最大吞吐率是指流水线在连续流动达到稳定状态后所获得的吞吐率,对于m段的指令流水线而言,若各段的时间均为\Delta t,则最大吞吐率为T_{pmax}=\frac{1}{\Delta t}

(3)流水线仅在连续流动时才可达到最大吞吐率。实际上由于流水线在开始时有一段建立时间(第一条指令输入后到其完成的时间),结束时有一段排空时间(最后一条指令输入后到其完成的时间),以及由于各种相关因素使流水线无法连续流动,因此,实际吞吐率总是小于最大吞吐率

(4)实际吞吐率是指流水线完成n条指令的实际吞吐率,对于m段的指令流水线,若各段的时间均为\Delta t,连续处理n条指令(第一条指令需m\Delta t),则实际吞吐率为

2、加速比

        流水线的加速比是指m段流水线的速度与等功能的非流水线的速度之比。如果流水线名段时间均为\Delta t,则完成n条指令在m段流水线上共需T=m\cdot \Delta t+(n-1)\Delta t时间,而在等效流水线上所需时间为T'=nm\Delta t,故加速比为

3、效率

(1)效率是指流水线中各功能段的利用率。由于流水线有建立时间和排空时间,因此各功能段的设备不可能一直处于工作状态,总有一段空闲时间。

(2)通常用流水线各段处于工作时间的时空区与流水线中各段总的时空区之比来衡量流水线的效率,用公式表示为

五、流水线的分类

1、根据使用级别不同分类

(1)部件功能级流水线:将复杂的算术逻辑运算组成流水线工作方式,例如可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程。

(2)处理机级流水线:把一条指令解释过程分成多个子过程。

(3)处理机间流水线:一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。

2、根据功能不同分类

(1)单功能流水线:只能实现一种固定的专门功能的流水线。

(2)多功能流水线:通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。

3、根据同一时间内各段之间的连接方式不同分类

(1)静态流水线:在同一时间内,流水线的各段只能按同一种功能的连接方式工作。

(2)动态流水线:在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算,这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。

4、根据各功能段之间是否有反馈信号分类

(1)线性流水线:从输入到输出,每个功能段只允许经过一次,不存在反馈回路。

(2)非线性流水线:存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。

六、流水线中的多发技术

1、超标量技术

(1)每个时钟周期内可同时并发多条独立指令,即以并行操作方式将两条或两条以上(图中所示为3条)指令编译并执行(当然,如果指令间存在数据相关,就不能并行执行)。

(2)要实现超标量技术,要求处理机中配置多个功能部件和指令译码电路,以及多个寄存器端口和总线,以便能实现同时执行多个操作,此外还要编译程序决定哪几条相邻指令可并行执行。

(3)超标量计算机不能重新安排指令的执行顺序,但可以通过编译优化技术,在高级语言翻译成机器语言时精心安排,把能并行执行的指令搭配起来挖掘更多的指令并行性。

2、超流水线技术

(1)超流水线技术是将一些流水线寄存器插人流水线段中,好比将流水线再分段。

(2)如下图所示,图中将原来的一个时钟周期又分成3段,使超流水线的处理器周期比普通流水线的处理器周期短,这样,在原来的时钟周期内,功能部件被使用3次,使流水线以3倍于原来时钟频率的速度运行

(3)与超标量计算机一样,硬件不能调整指令的执行顺序,需要靠编译程序解决优化问题。

3、超长指令字技术

(1)超长指令字技术(VLIW)和超标量技术都是采用多条指令在多个处理部件中并行处理的体系结构,在一个时钟周期内能流出多条指令,但超标量的指令来自同一标准的指令流,VLIW则是由编译程序在编译时挖掘出指令间潜在的并行性后,把多条能并行操作的指令组合成一条具有多个操作码字段的超长指令(指令字长可达几百位),由这条超长指令控制VLIW机中多个独立工作的功能部件,由每一个操作码字段控制一个功能部件,相当于同时执行多条指令。

(2)VLIW 较超标量具有更高的并行处理能力,但对优化编译器的要求更高,对 Cache的容量要求更大。

七、流水线结构

1、指令流水线结构

        指令流水线是将指令的整个执行过程用流水线进行分段处理,典型的指令执行过程分为“取指令-指令译码-形成地址-取操作数-执行指令-回写结果-修改指令指针”这几个阶段,与此相对应的指令流水线结构由下图所示的几个部件组成。需要说明的是,流水线每一个功能段部件后面都要有一个缓冲寄存器(或锁存寄存器),其作用是保存本流水段的执行结果,提供给下一个流水段使用。

        指令流水线对机器性能的改善程度取决于把处理过程分解成多少个相等的时间段数。如上述共分7段,若每一段需要一个时钟周期,则当不采用流水技术时,需7个时钟周期出一个结果;采用流水线后,假设流水线不出现断流(如遇到转移指令),则除第一条指令需7个时钟周期出结果外,以后所有的指令都是一个时钟周期出一个结果。因此,在理想的情况下(流水线不断流),该流水线的速度约提高到7倍。

2、运算流水线结构

        上述讨论的指令流水线是指令级的流水技术,实际上流水技术还可用于部件级,例如浮点加法运算可以分成“对阶”、“尾数加”及“结果规格化”3段,每一段都有一个专门的逻辑电路完成操作,并将其结果保存在锁存器中,作为下一段的输入。需要说明的是,为运算分段时尽量使每段操作时间一致。

        如下图所示,当对阶完成后,将结果存入锁存器,便又可进入下一条指令的对阶运算。

上一篇:steam_api.dll“是什么?打开游戏出现找不到steam_api.dll无法继续执行代码如何解决


下一篇:MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡