购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 微处理器的内部组成结构及相关技术

为了说明现代微处理器的内部组成结构,我们给出一个经适当简化的Pentium处理器的内部结构,如图3.10所示。并以此为例对现代微处理器的主要组成部件及其实现技术做概要说明。

图3.10 Pentium处理器的内部结构

3.4.1 总线接口单元

总线接口单元(Bus Interface Unit,BIU)是微处理器与微机中其他部件(如存储器、I/O接口等)进行连接与通信的物理界面。通过这个界面,实现微处理器与其他部件之间的数据信息、地址信息以及控制命令信号的传送。由图3.10可见,Pentium处理器的外部数据总线宽度为64位,它与存储器之间的数据传输率可达528MB/s。但需要说明的是,由于Pentium处理器内部的算术逻辑单元ALU和寄存器的宽度仍是32位的,所以它仍属于32位微处理器。

从图3.10还可以看到,Pentium处理器的地址总线位数为32位,即它的直接寻址物理地址空间为2 32 =4GB。另外,BIU还有地址总线驱动、数据总线驱动、总线周期控制及总线仲裁等多项功能。

3.4.2 指令Cache与数据Cache

Cache(高速缓存)技术是现代微处理器及微型计算机设计中普遍采用的一项重要技术,它可以使CPU在较低速的存储器件条件下获得较高速的存储器访问,并提高系统的性能价格比。在Pentium之前的80386设计中,曾在处理器外部设置一个容量较小但速度较快的“片外Cache”;而在80486中,则是在处理器内部设置了一个8KB的“片内Cache”,统一作为指令和数据共用的高速缓存。

Pentium处理器中的Cache设计与80386和80486有很大的不同,它采用哈佛结构,即把Cache分为“指令Cache”和“数据Cache”分别设置,从而避免仅仅设置统一Cache时发生存储器访问冲突的现象。Pentium包括两个8KB的Cache,一个为8KB的数据Cache,一个为8KB的指令Cache。指令Cache只存储指令,而数据Cache只存储指令所需的数据。

在只有统一的高速缓存的微处理器(如80486)中,一个数据密集的程序很快就会占满高速缓存,几乎没有空间用于指令缓存,这就降低了微处理器的执行速度。而在Pentium中就不会发生这种情况,因为它有单独的指令Cache。如图3.10所示,经过BIU,指令被保存在8KB的“指令Cache”中,而指令所需要的数据则保存在8KB的“数据Cache”中。这两个Cache可以并行工作,并被称为“一级Cache”或“片内Cache”,以区别于设置在微处理器外部的“二级Cache”或“片外Cache”。

为了进一步提高计算机的性能,目前在高性能微处理器片内也采用Cache分级结构,具有一级Cache、二级Cache,有些微处理器(如安腾系列微处理器)片内还有三级Cache或四级Cache。

3.4.3 超标量流水线结构

“超标量流水线”结构是Pentium处理器设计技术的核心。为了说明其特点,我们先简要说明微处理器中“流水线”方式的概念,然后简要介绍“超标量”及“超级流水线”的技术特点。

流水线(pipeline)方式是把一个重复的过程分解为若干子过程,每个子过程可以与其他子过程并行进行的工作方式。由于这种工作方式与工厂中生产流水线十分相似,因此称为流水线技术。采用流水线技术设计的微处理器,把每条指令分为若干个顺序的操作(如取指、译码、执行等),每个操作分别由不同的处理部件(如取指部件、译码部件、执行部件等)来完成。这样构成的微处理器,可以同时处理多条指令。而对于每个处理部件来说,每条指令的同类操作(如取指令)就像流水一样连续被加工处理。这种指令重叠、处理部件连续工作的计算机(或处理器),称为流水线计算机(或处理器)。

采用流水线技术,可加快计算机执行程序的速度并提高处理部件的使用效率。图3.11表示把指令划分为5个操作步骤并由处理器中5个处理部件分别处理时流水线的工作情形。

图3.11 5级流水的工作情形

如图3.11所示,流水线中的各个处理部件可并行工作,从而可使整个程序的执行时间缩短。容易看到,在图中所示的7个时间单位内,已全部执行完3条指令。如果以完全串行的方式执行,则3条指令需3×5=15个时间单位才能完成。显然,采用流水线方式可以显著提高计算机的处理速度。

