超标量处理器

本篇读书笔记第一部分对超标量处理器的出现进行了讨论,介绍了超标量处理器和设计架构需要考虑的问题,对于这种ILP技术,也提到了另外一种VLIW架构。

第二部分对超标量处理器的架构进行分析,2.1描述了超标量处理器和标量处理器流水线的差别;2.2讨论体系结构中存在的三种相关问题,着重讨论数据相关和控制相关的问题;2.3描述使用动态调度的方法去解决数据相关的问题,主要包括Tomasulo算法和Scoreboard方法,2.4中主要是使用分支预测解决控制相关的问题,另外对架构中的cache也进行了描述;2.5中对分支预测中对乱序执行的指令进行重新排序的重排缓冲器机制ROB进行了阐述;2.6对整个架构进行了总结。

1 超标量微处理器简介

超标量处理器是在20世纪80年代末和90年代初引入的,并且在高性能的通用微处理器中也得到了普遍应用,例如Intel Pentium系列处理器和IBM PowerPC系列处理器。

首先,我想先回答一下自己的疑惑,为什么我们需要超标量处理器?

我们追求更快的程序执行速度,而在计算机领域这样一个经典的公式来计算一个程序的执行时间:

EXCPU = Number of instructions × CPI × cycle time

影响程序执行时间的因素:

(1)Number of instructions:程序总共需要执行指令的个数;

(2)CPI(Cycles Per Instruction):执行每条指令所需要的周期数;

(3)cycle time:每周期需要的时间;

从上面三个因素可以看出,要加快执行程序的速度,可以采取的策略有如下方式:

(1)减少程序中指令的数量,这个主要取决于程序本身要完全的工作量,实现某个功能所需要的算法、编译器强大与否,甚至指令级是否会对某些特殊的功能有扩展。比如x86指令集中的多媒体指令。

(2)减少每条指令在处理器中执行所需要的周期数,也就是减少CPI,意味着增加IPC(Instructions Per Cycle),其中,CPI与IPC互为倒数、CPI表示处理器执行一条指令需要的周期数,而IPC则表示处理器在一个周期内可以执行的指令个数。对于非流水线的处理器,需要多个周期才能执行一条指令,对于普通的流水线处理器,每周期最多执行一条指令,因此IPC最大也就是1。

(3)减少处理器的周期时间,在经过精巧的电路设计、更深的流水线来减少处理器的周期时间。

所以为了提高微处理器的性能,人们在流水线技术的基础上提出了超标量(Superscalar)方法。超标量技术是一种先进的指令级并行流水线技术(ILP),对软件透明,其主要特征是在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令的技术,即通过增加IPC来加快我们执行软件的速度,每周期可以从I-Cache中取出的n条指令送到处理器的流水线中,处理器在每周期内也最少可以同时执行n条指令,这称为n-way的超标量处理器。

超标量处理器可以获得比较高的IPC,也伴随着天生的复杂性。从三个因素可以看出,在程序一定的情况下,需要处理器有比较大的IPC,以及更快的运行频率。但是实际中这两个因素是相互制约的,更大的IPC要求每周期更多的指令,这样设计复杂度会剧烈上升,导致处理器的周期时间很难降低下来。导致处理器设计师需要根据实际情况做出各种折中(tradeoff),要想获得更好的性能,就需要更复杂的设计和更多硬件资源,由此带来了更高的成本和功耗。

在处理器的发展史中,每周期执行多于一条指令的处理器并非超标量一种,超长指令字(Very Long Instruction Word, VLIW)也是一种每周期可以执行多条指令的处理器架构。

这两种架构本质区别是:超标量处理器是靠硬件自身来决定哪些指令可以并行地执行,而VLIW处理器则是依靠编译器和程序员自身来决定那些指令可以并行执行。

对于通用处理器来说,超标量结构是必须的,程序员可以抛开底层硬件的实现细节,专注于软件本身的功能,而且这个程序可以运行在任何支持该指令集的处理器上,而VLIW则无法实现这个功能。

