计算机体系结构量化研究方法(六)——流水线基础与中级概念

流水线

什么是流水线

流水线是一种将多条指令重叠执行的实现技术。一条指令的执行需要多个操作,流水线技术充分利用了这些操作之间的并行性。流水线是加快CPU速度的关键实现技术。
指令流水线的吞吐量由指令对出流水线的频率决定的。
流水线设计者的目标是平衡每条流水线的长度。如果各级达到完美平衡,那么每条指令在流水线处理器中的时间等于::
非流水线机器上每条指令的时间/流水线的数目

RISC基本指令集基础知识

RISC体系结构有几个关键属性:

  • 所有数据操作都是对寄存器中数据的操作,通常会改变整个寄存器
  • 只有载入和存储操作会影响到存储器,他们分别将数据从寄存器或从寄存器已到存储器。通常存在一些可以载入或存储低于一个完整寄存器的内容。
  • 指令格式的数量很少,所有指令通常都是同一种大小。

以MIPS64为例,扩展的指令通常在助记符后面或开头加上D来表示。通常有三类指令:
(1) ALU指令——这些指令取得两个寄存器或者一个寄存器
(2)载入和存储指令——这些指令获取一个寄存器源(基质寄存器)
(3)分支与跳转——分支是指控制的条件转移。通常有两种方式来指定分支条件:采用一组条件位,或者通过寄存机之间、寄存器与零之间的有限对比来设定。

RISC指令集简单实现

简单的五周期流水线
(1)指令提取周期(IF)
将程序计时器PC发送到存储器,从存储器提取当前指令。向程序计数器加4,将程序计数器更新到下一个连续程序计数器。
(2)指令译码/寄存器提取周期(ID)
对指令进行译码,并从寄存器堆读取与寄存器源说明符相对应的寄存器。在读取寄存器时对其进行相等测试,以确定是否为分支。指令译码和寄存器的读取是并行执行的,这可能是寄存器说明符位于固定位置。这一技术称为固定字段译码。
(3)执行/有效地址周期(EX)
ALU对一周期准备的操作数进行操作,根据指令类型执行三条指令之一。

  • 存储器引用——ALU将基质寄存器和偏移量加到一起,形成有效地址。
  • 寄存器-寄存器ALU指令——ALU对读自寄存器堆的执行由ALU操作码指定的操作。
  • 寄存器-立即数ALU指令——ALU对读自寄存器堆的第一个值和符号扩展立即数执行由ALU操作码指定的操作。

(4)存储器访问(MEM)
如果该指令是一条载入指令,则使用上一周期计算的有效地址从存储器中读取数据。如过是存储指令,则使用更有效地址从寄存器堆的第二个寄存器读取的数据写入存储器。
(5)写回周期(WB)
将结果写入寄存器堆,无论是来自寄存器系统还是来自ALU。

在这一实现中,分支指令需要两个周期,存储指令需要四个周期,其他需要五个周期。

经典五级流水线

尽管每条指令需要5个周期才能完成,但在每个周期内,硬件都会启动一条新的指令。
我们需要确定处理器每个时钟周期都会发生什么,确保不会在同一时钟周期内对相同路径源执行两个不同的操作。可以看到,主要功能单元是在不同周期内使用的,因此多条指令执行不会引入冲突。

  1. 使用分离的指令存储器和数据存储器。在使用时,在指令提取和数据存储器访问之间可能会发生冲突,使用分离的缓存可以消除这种冲突。
  2. 在两个阶段都是用了寄存器堆:一个是在ID中进行读取,一个是在WB中进行写入。这些用法是不同的。因此每个周期需要进行两次读取和一次写入。为了处理器对相同寄存器的多次读取和写入,我们在时钟周期的前半部分进行写入,在后半周期读取。
  3. 图中没有涉及程序计数器,为了在每个时钟都启动一条指令,必须在每个时钟周期的IF阶段使程序使程序寄存器递增并存储它。此外,还需要拥有一个加法器,在ID期间计算潜在的分支目标。另外一个问题就是分支ID期间改变程序计数器。