Pentium处理器的流水线由分别称为“U流水”和“V流水”的两条指令流水线构成(双流水线结构),其中每条流水线都拥有自己的地址生成逻辑、ALU及数据Cache接口。因此,Pentium处理器可以在一个时钟周期内同时发送两条指令进入流水线。比相同频率的单条流水线结构(如80486)性能提高了一倍。通常称这种具有两条或两条以上能够并行工作的流水线结构为超标量(superscalar)结构。

与图3.11所示的情形相同,Pentium的每一条流水线也是分为5个阶段(5级流水),即“指令预取”“指令译码”“地址生成”“指令执行”和“回写”。当一条指令完成预取步骤时,流水线就可以开始对另一条指令的操作和处理。这就是说,Pentium处理器实现的是两条流水线的并行操作,而每条流水线由5个流水级构成。

另外,还可以将流水线的若干流水级进一步细分为更多的阶段(流水小级),并通过一定的流水线调度和控制,使每个细分后的“流水小级”可以与其他指令的不同的“流水小级”并行执行,从而进一步提高微处理器的性能。这被称为“超级流水线”技术(superpipelining)。

“超级流水线”与上面介绍的“超标量”结构有所不同,超标量结构是通过重复设置多个“取指”部件,设置多个“译码”“地址生成”“执行”和“写结果”部件,并让这些功能部件同时工作来加快程序的执行,实际上是以增加硬件资源为代价来换取处理器性能的;而超级流水线处理器则不同,它只需增加少量硬件,是通过各部分硬件的充分重叠工作来提高处理器性能的。从流水线的时空角度上看,超标量处理器主要采用的是空间并行性,而超级流水线处理器主要采用的是时间并行性。

从超大规模集成电路(VLSI)的实现工艺来看,超标量处理器能够更好地适应VLSI工艺的要求。通常,超标量处理器要使用更多的晶体管,而超流水线处理器则需要更快的晶体管及更精确的电路设计。

为了进一步提高处理器执行指令的并行度,可以把超标量技术与超流水线技术结合在一起,这就是“超标量超流水线”处理器。例如,Intel的P6结构(PentiumⅡ/Ⅲ处理器)就是采用这种技术的更高性能微处理器,其超标度为3(即有3条流水线并行操作),流水线的级数为12级。

3.4.4 动态转移预测及转移目标缓冲器

正是由于计算机指令中具有能够改变程序流向的指令,才使得程序结构灵活多样,程序功能丰富多彩。这类指令一般包括跳转(JMP)指令、调用(CALL)指令和返回(RET)指令等,统称为转移(branch)指令。转移指令又可分为“无条件转移指令”及“条件转移指令”两大类。无条件转移指令执行时一定会发生转移,而条件转移指令执行时是否发生转移则取决于指令所要求的条件当时是否满足。例如,80x86系统中的条件转移指令“JC START”,执行时若进位标志CF为1,则使程序转移到“转移目标地址”START处;否则,将顺序执行紧接着这条指令之后的下一条指令。

然而,转移指令也给处理器的流水线操作带来麻烦。因为在处理器预取指令时还未对指令进行译码,即它还不知道哪条指令是转移指令,所以只能按程序的静态顺序进行。也就是说,即使是遇到一条转移指令,也无法到“转移目标地址”处去预取指令装入指令队列,而只能顺序地装入紧接着转移指令之后的若干条指令。而当指令被执行并确实发生转移时,指令预取缓冲器中预先装入的指令就没用了。此时必须将指令缓冲器中原来预取的指令废除(也称“排空”流水线),并从转移目标地址开始处重新取指令装入流水线。这样就极大地影响了流水线的处理速度和性能。

已有多项技术用于减小转移指令对流水线性能的影响,如基于编译软件的“延迟转移”(delayed branching)技术和基于硬件的“转移预测”(branch prediction)技术。转移预测又有“静态转移预测”及“动态转移预测”之分。静态转移预测只依据转移指令的类型来预测转移是否发生。例如,对某一类条件转移指令总是预测为转移发生,对另一类总是预测转移不发生。显然,静态转移预测的正确率不会很高,只能作为其他转移处理技术的辅助手段。动态转移预测法(dynamic branch prediction)是依据一条转移指令过去的行为来预测该指令的将来行为。即处理器要有一个“不断学习”的过程。由于程序结构中有众多重复或循环执行的机会,所以在预测算法选得较好的情况下,动态转移预测会达到较高的正确率,故被现代微处理器所普遍采用。下面,仍以Pentium为例来简要说明这种动态转移预测法的基本工作原理。