2 超标量微处理器结构

2.1 流水线概述

图2.1分别显示了传统标量流水线和超标量流水线的执行示意图。以深度为n的标量流水为例,其特征是每个时钟周期取一条指令送入后级,流水线中最多容纳n条指令并行执行。以深度n,发射宽度为m的超标量流水线为例,则每个 周期可并行取m条指令(图中只显示2条),并行发射m条指令,流水线最多可 容纳m×n条指令。超标量流水线中,并行执行的指令数量增加m倍,可极大的 提升处理器的并行执行能力。

图2.1 标量和超标量流水线运行情况对比

超标量处理器设计的难点是如何挖掘指令间的并行性。单周期实现多条指令的并行预取是超标量技术首要解决的问题,以32位指令集双发射的超标量技 术为例,每个时钟周期若要并行预取2条指令,则其取指单元的数据通路宽度需达到64位。而这就涉及对总线接口和指令Cache的结构进行优化设计和研究,此外,由于指令流中存在着大量的分支和跳转,这将导致流水线无法按照双字对齐进行连续取指操作。随着流水中预取指令数不断增加,指令之间的数据相关性和控制相关性也变得非常复杂。相关性将阻塞流水线的连续发射和并行执行,接下来的小节我将介绍设计超标量流水线时是怎么处理这些问题的。

2.2 体系结构中的相关问题

在超标量体系下结构中,由于每个周期发射多条指令,会使控制相关在每次发射中出现的频率高于标量处理器,而且频率增加的比率大致与处理器的发射频率成正比;当发射频率增加时,数据相关发生的频率也会上升。同时由于指令在多条流水线中并行执行,相关会发生在将要发射的指令之间或将要发射的指令与正在执行的指令之间。因此,相关出现的情况要复杂得多在超标量微处理器中有三种情况的相关:数据相关、控制相关、结构相关,这里仅着重讨论数据相关和控制相关。

2.2.1 数据相关

概括来说,指令间存在三种数据相关:

  1. 先写后读(Read After Write, RAW),也称true dependence,一条指令的操作数如果来自之前指令的结果,那么这条指令必须等到之前的指令的到的结果,才可以继续执行。这种类型的相关性是无法回避的,举例如下;

    指令A:R1 = R2 + R3;

    指令B:R5 = R1 + R4;

指令B的一个操作数来自于指令A的结果,所以就必须等待指令A将结果计算出来,指令B才可以继续执行。

  1. 先读后写(Write After Read, WAR),也称anti dependence,一条指令要将结果写到某个寄存器中,但是这个寄存器还在被其他指令读取,所以不能马上写入。举例如下;

    指令A:R1 = R2 + R3;

    指令B:R2 = R5 + R4;

指令A在读取寄存器R2之前,指令B不能将结果写到寄存器R2中。

  1. 先写后写(Write After Write, WAW),也称output dependence,如果两条指令都要将结果写到同一个寄存器中,那么后面的指令必须等待前面的指令写完之后,自己才能执行写操作,举例如下:

    指令A:R1 = R2 + R3;

    指令B:R1 = R5 + R4;

指令A和指令B都将结果写到目的寄存器R1中,指令B应该在指令A之后进行写入。

三种相关中,RAW是在一条指令的源操作数依赖于前一条指令的结果的条件下发生的, RAW的解决必须有操作数的流动,出现相关的两条指令不能同时或完全重叠执行;而对于WAR和WRW,相当于是由于资源问题所引发的相关,其实质是由于使用了共同的寄存器资源保存了不同的变量值所引发的,若采用更名的方法用两个不同的寄存器来保存这两个变量,则出现相关的两条指令就可并发执行,不会引起性能损失。因此WAR和WRW又称为伪相关(false dependence),可通过更名(Register Renaming)来解决。

2.2.2 控制相关

