第14章 处理器结构与功能

14.1 处理器的组织

考虑对处理器的需求,也是它必须要做的工作;

  1. 读取指令:处理器从存储器(寄存器、高速缓存、主存)读取指令;

  1. 解释指令:对指令进行译码,以决定需要怎样的操作;

  1. 读取数据:从存储器或io模块读取数据;

  1. 处理数据:对数据进行一些算术或逻辑操作;

  1. 写数据:执行的结果可能需要把数据写回存储器或io模块;

要完成上述工作,就明白处理器需要暂时存储一些数据。处理器必须记住最后一条指令的位置,这样它才能知道到哪里去取下一条指令。它还需要在指令执行的时候暂时保存指令和数据。

处理器的主要组件是alu,控制单元cu。alu执行实际的计算或数据处理。cu控制数据和指令进出处理器的的移动,以及alu的操作。请注意计算机整体的内部结构与处理器内部结构之间的相似性(计算机:处理器,io,内存;处理器:控制单元,alu,寄存器)通过数据路径来连接。

14.2 寄存器的组织

处理器中的寄存器有2种角色:

1.用户可见寄存器:通过优化寄存器的使用,使机器语言或汇编语言程序员能将访存次数最小化;

2.控制和状态寄存器:由控制单元来控制处理器的操作,由有特权的操作系统程序控制程序的执行。

寄存器没有明确地分为这两类。

14.2.1 用户可见寄存器

用户可见寄存器是可以通过处理器执行的机器语言进行引用的寄存器,可以分为下面几类:

1.通用:可以被程序员分配各种功能。任何通用寄存器都可以包含任意操作码的操作数。不过还是有限制的,例如,可能会有专门的寄存器用于浮点和栈操作。在某些情况下,通用寄存器还可用于寻址功能(寄存器间接、偏移)。

2.数据:可能只用于保存数据,不能用于计算操作数地址。

3.地址;地址寄存器本身可能是通用的,也可能用于特定的寻址模式,例如;

a.段指针:在使用分段寻址的机器中,段寄存器存放的是基地址。

b.变址寄存器:用于变址寻址,还可能用于自动变址。

c.栈指针:如果存在用户可见栈寻址,那么通常会有一个专门寄存器来指示栈顶。也就是说,push和pop和其他栈指令不需要包含显示的栈操作数。

4.条件码:保存条件码(标志),对于用户,它至少是部分可见的。条件码是作为操作的结果,由处理器硬件设置的位。条件码位被集中放在一个或多个寄存器中。一般,它们构成控制寄存器的一部分。通常,机器指令允许隐式引用来读取这些位,但是程序员不能改变它们。

寄存器组织需要解决几个设计问题:

1.是使用完全通用的寄存器,还是让它们专用化。使用专用寄存器时,通常可以把某个操作数说明符所指的寄存器类型隐含在操作码中,这可以节省位数,不过也限制了程序员的灵活性。

2.提供寄存器数量的问题。因为更多的寄存器需要更多的操作数说明符位数。之前讨论寄存器数量在8~32之间为最佳。寄存器越少,访存越多;但寄存器越多却不会明显减少访存次数。然而,在一些risc系统中展示的一种新方法却发现使用上百个寄存器的优点。

3.寄存器的长度问题。必须保存地址的寄存器显然需要足够长才能容纳最大的地址。数据寄存器应该能存放常见数据类型的值。有些机器允许使用两个连续的寄存器来存放双倍长度的数值。

优点

缺点

由于条件码由常规的算术和数据移动指令的设置,因此它们应该减少所需的Compare和test指令数量。

条件码增加了软件和硬件的复杂性。条件码通常以不同的方式被不同的指令所修改,这使得程序员和编译器的的工作更加困难。

相对于复杂指令,条件指令进行了优化。

条件码不规范:它们通常不是主数据通路的一部分,因此它们需要额外的硬件连接。

条件码促进了多分支,一个是小于等于0,一个是大于0.

通常,条件码计算机都必须为特殊情况添加特殊的无条件码指令,例如位检查、循环控制及原子信号量操作。

在子例程带调用中,条件码可以和其他寄存器信息一起保存到栈中。

在流水线实现中,条件码需要特殊的同步来避免冲突。

14.2.2 控制和状态寄存器

以下4个寄存器对指令的执行至关重要:

1.程序计数器pc:包含将被读取指令的地址;

2.指令寄存器ir:包含最近被读取的指令;

3.内存地址寄存器mar:包含一个内存位置的地址;

4.内存缓冲寄存器mbr:包含要写入内存的数据字或者最近被读取的字;

并不是所有的处理器都有被指定为mar和mbr的内部寄存器,但是这样就需要一些等效机制,以便暂存要传输到系统总线的位以及数据总线读取的位。

通常,处理器在每次取指之后都会更新pc,以便让pc总是指向下一条要执行的指令。分支或者跳转指令也会改变pc的内容,被取指令加载到ir,分析操作码和操作数说明符。使用mar和mbr与内存交换数据。在总线结构系统中,mar直接与地址总线相连,mbr直接与数据总线相连。用户可见寄存器又与mbr交换数据。