从图3.12可以看到,Pentium提供了一个称为“转移目标缓冲器”(Branch Target Buffer,BTB)的小Cache来动态预测程序的转移操作。在程序执行时,若某条指令导致转移,便记忆下这条转移指令的地址及转移目标地址(放入BTB内部的“登记项”中),并用这些信息来预测这条指令再次发生转移时的路径,预先从这里记录的“转移目标地址”处预取指令,以保证流水线的指令预取不会空置。其基本工作机制如图3.12所示。

图3.12 Pentium BTB的工作机制 [7]

“指令译码”阶段检查从预取缓冲器中取出的指令是否为转移指令,若是转移指令,则将此指令的地址送往BTB进行查找。若BTB命中(即在BTB中存在相应的登记项),则根据该项的“历史位”状态预测此指令在执行阶段是否发生转移。若预测为发生转移,则将该项中登记的“转移目标地址”提交给指令预取器,并指挥指令预取器从“转移目标地址”处提取指令装入预取缓冲器,即进行图3.12中所示的“转移取”;若预测为不发生转移,则从该转移指令的下一条指令开始提取指令,即进行所谓“顺序取”。若BTB未命中(即在BTB中不存在相应的登记项),则说明BTB中没有该指令的历史记录,此时固定预测为不发生转移,即固定进行“顺序取”。至于该指令在执行阶段实际发生转移时的处理情况,将在下面介绍Pentium“执行单元”的功能时再作具体说明。

BTB登记项中的“历史位”用以登记相应转移指令先前的执行行为,并用于预测此指令执行时是否发生转移。在执行阶段要根据实际是否发生转移,来修改命中项的历史位;或对于BTB未命中的转移指令而在执行阶段发生转移的情况,在BTB中建立新项(加入新项)并设定历史位为11。图3.13给出了BTB历史位的意义及状态转换情况。

图3.13 Pentium BTB历史位的意义及状态转换 [7]

由图3.13可以看出,Pentium对历史位意义的设定更倾向于预测转移发生。历史位11常称为“强发生”(strongly taken)状态,10称为“发生”(taken)状态,01称为“弱发生”(weakly taken)状态,这3种历史位都预测转移发生。

后来的Pentium系列处理器使用更多的历史位,以更精细的转移预测算法来降低预测失误率。例如Pentium 4使用4位历史位,能在转移预测时考虑到更长的历史状况,能够显著地降低预测失误率。

另外,容易想到,对于循环程序而言,在首次进入循环和退出循环时,都将出现转移预测错误的情况。即首次进入循环时,预测不发生转移,而实际发生转移;退出循环时,预测发生转移,而实际不发生转移。这两种情况下均需要重新计算转移地址,并造成流水线的停顿和等待。但若循环10次,2次预测错误而8次正确;循环100次,2次预测错误而98次正确。因此,循环次数越多,BTB的效益越明显。

3.4.5 指令预取器和预取缓冲器

指令预取器总是按给定的指令地址,从指令Cache中顺序地取出指令放入预取缓冲器中,直到在指令译码阶段遇到一条转移指令并预测它在指令执行阶段将发生转移时为止。此时,如图3.12所示,由BTB提供预测转移发生时的目标地址,并按此地址开始再次顺序地取指令,直到又遇到一条转移指令并预测转移发生时为止。指令预取器就是以这种折线式顺序由指令Cache取出指令装入预取缓冲器的。

3.4.6 指令译码器

指令译码器的基本功能是将预先取来的指令进行译码,以确定该指令的操作。

Pentium处理器中,指令译码器的工作过程可分为两个阶段,在第一个阶段,对指令的操作码进行译码,并检查是否为转移指令。若是转移指令,则将此指令的地址送往BTB。再进一步检查BTB中该指令的历史记录,并决定是否实施相应的转移预测操作;在第二个阶段,指令译码器需生成存储器操作数的地址。在保护方式下,还需按保护模式的规定检查是否有违约地址,若有,则产生“异常”(exception),并进行相应的处理。