控制相关性(control dependence),它是由分支指令引起的,只有当分支指令的结果被计算出来的时候,才可以知道从哪里取得后续的指令来执行,由于分支指令需要一段时间才可以得到结果(跳转或不跳转,跳转的目标地址),在超标量微处理器中,每个周期可发射多条指令,则转移指令的出现频率加快;相应地,控制相关出现的频率升高。控制相关限制了程序中可开发的ILP的数量。超标量微处理器中指令调度限于一个基本块中进行,为了提高可开发的ILP,可采用扩大基本块的方法,增加指令的调度范围,以减少控制相关的发生。扩大基本块的方法包括软件方法和硬件方法。

2.3 动态调度:Tomasulo算法和Scoreboard方法

在超标量体系结构中,数据相关的解决可通过两种途径:静态调度和动态调度。静态调度由编译器将相关的指令尽量调度开来,以减少相关的发生和相关所造成的性能损失;动态调度由硬件重新安排指令的执行顺序,允许指令乱序执行,以减少相关所引起的性能损失。

动态调度是指根据处理器的运行状态,发射指令到其相应执行单元的过程,分为两种方法:控制流调度方法和数据流调度方法。在控制流调度方法中,数据相关和结构相关的检测在译码级集中进行;在数据流调度方法中,指令在译码级被发射至相应执行单元的缓冲区中,相关的检测将以分散的方式在各执行单元的缓冲区中进行。

2.3.1 Tomasulo算法

Tomasulo算法的主要思想是,将记分牌方法同基于预约站的寄存器更名方法有机的结合在一起,有效地避免了WAW和WAR相关;同时基于预约站提供了分散的相关检测和指令执行控制。

在Tomasulo算法体系结构中(图2.2),预约站用缓存发射的指令及其操作数以等待指令的执行。当指令发射到预约站时,若源操作数有效,则从寄存器文件中读取源操作数送入预约站中缓存;否则以产生源操作数的预约站标识替换源寄存器标识,这一过程成为“寄存器更名”(Register Renaming),更名使每个寄存器对应的预约站标识为最后更改寄存器的预约站标识;更名消除WAW相关和WAR相关。

图2.2 IBM System 360/91中的Tomasulo结构示意图

Tomasulo算法的特点总结如下:

(1)相关的检测和指令执行的控制是分散进行;由每个单元的预约站分别完成指令相关的检测和控制指令的执行;

(2)采用了基于预约站的寄存器更名避免了WAR和WAW相关的发生,可动态解决RAW相关;

(3)执行单元的结果通过CDB送入等待操作数的预约站中,同时送入相应的结果寄存器中;

(4)将Load和Store作为基本的功能单元;

(5)Tomasulo算法实现指令动态调度,硬件逻辑开销很大。

2.3.2 Scoreboard方法

记分牌(Scoreboard)方法是一个集中控制部件,用于记录和跟踪寄存器和多个执行单元的状态情况,负责相关的检测、控制指令的发射和执行。

记分牌方法的特点如下:

(1)相关的检测和指令执行的控制是集中进行的;

(2) 动态解决RAW相关;但WAR和WAW相关会引起指令发射阻塞;

(3) 执行单元的结果没有旁路送入使用该结果的执行单元中,操作数都是由寄存器堆提供的;

(4)记分牌逻辑的硬件开销较小。

对记分牌方法和Tomasulo算法这两种动态调度方法进行的研究和分析表明:

Tomasulo算法的性能要优于记分牌方法,这主要体现在:

(1)Tomasulo算法基于预约站提供了分散的相关检测和指令执行控制机制,增加了指令的调度范围;

(2)Tomasulo算法通过寄存器更名技术动态地消除了WAW和WAR相关,避免了因这两种伪相关所引起的流水线阻塞;

(3)Tomasulo算法中提供了从产生结果的执行单元到引用结果的执行单元间的直接通路,加快了RAW相关的解决。

但是记分牌方法的硬件开销要小于Tomasulo算法。

因此在设计超标量处理器时,若设计目标是实现高性能的超标量处理器,则建议采用的动态调度策略为Tomasulo算法。