另外,必须确保不同流水级中的指令不会相互干扰。这种分离是通过流水线寄存器来实现的。将一个给定流水线得出的额所有结果存储到寄存器中,在下一个时钟周期用作下一级的输入。

流水化的基本性能问题

流水化提高了指令吞吐量,但不会缩短单条指令的执行时间,实际上还会有一点延长。

流水线冒险

冒险会阻止指令流中的下一条指令在自己的指定时钟周期内执行。冒险降低了流水化所能获得的理想加速比,共有三类冒险。
(1)结构冒险——如果硬件无法同时支持指令的所有可能组合方式,就会出现资源冲突,从而导致结构冒险
(2)数据冒险——流水线指令存在先后顺序,如果一条指令取决于先前指令的结果,就可能导致数据保险。
(3)控制冒险——分支指令及其他改变程序计数器的指令实现流水化时,可能导致控制冒险。

流水线中的冒险会使流水线停顿。为了避免冒险,就要求在流水线中的一些指令延迟时,其他一些指令能够继续执行。

停顿流水线性能

流水化可以看做CPI或者时钟频率的降低。流水线的理想CPI几乎等于1。因此

结构冒险

当处理器以流水线方式工作时,指令的重叠执行需要实现功能单元的流水化和资源的复制,以允许在流水线中出现的所有坑你的指令组合。如果由于资源冲突而不能容许某些指令组合,就说明存在结构冒险。

结构冒险最常见于某功能单元未能完全流水化的情况。另一个常见方式是某一资源的复制不足以执行流水线中的额所有指令组合。

可以使用含有流水级名称的见图来表示停顿行为。

数据冒险

流水化的主要效果是通过重叠指令的执行过程来改变他们的相对执行时间。这种重叠引入了数据与控制冒险。当流水线改变操作数的读写访问顺序,使得该顺序不同于非流水线化处理器上一次执行指令时的顺序,则可能发生数据冒险。
在DADD指令之后的所有指令都用到了DADD的结果。DADD指令在wb流水级写入了R1的值,但是DSUB指令在其ID级就要使用这个值。这就造成了数据冒险。

利用转发技术将数据冒险停顿减至最少

转发的简单硬件技术来解决。转发技术的关键是认识到DSUB要等到DADD实际生成结果之后才用到它。DADD将此结果放在流水线寄存器中,如果它从这里转移到DSUB需要的地方,那就可以避免出现停顿。
(1)来自EX/MEM和MEM/WB流水线寄存器的ALU结果总是被反馈到ALU的输入端。
(2)如果从转发硬件检测到前一个ALU操作依据对当前ALU操作的源寄存器进行了写入操作,则控制逻辑选择转发结果作为ALU输入,而不是从寄存器堆中读取值。

需要停顿的数据冒险

并非所有的数据冒险都可以通过旁路方式处理。

分支冒险

控制冒险造成的性能损失可能比数据冒险还要打。在执行分支时,修改后的程序计时器的值可能等于当前值加4。如果指令I为选中分支,通常会等到ID末尾,完成地质计算后和对比之后才会改变程序计数器。

处理分支的最简单方法是:一旦在ID期间检查到分支,就对该分支之后的指令重新取值。第一个IF周期基本上就是一次停顿。因为他从来不会执行有用的工作。
如果每个分支产生一个停顿周期,将会使性能损失10%-30%。有一些降低损失的技术。分支的操作是静态的,也就是说,他们对每条指令的分支都是的固定的。

降低流水线分支

处理器分支的最简单机制是冻结或冲刷流水线,保留或删除分支之后的所有指令。直到知道分支的目标之后。

一种性能更好但略微复杂的方法是将每个分支都看做未选择分支,允许硬件继续执行,就好像该分支未被执行一样。这时要保证在确切知道分支输入之前,不要改变处理器状态。 在简单的五级流水线中,这种预测未选中机制的实现方式是继续提取指令。但是,如果分支被选中,就需要将已提取的指令转为空指令,重新开始在目标地址位提取指令。