许多处理器设计都有包含状态信息的寄存器或者寄存器组,通常称为程序状态字psw。常见字段或标志如下:

1.符号:包含最近算术运算结果的符号位;

2.零:当结果为0时置位;

3.进位:如果运算结果有向更高位进位或借位则置位。用于多字算术运算;

4.相等:如果逻辑比较结果为相等,则置位;

5.溢出:表示算术溢出;

6.中断允许/禁止:用于允许或禁止中断。

7.管理员:指示处理器是在管理员模式还是用户模式下执行。

控制和状态寄存器组织的设计涉及许多因素。一个关键问题就是操作系统支持。另一个关键的设计决策是控制信息在寄存器与内存之间的分配。

14.3 指令周期

指令周期包含如下阶段:

1.取指:从内存读取下一条指令到处理器;

2.执行:解释操作码,执行指定操作;

3.中断;如果允许中断,且中断发生,则保存进程状态并服务中断。

14.3.1 间接周期

指令的执行可能涉及一个或多个内存操作数,其中的每一个都需要访问内存。此外,如果使用了间接寻址,那么还需要额外的内存访问。

14.3.2 数据流

指令周期中事件的确切顺序取决于处理器的设计。

在取指周期内,指令从内存读出。pc包含了下一条要读取指令的地址。该地址被送到mar,并放到地址总线上。控制单元请求读取内存,其结果被放到数据总线上,并被复制到mbr中,然后送入ir。同时,pc加1,为下一次取指做准备。

当取指周期结束后,控制单元将检查ir的内容,以确定它是否包含了使用了间接寻址的操作数说明符。如果是,就执行一个间接周期。mbr的数据被传输到mar,它们包含了地址引用。然后控制单元请求读取内存,将所需操作数地址取到mbr中。

取指和间接周期都是简单且可以预测的。执行周期则有多种形式,具体是哪种取决于ir中的各种指令。这个周期可能会包含寄存器之间的数据传输,对内存或io的读写,以及对alu的调用。

与取指和间接周期一样,中断周期也是简单且可预测的。必须保存pc的当前内容,以便处理器在中断后能恢复正常活动。因此,pc的内容需要传给mbr,并写入内存。

14.4 指令流水线

对处理器的组织增强也能提高性能,比如使用多个寄存器和使用高速缓存。另一种非常普遍的组织方式就是指令流水线。

14.4.1 流水线策略

简单的做法是把指令的处理分为两个阶段:取指和指令执行。在执行指令期间,有时不访问主存。这个时间可以用来同时实现下一条指令和执行当前指令。第一阶段可以利用任何为使用的存储周期来取出并缓存下一条指令。这称为指令预取或取重叠。注意,这种方法设计指令缓存,需要更多的寄存器。通常,流水线需要寄存器来保存阶段之间的数据。

流水线的执行效率很难随着段数正比增长的原因有二:

1.通常执行的执行要比取指时间长。执行会涉及读写操作数以及某些操作的性能,因此取指阶段可能需要等待一段时间才能清空它的缓冲区。

2.条件分支指令使得下一条被取指令的地址成为未知。因此,取指阶段必须等待,直到从执行阶段的到下一条指令地址。访存冲突,中断等事件。

为了获得更多的加速,流水线必须有更多的流水段,让我们考虑如下对指令的分解:

1.取指:把下一条预取指令读入缓冲区;

2.译码:确定操作码和操作数说明符;

3.计算操作数:计算每个源操作数的有效地址。这可能涉及偏移、寄存器间接或者其他形式的地址计算。

4.取操作数:从内存读取每个操作数。寄存器中的操作数不用读取。

5.执行指令:执行指定的操作,如果有结果,就把结果保存到指定的目的操作数位置。

6.写操作数;把结果保存到内存。

指令并非要执行所有流水段,比如load指令就不需要写操作数阶段。

此时会发生简单2段流水线结构中没有出现的问题也发生了,计算操作数阶段可能会依赖前面指令修改的寄存器内容。

似乎流水线中段数越多,执行速度就越快。但有3个因素阻碍了这种看似简单的高性能设计模式:

1.随着流水线段数的增加,喂满流水线所需指令的数目增加,而分析和调度更多指令的难度按二次方上升,静态和动态都难以达标,以及程序基本块固有的并行性也可能达不到所需要的并行性。

2.流水线越深,所需要的流水线寄存器越多,流水线缓冲区操作需要的总时间越多,这会增加指令周期的时间。(锁存延迟)

3.流水线越深,清空流水线代价越高,则分支预测失败和推测执行的代价也就越高。

14.4.2 流水线性能

指令流水线的周期时间t是通过流水线把一组指令推进一个阶段所需的时间。取最大流水段延迟+锁存器延迟。通常,延迟时间远小于流水段时间。现假设要处理器n条指令,流水线有k段:

T = (k+(n-1))t

无流水线下,需消耗nkt,当在极限情况 ,可以获得k倍加速比。因此,流水线的段数越多,加速的可能性就越大。然而,实际上更多流水段的潜在收益会被成本的增加、段间的延迟和遇到分支后清洗流水线的需求所抵消。