2.4 Cache和分支预测Branch Prediction)

在超标量处理器中,有两个部件直接影响着性能,他们是分支预测和Cache。纵观每次Intel处理器升级,都会使分支预测的精度更高,Cache的命中率更高。

2.4.1 Cache

Cache之所以存在,是因为在处理器在计算机的世界中,存在如下两个现象:

(1) 时间相关性(temporal locality):如果一个数据现在被访问了,那么在以后很有可能还会被访问。

(2) 空间相关性(spatial locality):如果一个数据现在被访问了,那么它周围的数据在以后有可能也会被访问。

Cache的出现可以说是一种无奈的妥协,因为存储器技术的发展比处理器技术的发展要慢,尤其在超标量处理器中,考录到每周期需要从Cache中同时读取多条指令,同时每周期也可能有多条load/store指令会访问Cache,因此需要实现多端口的Cache,这给芯片面积的速度带来了不小的挑战。

对于一个超标量来说,维持每个周期多个指令的执行,提取阶段每个周期必须从缓存内存中提取多个指令。为了支持这种高指令获取带宽,几乎必须将指令缓存与数据缓存分开,即指令Cache(I-Cache)和数据Cache(D-Cache)。

本质来说,他们的原理都是一样的,但是D-Cache不仅需要读取,还需要考虑写入的问题,而I-Cache只会被读取,并不会被写入,因此D-Cache更复杂一点。

Cache主要由两部分组成,Tag部分和Data部分,Data部分就是用来保存一片连续地址的数据,而Tag部分则是存储着这片连续数据的公共地址。一个Tag和它对应的所有数据组成的一行称为一个Cache line,而Cache line中的数据部分称为数据块(Cache data block)。如果一个数据可以存储在Cache中的多个地方,这些被同一个地址找到的多个Cache line称为Cache Set。

实际中,Cache有三种主要的实现方法,直接映射direct-mapped,组相连set-associative和全相连full-associative Cache,对于一个物理内存而言,如果在Cache中只有一个地方可以容纳它,它就是直接映射的Cache;如果有多个地方都可以放置这个数据,它就是组相连的Cache;如果Cache中任何地方都可以放置这个数据,那么它就是全相连的Cache,如图2.3所示。

图2.3 Cache三种实现方法

在超标量处理器中,为了提高性能,处理器需要能够在每周期同时执行多条load/store指令,这需要一个多端口的D-Cache,以便支持多条load/store指令的同时访问。

其实在超标量处理器中,有很多重要部件都是多端口结构的,比如寄存器堆register file、发射队列issue queue和重排序缓存ROB等。由于这些部件本身容量不是很大,所以即使采用多端口结构,也不会对芯片的面积和速度产生太大的影响,但是D-Cache不同,它的容量本身就很大,如果采用多端口设计,会有很大负面影响,因此需要采用一些办法来解决这个问题,主要有True Multi-port、Multi Cache Copies和Multi-banking。

Multi-banking结构是在现实当中的处理器被广泛使用的方法,如图2.4所示,它将Cache分为很多小个bank,每个bank都只有一个端口,如果在一个周期之内,Cache的多个端口上的访问地址位于不同的bank之中,那样就不会引起任何问题,只有当两个或多个端口的地址位于同一个bank之中时,才会引起bank conflict。

图2.4 Multi-banking结构

 使用这种方法,一个双端口的Cache仍旧需要两个地址解码器、两个多路选择器、两套比较器和两个对齐器,而Data SRAM此时不需要多端口结构了,这样就提高了速度,并在一定程度上减少了面积。但是由于需要判断Cache的每个端口是否命中,所以对于Tag SRAM来说,仍旧需要提供多个端口同时读取的功能,也就是采用多端口SRAM来实现。

影响这种多端口Cache性能的一个关键因素就是bank冲突,可以采用更多的bank来缓解这个问题,使bank冲突发生的概率尽可能降低,并且还可以提高bank的利用效率,避免有用的数据都集中在一个bank的情况发生,同时,由于每个端口都会访问所有bank,这需要更多的布线资源,有可能对版图设计造成一定的影响。