另外一种替代机制是将所有分支都看做选中分支,只要对分支指令进行了译码并计算地址,就可以假定该分支被选中,在目标地址提取和执行。因为五级流水,不能在知道分支输出结果之前知道目标地址。

第四种机制称为延迟分支。这一技术在早起RISC处理器中的使用非常广泛。在五级流水线中的工作状态相当好。提前执行分支目标。
编译器的任务是让后续指令有效并可用。因此使用了多种优化方式。

分支预测的性能

考虑分支代价的实际流水线加速比为:

通过预测降低分支成本

静态分支预测

改进编译分支预测的一种重要的方式是利用先前运行过程手机的数据。

动态分支预测和分支预测缓冲区

最简单的动态 分支预测机制是分支预测缓冲区或者分支历史表。

如何实现流水化

MIPS简单实现

每个MIPS指令都可以在最多5个时钟周期中实现。

  1. 指令提取周期(IF)
  2. 指令译码/寄存器提取周期(ID)
  3. 执行/实际地址周期(EX)
  4. 存储器访问(MEM)
  5. 写回周期(WB)

MIPS基本流水线

几乎不需要什么改变就能实现流水化。因为每个流水级在每个时钟周期都是活动状态。此外,数据路径的流水化要求必须将流水级之间传递的数据放在寄存器中。MIPS流水线包含了每个流水线之间的适当寄存器,成为流水线寄存器或者流水线锁。

实现MIPS流水线的控制

将一条指令从指令译码(ID)移入此流水线(EX)的过程称为指令发射。 已经执行这一步骤的指令称为已发射。对于MIPS整数流水线,所有数据冒险都可以在该流水线的ID阶段进行检查。如果存在数据冒险,该指令将在被发射之前停顿。下图显示了我们必须处理的各种环境。


接下来实现载入互锁。如果存在一个因为载入指令导致的RAW冒险,当需要该载入指令导致的RAW冒险,当需要该载入数据的盒子里存在于ID级时,该载入数据将位于EX级。
一旦检测到冒险,控制单元必须插入流水线停顿,并防止IF和ID级中的指令继续前进。

处理器流水线中的分支

在MIPS中,分支需要检测一个寄存器,看其是都等于另一个寄存器。如果仅考虑BEQZ和NBEZ的情景,那有可能通过将零检测一道周期内部,在ID周期结束时完成此判断。在ID期间就按分支目标地址需要格外增加一个加法器,并在ID期间作出分支判断,分支只需要停顿一个时钟周期。

妨碍流水线的难题

指令的执行顺序发生意外改变

异常处理

异常情景在流水化CPU中更难处理:由于指令的重叠,更难以判断这一条指令是否能安全改变CPU的状态。流水线中的其他指令可能会引发一些异常,强制CPU在流水线中的指令尚未完成时终止执行。

###异常的类型
人们使用中断、错误和异常等词。

  1. I/O设备需求
  2. 从用户程序调用操作系统服务
  3. 跟踪指令执行
  4. 断点
  5. 整数算术溢出
  6. 浮点算术异常
  7. 页面错误
  8. 存储器访问未对齐
  9. 违反存储器保护规则
  10. 使用未定义或未实现的指令
  11. 硬件故障
  12. 电源故障

尽管我们使用异常来涵盖所有这些事件,但各种时间都有自己的重要特性,决定了硬件中需要采取的操作。

停止和回复执行

和在非流水化实现中一样,最苦难的异步有两种特征:(1)发生在指令内部(2)必须可以重新启动。比如,在MIPS流水线中,由数据提取导致的虚拟存储器页面错误只可能发生在该治理MEM级的某一时间。在出现该错误是,会有其他几条指令正在运行。页面错误必须是可重新启动的,需要另一进程的干预。
在发生异步时,流水线控制可采取以下步骤安全保存流水线的状态。

  1. 在下一个IF向流水线中插入一个陷阱指令
  2. 在选中该陷阱之前,禁止错误指令的所有写入操作,禁止流水线中后续所有指令的写入操作。
  3. 在操作系统异常处理例程接受控制权之后,它会立即保存故障指令的PC。后面从异常返回时会用到这个值。
    当我们使用延迟分支时,由于流水线可能不是按照顺序相关执行的,所以仅用一个PC不再可能恢复重建处理器的状态。一次我们需要保存和恢复的PC竖井母等于分支延迟的长度增加1。