3.4.7 执行单元

指令的执行以两个ALU为中心,完成U、V流水线中两条指令的算术及逻辑运算。执行单元(Execution Unit,EU)的主要功能如下:

①按地址生成阶段(即指令译码的第二阶段)提供的存储器操作数地址,首先在1级数据Cache中获取操作数,若1级数据Cache“未命中”(操作数未在Cache中),则在2级Cache(片外Cache)或主存中查找。总之,在指令执行阶段的前半部,指令所需的存储器操作数、寄存器操作数要全部就绪,接着在指令执行阶段的后半部完成指令所要求的算术及逻辑操作。

②确认在指令译码阶段对转移指令的转移预测是否与实际情况相符,即确认预测是否正确。若预测正确,则除了适当修改BTB中的“历史位”外,其他什么事情也不发生;若预测错误,则除了修改“历史位”外,还要清除该指令之后已在U、V流水线中的全部指令(“排空”流水线),并指挥“指令预取器”重新取指令装入流水线。

另外,对于前面提到的在查找BTB时“未命中”从而固定预测为不发生转移的情况,若在执行阶段此指令确实没有发生转移,则其他什么事情也不发生,以后再遇到此转移令时仍作为一个“新面孔”的转移指令按前述办法来对待;如果在执行阶段此指令实际发生转移的话,则按“预测错误”处理,此时除了“排空”流水线外,还需将“转移目标地址”提交给BTB,连同在指令译码阶段提交的“转移指令地址”,在BTB中建立一个新项,并设定“历史位”为“强发生”状态(11)。

3.4.8 浮点处理单元

顾名思义,浮点处理单元(Floating Point Unit,FPU)专门用来处理浮点数或进行浮点运算,因此也称浮点运算器。在8086、80286及80386年代,曾设置单独的FPU芯片(8087、80287和80387),并称为算术协处理器(Mathematical Coprocessor),简称协处理器。那时的主板上配有专门的协处理器插座。自从80486 DX开始,则将FPU移至微处理器内部,成为微处理器芯片的一个重要组成部分(如图3.10所示)。

Pentium处理器的FPU性能已做了很大改进。FPU内有8个80位的浮点寄存器FR0~FR7,内部数据总线宽度为80位,并有分立的浮点加法器、浮点乘法器和浮点除法器,可同时进行3种不同的运算。

FPU的浮点指令流水线也是双流水线结构。每条流水线分为8个流水级:预取指令、指令译码、地址生成、取操作数、执行1、执行2、写回结果和错误报告。

3.4.9 控制单元

控制单元(Control Unit,CU)的基本功能是控制整个微处理器按照一定的时序过程一步一步地完成指令的操作。Pentium的大多数简单指令都是以“硬连线”方式来实现的,如2.1.2节所述,采用这种方式,指令通过“指令译码器”译码后结合特定的时序条件即可产生相应的微操作控制信号,从而控制指令的执行,它可以获得较快的指令执行速度;而对于那些复杂指令的执行则是以“微程序”方式实现的。按照微程序实现方式,是将指令执行时所需要的微操作控制信号变成相应的一组微指令并预先存放在一个只读存储器中,当指令执行时,按安排好的顺序从只读存储器中一条一条读出这些微指令,从而产生相应的微操作控制信号去控制指令的执行。

“微程序”方式与“硬连线”方式是CPU控制指令执行的两种不同的实现方式。它们各有不同的特点。一般来说,“微程序”方式较方便灵活,但指令执行速度较慢,在传统的微处理器设计如CISC(Complex Instruction Set Computer)结构中常被采用;“硬连线”方式灵活性较差,但它的突出优点是指令执行速度很快,常用于RISC(Reduced Instruction Set Computer)结构的机器中。也可以说,RISC结构中一般不使用“微程序”技术。

另外,控制单元还负责流水线的时序控制,以及处理与“异常”和“中断”有关的操作和控制。 L/F5u1QA+sNtr8vTKIOya1wz7YoeNn/dsTI5d7jkP+r0Jndf7zRXXTyaCPSc+K3O

点击中间区域
呼出菜单
上一章
目录
下一章
×