2.4.2 分支预测(Branch Prediction)

在本读书笔记中主要讨论动态分支预测,也叫动态转移预测,在超标量微处理器中,每个周期可发射多条指令,转移指令的出现频率加快,相应地,控制相关出现的频率升高。为了将转移指令执行时控制相关造成的性能损失减小到最小程度,必须采用转移预测技术。因此,在超标量微处理器中,多采用动态转移预测策略来预测转移的行为,以减少控制相关所带来的性能损失。

动态转移预测是指根据动态获取的转移预测信息,基于一定的动态转移预测算法来预测转移行为的过程。动态转移预测算法的思想是采用近期的转移历史来预测转移的下一次行为。若采用完整的转移历史来提高转移预测的准确性,不仅是不可能实现的,而且也没有必要。目前,常用的动态转移预测算法是根据转移指令的有限近期历史来预测转移的行为,包括:1位历史记录预测、2位历史记录预测等方法。

1位历史记录预测算法准确率为77%~79%。2位历史记录预测算法状态图如图2.5所示,是一种用于分支预测的两位饱和计数器,状态内的 TT、 TN 等表示分支的最后两次执行的结果,其准确率较1位预测算法高,为78%~89%。

图2.5 用于分支预测的两位饱和计数器

基于动态获取预测信息的位置,可以把动态转移预测策略分为三种主要类型:

(1)基于译码阶段的信息来预测转移行为;

(2) 基于指令地址信息索引Cache以预测转移行为,并获取预测转移目标地址(BTB-Branch Target Buffer);

(3)基于指令地址信息索引Cache以预测转移行为,并获取预测转移目标指令(BTC-Branch Target Cache)。

其中,BTB或BTC类的预测策略可实现转移的零延迟凹。BTB和BTC类动态转移预测策略都可实现转移的零延迟,由于访问BTB以获取转移目标指令地址的时间不长,在下一个周期就可从指令Cache取回转移目标指令,因此,BTC类转移预测策略的优越性没有明显地体现出来。目前BTB类的动态转移预测策略是使用最为广泛的预测策略凹。将上述两种动态转移预测算法应用在BTB中,得到了相应的两种BTB动态转移预测策略。基于1位历史记录预测算法的BTB动态转移预测策略,由于其实现简单,虽然转移预测准确率较低,但得到了广泛的应用,如DEC Alpha 21064和HP PA-8000等。基于2位历史记录预测算法的BTB动态.转移预测策略,由于可获得较高的转移预测准确率,硬件实现复杂度相对也比较低,也得到了广泛的应用,如UItraSPARC等。

综上所述,我们认为:基于1位和2位历史记录预测算法的BTB动态转移预测策略是动态转移预测策略的最优选择。

2.5 重排缓冲器机制:ROB

重排序缓冲器机制中,设置了ROB用于保存未提交但已结束执行的指令结果。提交(Commit)是指指令按程序执行的顺序,将存入ROB的结果写入通用寄存器(或相应的存贮单元)的过程。这样,虽然指令乱序执行结束,但指令结果的写回是按照程序执行的顺序送入寄存器文件中。一旦出现中断或转移预测出错的情况,则废除ROB中未提交的剩余所有执行结果,,进入中断处理或从正确的指令处重新开始执行。

虽然ROB机制允许指令乱序执行,但对于真相关的情形,由于指令必须等待前面的指令将结果按序存入通用寄存器后才可引用,这样减少了因采用ROB机制允许乱序执行所带来的好处。减轻这一影响的一种方法是提供从ROB到通用寄存器文件的旁路,如图2.6所示,这样可将在ROB中保存的某个指令的结果送到等待它的执行单元中。ROB机制的硬件实现是非常复杂的,不仅要实现按程序顺序写回结果的功能;还需提供相联比较功能,以实现旁路。

图2.6 有旁路的ROB机制