14.4.3 流水线冒险

流水线中由于条件不允许继续执行而必须停顿时,就会发生流水线冒险。一个流水线停顿也被称为流水线气泡。冒险有三类:资源、数据和控制

1.资源冒险:当2条或更多指令已经在流水线中执行且又需要相同资源时,其结果就是,这些指令必须串行执行,而不是并行执行。资源冒险有时也被称为结构冒险。

现假设主存只有一个端口,且所有取指和数据读写都必须一次执行一个,忽略高速缓存,此时对内存的操作数读写不能与取指并行执行。另一个资源冒险的例子发生在多条指令准备进入执行阶段,但alu却只有一个情况下,解决资源冒险的方法有增加可用资源,共享资源和流水化。比如让主存具有多个端口,以及让结构有多个alu单元。

分析资源冲突、辅助流水线设计的一个方法是预约表。

2.数据冒险:程序中的数条指令按序执行,它们都要访问特定的内存操作数或寄存器操作数,如果这些指令是严格地按序执行,那么不会出现问题,但是如果在流水线中执行,那么操作数值的更新方式可能就会与严格按序执行的方式的不一样,由此会产生不同的结果。数据冒险有3种类型;

a.写后读:一条指令修改寄存器或内存位置,后续指令读取该内存或寄存器位置中的数据。

b.读后写:一条指令读一个寄存器或内存位置,后续指令对这个位置进行写。

c.写后写:两条指令都写同一位置。

3.控制冒险:当流水线对分支预测做出了错误判断,使得进入流水线的指令之后必须被丢弃。

14.4.4 处理分支

设计流水线的一个主要问题就是确保指令稳定地流向流水线的初始阶段。主要障碍是条件分支,在指令实际执行前,无法确定分支是否会发生。解决条件分支的方法如下:

1.多流:简单流水线之所以会因为分支指令而产生损失,是因为接下来它必须从两条指令中选择一条,而做出的选择可能是错的。简单粗暴的的方法复制流水线的初始部分,利用2个流,允许该流水线同时读取2条指令,这种方法有2个问题;

a.对于多条流水线,访问寄存器和内存存在争用延迟;

b.在初始分支决策解决之前,可能会有其他分支指令进入流水线(2个流)。每条这样的指令都需要一个额外的流。

2.预取分支目标:当一个分支被识别后,除了预取分支后面的指令外,还要预取分支的目标。然后保存该目标,直到分支指令执行。如果进行分支,则目标已经被预取了。

3.循环缓冲区:循环缓冲区是一个容量很小,但速度很快的存储器,有流水线的取指阶段维护,其中按顺序包含了n条最近获取的指令。如果要进行分支,硬件首先检查分支目标是否在缓冲区内。如果是,则从该缓冲区中取得下一条指令。循环缓冲区有3个优点:

a.使用预取,当一个条件分支被识别后,除了预取分支后面的指令外,还要预取分支的目标,然后保存该目标,直到分支指令执行,如果进行分支,则目标已经被预取了。

b.如果发生分支的目标仅仅在分支指令地址之前的几个位置上,那么这个目标就已经在缓冲区中。

c.这个策略特别适合处理循环或迭代,因此命名为循环缓冲区。如果循环缓冲区大到足够包含循环中的全部指令,那么这些指令只需要在第一次迭代的时候,从内存中取出一次即可。对于后续迭代,所需的全部指令都已经在缓冲区内。

循环缓冲区在原理上类似专用于指令的高速缓存。不同之处在于:循环缓冲区只按序保留指令,而且容量更小,因此成本更低。

4.分支预测:使用各种技术来预测分支是否会执行。常见方法如下:

a.预测从不跳转;

b.预测总是跳转;

c.按操作码执行;

d.跳转/不跳转开关;

e.分支历史表;

前三种方法是静态的,即它们不依赖于条件分支之前的执行历史。后两种方法是动态的,即它们依赖于执行历史。

最简单的是前两种方法。程序行为分析的研究表明分支跳转的时间超过50%因此从任一路径预取的成本相同。但是在分页机器中,预取分支目标比按序预取下一条指令更容易导致缺页故障。所以考虑这种性能损失,可用通过采用回避机制来减少这种损失。最后一种静态方法是根据分支指令的操作码来做出决策。

动态分支策略尝试通过记录程序中条件分支指令的历史来提高预测的准确性。例如,一个或多个位可以关联到每条条件分支指令,以反映该指令的近期历史。这些位被称为跳转开关/不调转开关,指示处理器在下一次遇到该指令时做出特定决定。

决策过程可以用更加简洁地使用有限状态机来表示。使用历史位有个缺点:目标地址是条件分支指令的操作数。分支历史表是与流水线取指阶段关联的一个小型高速缓存。表中每个表项有3个元素;分支指令的地址、记录该指令使用状态的一些历史位和目标指令的信息。

5.延迟分支;通过自动重新排列程序中的指令,使得分支指令产生的时间比实际期望的时间晚,就可以提高流水线的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值