在处理异常之后,特殊指令(比如REF指令)通过重新加载PC并重启指令流从异常返回处理器。如果六熟悉可以停止,使紧临错误指令之前的指令能够完成,使其之后的指令可以从头重新启动,那就说明流水线有精确异常 。对应表其他异常,比如浮点异常,某些处理器上的错误指令会首先写入其结果,然后才能处理异常。

MIPS中的异常

下图显示了MIPS每一级流水线可能发生的异常。

现实中的情景并不简单明了。异常可能乱系发生。意见会将一条给定指令产生的所有异常都记录在一个与该指令相关联的状态向量中。这个异常装填向量将一直随该指令向流水线下方移动。一旦在异常状态向量中设定了异常只是,则关闭任何可能导致数据值写入。

指令集的复杂性

在保证一台指令完成时,称为已提交。在MIPS整数流水线中,当所有指令到达MEM级的末尾,而且没有指令在该级之前更新状态,则说明这些指令已提交。
一些处理器的指令会在指令执行中改变状态,更改装填是,该指令及之前的指令可能还没有完成。在这样一个非精确异常之后重启指令流是很有难度的。我们也可以避免在指令提交之前更新指令。

扩展MIPS流水线,以处理多周期操作

扩展MIPS流水线,以处理浮点运算。要求所有MIPS浮点运算都在1个时钟周期内完成时不太现实的,甚至在2个时钟周期内也有很大难度。设想浮点指令拥有与整数指令相同的流水线,就容易理解。处理器中会有两处重要改变,(1)为了完成操作,EX周期可能要根据需要重复多次,不同操作重复的次数可能不同。(2)可能存在多个浮点功能单元。

我们首先假设MIPS有四个独立的功能单元:

  1. 主整数单元,处理器载入和存储、整型ALU操作,还有分支
  2. 浮点与整数乘法器
  3. 浮点加法器,处理浮点加、减和转化
  4. 浮点和整型触发器。

我们还假定这些功能单元的执行没有实现流水化,那么下图给出了最终的流水线结构。实际上,中间结果可能不会围绕EX单元循环,而是在EX流水级拥有一些大于1的时钟延时。为了描述这样一个刘淑贤,必须定义东南单元的延时以及启动间隔。延迟时伸出结果的指令预使用结果指令之间的周期数。
根据延迟的定义,整型ALU运算的延迟为0,因为其结果可以在下一时钟周期使用;而load指令延时是1。大多数操作都会在EX的开头使用其操作数,所以演出通常指EX之后的级数。高时钟频率的代价是延长了操作的延时。
上表中允许多大四个同时执行的浮点加、7个挺尸执行的浮点乘。下图说明了如何通过扩展来挥之这个流水线。重复间隔是通过增加恩爱的流水级来实现的,它们由增加的流水线寄存器隔开。由于这些是相互独立的,所以我们使用不同命名。需要多个时钟的流水线,将被进一步细分,以显示这些流水级的延迟。

MIPS R4000流水线

下图显示了八级流水线结构,使用了数据路径的抽象版本。尽管指令和数据存储器占用多个周期,但他们已经完成时限流水化,所以每个时钟周期都可以开始一条新指令。

  1. IF——指令提取的前半部分,PC选择与指令缓存访问的初始化实际上发生在这里
  2. IS——指令提取的后半部分,完成指令缓存访问
  3. RF——指令译码与寄存器提取、冒险检测、指令缓存命中检测
  4. EX——执行,包括实际地址计算、ALU操作和分支目标计算与条件判断
  5. DF——数据提取
  6. DS——数据提取的后半部分
  7. TC——标记检查
  8. WB——载入和寄存器-寄存器的写回过程

除了显著增加多需要的转发数量之外,这种较长延时既会增加载入延时,也会增加分支延迟。

浮点流水线

浮点单元由3个功能单元缓存;浮点触发器、浮点乘法器和浮点加法器。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值