2.6 超标量处理器架构小结

图2.7展示了一个典型的超标量处理器微架构,流水线大体可以看成9个部分。

图2.7 典型的超标量处理器微架构

(1)Fetch(取指令):这部分负责从I-Cache中取指令,主要由两大部件组成,I-Cache负责存储最近常用的指令:分支预测器用来决定下一条指令的PC值。

(2)Decode(解码):这部分用来识别出指令的类型、指令需要的操作数以及指令的一些控制信号等。这部分的设计和指令集是息息相关的,对于RISC指令集来说,由于比较简洁,解码部分相对比较简单。对于CISC指令集来说,由于比较复杂,所以解码部分需要更多的逻辑电路来对这些指令进行识别。

(3)Register Renaming(寄存器重命名):在流水线解码阶段,可以得到指令的源寄存器和目的寄存器,这些寄存器都是逻辑寄存器,在指令集中定义好的。为了解决WAW,WAR这两种“伪相关性”,需要使用寄存器重命名的方法,将指令集中定义的逻辑寄存器重命名为处理器内部使用的物理寄存器,物理寄存器的个数要多于逻辑寄存器,通过寄存器重命名,处理器可以调用更多可以并行执行的指令。在进行重命名时,通常使用一个表格来存储当前逻辑寄存器到物理寄存器的对应关系,同时在其中还存储中那些物理寄存器还没有被使用的信息,提供一些电路来分析当前周期被重命名的指令之间的RAW相关性,将那些存在RAW相关性的指令加以标记,这些指令会通过后续的旁路(bypassing network)来解决它们之间存在的“真相关性”。由于寄存器重命名阶段花费时间比较长,现实当中处理器都会将其单独使用一级流水线,而不是和解码阶段放在一起。

(4)Dispatch(分发):在这个阶段,被重命名之后的指令会按照程序中规定的顺序,写到发射对列(Issue Queue)、重排序缓存(ROB)和Store Buffer等部件中,如果这些部件中没有合适的空间可以容纳当前的指令,那么这些指令就需要在流水线的重命名阶段进行等待,这就相当于暂停了寄存器重命名以及之前的所有流水线,直到这些部件中有空闲的空间为止。分发阶段可以和寄存器重命名阶段放在一起,在一些对周期时间比较紧的处理器汇总,也可以将这个不分单独使用一个流水段。

(5)Issue(发射):经过流水线分发(Dispatch)阶段之后,指令被写到发射队列(Issue Queue)中,仲裁(select)电路会从这个部件中挑选出合适的指令送到FU中执行,这个仲裁电路可繁可简。对于顺序发射(in-order issue)的情况,只需要判断发射队列中最旧的那条指令是否准备好就可以了。而对于乱序发射(out-of-order issue),则仲裁电路会变得比较复杂,它需要对发射队列中所有指令进行判断,并从所有准备好的指令中找出最合适的那条指令,送到FU中执行、对于乱序处理器而言,这个阶段是从乱序执行到乱序执行的分界点,指令在这个阶段之后,都是按照乱序的方式来执行,直到流水线的提交(Commit)阶段,才会重新变成顺序执行的状态。在发射队列中还存在唤醒(wake-up)电路,他可以将发射队列中对应的源操作数置为有效的状态,仲裁电路和唤醒电路互相配合进行工作,是超标量处理器中的关键路径。

(6)Register File(读取寄存器):被仲裁电路选中的指令需要从物理寄存器堆(PRF)中读取操作数。一般情况下,被仲裁电路选中的指令可以从PRF得到源操作数。当然还有不一般的情况,那就是指令不能从PRF中得到操作数,事实上很大一部分指令都是通过旁路网络获得操作数的。这也为减少PRF的读端口提供了可能。由于超标量处理器每周期需要执行好几条指令,PRF所需要的端口数也是比较多的,多端口的寄存器堆的访问速度一般都不是特别快。因此在现实世界的处理器中,这个阶段都会单独使用一个流水段。

(7) Execute(执行):指令得到了它所需要的操作数之后,马上就可以送到对应的FU中执行了,在超标量处理器中,这个阶段通常有很多不同类型的FU。例如负责普通运算的FU,负责乘加运算的FU,负责分支指令运算的FU,负责load/store指令的FU等。现在处理器还会加入一些多媒体运算的FU,例如SIMD运算的FU。

(8) Write back(写回):这个阶段将FU计算的结果写回物理寄存器堆中。同时这个阶段还有一个很重要的功能,就是通过旁路网络将这个计算结果送到需要的地方,一般都是送到FU的输入端。由FU的输入端的控制电路在决定最终需要的数据,在现代处理器中,旁落网络是影响速度的关键因素,因为这部分需要大量的布线,而随着硅工艺尺寸的减少,连线的延迟甚至超过门电路的延迟,因此旁路网络会严重影响处理器的周期时间。为了解决这个问题,很多处理器都采用了Cluster结构,将FU分成不同的组,在一个组内FU,布局布线时会紧挨在一起,这样此组内的旁路网络由于经过的路径比较短,一般都可以在一个周期内完成。当旁路网络跨越不同的组时,就需啊哟两个甚至更多的周期了。

 (9) Commit(提交):这个阶段主要作用的部件是重排序缓存ROB,它会将乱序执行的指令拉回到程序中规定的顺序,之所以能完成这样的任务,是因为指令在流水线的分发(Dispatch)阶段,按照程序中规定in-order写到了重排序缓存中。处理器执行的结果要和程序中原始的顺序是一样的,但是在超标量处理器中,指令是按照乱序的方式在内部执行的,最后需要这样一个阶段,将这些乱序执行的指令变回到程序规定的原始顺序。在重排序缓存中,如果一条指令的指令还没有执行完,那么即使这条指令已经执行完了,它也不能离开重排序缓存,必须等待它之前的所有指令都执行完成。在这个阶段也会对指令产生的异常进行处理,指令在流水线的很多阶段都可以发生异常,但是所有的异常都必须等到指令到达流水线的提交Commit阶段才能进行处理,这样保证异常的处理按照程序中规定的顺序进行,并且能够保证实现精确的异常。一条指令一旦从重排序缓存中离开而退休retire,那么就对处理器的状态进行了修改,再也无法返回到之前的状态了。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超标处理器设计》讲述超标(SuperScalar)处理器设计,现代的高性能处理器都采用了超标结构,大至服务器和高性能PC的处理器,小至平板电脑和智能手机的处理器,无一例外。《超标处理器设计》以超标处理器的流水线为主线展开内容介绍。《超标处理器设计》主要内容包括超标处理器的背景知识、流水线、顺序执行和乱序执行两种方式的特点;Cache的一般性原理、提高Cache性能的方法以及超标处理器中的Cache,尤其是多端口的Cache;虚拟存储器的基础知识、页表、TLB和Cache加入流水线后的工作流程;分支预测的一般性原理、在超标处理器中使用分支预测时遇到的问题和解决方法以及如何在分支预测失败时对处理器的状态进行恢复;一般的RISC指令集体系的简单介绍;指令解码的过程,尤其是超标处理器中的指令解码;寄存器重命名的一般性原理、重命名的方式、超标处理器中使用寄存器重命名时遇到的问题和解决方法以及如何对寄存器重命名的过程实现状态恢复;指令的分发(Dispatch)和发射(Issue)、发射过程中的流水线、选择电路和唤醒电路的实现过程;处理器中使用的基本运算单元、旁路网络、Cluster结构以及如何对Load/Store指令的执行过程进行加速;重排序缓存(ROB)、处理器状态的管理以及超标处理器中对异常的处理过程;经典的Alpha21264处理器的介绍。在本书中使用了一些现实世界的超标处理器作为例子,以便于读者加深对超标处理器的理解和认识。 《超标处理器设计》可用作高等院校电子及计算机专业研究生和高年级本科生教材,也可供自学者阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值