附录A流水线基础和中级概念_第1页
附录A流水线基础和中级概念_第2页
附录A流水线基础和中级概念_第3页
附录A流水线基础和中级概念_第4页
附录A流水线基础和中级概念_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录A流水线基础和中级概念

事实上这是一个三段论的问题。

亚瑟・柯南道尔《福尔摩斯探案集》

A.1介绍

在阅读本章之前,许多读者可能通过其他书籍(例如我们写的更加基础的书籍:计算机

的组成与设计)对流水线问题有了一定的了解。由于第三章和第四章的内容在很大程度上依

赖于这份材料,读者必须确保在继续阅读本书之前对本附录的内容有比较全面的熟悉和了

解。当你阅读第三章的时候,你会发现回过头来看看这部分内容是非常有帮助的。

我们从流水线的基本内容开始,包括对数据相关和“冒险”的介绍,以及流水线的实现

等。本节介绍基本的5级RISC流水线技术,该技术是其他附录的基础。第A.2节讲述“冒

险”的问题,包括“冒险”如何引发数据相关,以及如何处理“冒险”问题等。第A.3节讲

述简单的5级RISC流水线是如何实现的,主要讨论“冒险”及其处理方法。

第A.4节讨论不同体系结构和流水线技术的交互,包括相当重要的例外处理问题,以及

它与流水线的交互作用。因为第A.4节是理解第三章内容的关键,所以对中断处理及中断处

理之后的恢复过程不是很熟悉的读者会发现,阅读这一节是非常有用的。

第A.5节讨论基本的5级流水线如何被扩展为可以处理浮点运算的长流水线结构。第

A.6节把以上的概念结合在一起,以一个实际的超流水线处理器——MIPSR4000/4400为例

进行学习,该处理器包括有8级的整数流水线和浮点流水线。与之对照,在第A.7节讨论使

用5级流水线的MIPS4300系列,这个系列的产品在嵌入式系统中被广泛运用。

第A.8节介绍动态调度的概念,及用记分牌实现动态调度的方法,该方法可作为•种学

习动态调度方法的捷径,同时,它也是第三章中的一个核心问题。第A.8节还对第三章提到

的Tomasulo算法作了简单介绍。尽管不涉及记分牌方法也可以理解Tomasulo算法,但通过

记分牌方法可以更简单和更容易地理解Tomasulo算法。

本附录的最后三节(第八.9节~第A.11节)讲述了谬误和缺陷,总结了该附录的主要思

想,并提供本附录所讲述的主要观点的简要历史。

A.1.1什么是流水线

流水线是多条指令同时执行的一种实现技术。目前,流水线已经成为高速CPU中采用

的关键技术。

流水线就像装配线那样。在汽车装配线上,一辆汽车的装配过程分为很多步骤,每一个

骤步完成汽车生产的一部分。在流水线中的每一个步骤与其他任何一个步骤都并行执行,尽

管装配的是不同的汽车。在计算机的流水线中,流水线的每一个步骤完成一条指令的一部分。

就像装配线那样,不同的步骤并行完成流水线中不同指令的不同部分。每一个步骤称为一个

流水节拍或一个流水阶段。一个流水节拍与另一个流水节拍相连接形成流水线。指令从一端

进入,经过这些流水节拍的处理,从另一端流出,就象汽车在装配线上的处理过程一样。

在汽车装配线匕吞吐量定义为每小时的汽车产量,它取决于汽车从装配线流出的速度。

与之相似,指令流水线的吞吐量取决于指令流出流水线的速度。由于指令步紧密相连,所有

的流水节拍也必须同步工作,就象装配线那样。指令沿流水线移动一次的时间间隔就是一个

机器周期。因为所有指令步同时工作,所以机器时间决定于最慢的指令步。在计算机中,这

个机器周期通常是一个时钟周期(有时是两个时钟周期,很少是多个),尽管时钟周期可能

有多个阶段。

流水线设计者的任务是平衡各个流水节拍的长度,就象装配线设计者力争平衡每一步阶

段的时间那样。如果每一步都得到最佳平衡,那么每条指令在流水线上的平均时间在最理想

情况下等于:

非流水线机器中一条指令的执行时间

流水线的节拍数

在这种情况下,流水线的加速比等于流水线的节拍数,就好像在一个有N个装配段的流水

线上,可以同时有N部汽车在装配。但是,通常的流水线加速比和流水线节拍之间不会得

到这么好的平衡,而且流水线需要有•些附加的时间开销。因此,每条指令在流水线上的平

均执行时间不会达到上面的最小值,尽管可以很接近。

通过以上的说明可以知道,流水线能够减少指令的平均执行时间。当你从不同角度看流

水线时,这个减少量也相应有所不同。可以认为是减少了每条指令的平均时钟周期数(CPI),

也可以认为是减少了时钟周期的长度,还可以认为在这两个方面都减少了。如果研究对象是

一台每条指令分为多个时钟周期的机器,那么流水线可以看作是减少了CPI——这是我们将

采纳的基本观点。如果研究对象是每条指令执行一个长周期,那么流水线减少的是机器的时

钟周期。

流水线是一种在连续指令流中开发指令级并行性的技术。与某些加速技巧(参看第六章)

相比,流水线的明显长处是:它对编程者是透明的。在本附录中,我们将首先看到一个经典

的5级流水线。在其他章节中,还讨论了现代处理中采用的一些更加经典的流水线技术。在

继续介绍流水线之前,我们需要一个简单的指令集,就是我们在下面要介绍的。

A.1.2RISC指令集基础

贯穿在本书中,我们使用RISC(精简指令集计算机)体系或者Load/Store体系来对基

本的概念进行说明,虽然这些概念也适用于其他体系结构的处理器。在本节中,我们介绍典

型的RISC体系结构的核心。在附录和本书中,我们默认的RISC体系结构是MIPS系统。

在很多地方,这些概念是如此的相似,所以我们不需要与特定的其他系统加以区别。

RISC有以下几个特点,这些特点明显简化了RISC的硬件实现:

•所有运算使用的数据都来自寄存器,运算结果也都写入寄存器,每个寄存器的典型

长度是32位或64位。

•能够访问内存的操作只有两条指令:从内存中读取数据到寄存器的Load指令和从

寄存器向内存中写数据的Store指令。Load和Store指令可以对一个寄存器的一部

分进行操作(例如:一个字节,16位,或者32位)。

•指令的数量比较少,所有指令的长度均相同。

这种结构使流水线的实现得到显著的简化,这就是为什么使用这种方法来设计指令系统

的原因。

为了和本文的其他部分保持一致,我们使用MIPS64(MIPS的64位版本)。扩展的64

位系统通常在操作符的开始或者结尾有个D。例如:DADD表示64位的加指令,LD是

表示64位的Load指令。

与其他的RISC指令系统一样,MIPS指令系统提供32位的寄存器,尽管0号寄存器的

值总是0。大多数RISC指令系统(包括MIPS指令系统),都包含有三种类型的指令(详见

第二章):

1.ALU指令——这类指令使用两个寄存器或者一个寄存器和一个带符号的立即数(被

称为ALU立即数指令,在MIPS系统中他们有16位的偏移值),对它们进行操作,

然后将结果存入第三个寄存器。典型的这类指令包括加(DADD),减(DSUB),

以及与32位和64位无关的逻辑操作(例如:AND和OR)。这些立即数指令使用

相同的符号,并加上后缀I。在MIPS中,有带符号和不带符号的算术指令。不带符

号的算术指令不会产生溢出一一所以在32位和64位的模式下都是相同的。不带符

号的算术指令在指令后面加字符U来表示(例如:DADDU,DSUBU,DADDUI)。

2.Load和Store指令一一这些指令的操作数部分由•个被称为基址寄存器的寄存器和

一个被称为偏移量的立即数域(在MIPS中为16位)构成。基址寄存器中的值与偏

移量的和就是操作的内存地址,被称为“有效地址”。以Load指令为例,其第二个

操作数(寄存器)给出从内存中读取数据的目的地址。指令读取双字(LD)或存储

双字(SD)是对整个64位的寄存器进行读取和存储。

3.分支和跳转一一分支语句就是条件跳转。在RISC指令系统中通常有两种方法来指明

分支的条件:使用一系列的条件位(有忖称为“条件码”),或者通过寄存器之间,

或寄存器与0之间的比较。MIPS使用后者。在本附录中,我们只考虑两个寄存器

之间的相等比较。在所有的RISC指令系统中,分支的目标地址都是通过在当前的

PC值上加一个偏移量(在MIPS中为16位)来得到的。在很多RISC指令系统中都

提供了直接跳转指令,但是在本附录中我们不对这种方式进行讨论。

A.1.3一个RISC指令系统的简单实现

为了更好的理解在流水线方式下如何实现一个RISC指令系统,我们首先需要理解在非

流水线情况下RISC指令系统是如何实现的。本节介绍一种简单的实现方案,在这种实现方

案中,执行每条指令最多只需5个时钟周期。当把该实现方案扩展到流水线之后,CPI将大

幅度降低。该方案并不是最经济和最高效的非流水线实现方案——实际上它只是用来使引入

流水线概念变得更加自然。我们将在本章稍后说明该方案如何改进。在实现指令集的时候需

要一些并不属于这个系统结构的临时寄存器,我们引入这些寄存器以简化流水线.

每一条RISC指令的执行至多需要5个时钟周期。这5个时钟周期如下:

1.取指令周期(IF)

根据PC指示的地址从存储器中取指令并装入到指令寄存器(IR)中,同时PC加4(因

为每条指令是4个字节)以获取下一条指令的地址。

2.指令译码/读寄存器周期(ID)

对指令进行译码并访问寄存器堆以读出寄存器中内容。对寄存器中的内容进行比较,判

断是否是分支指令。如果需要对偏移量进行处理,则把增量之后的PC值与偏移量相加,得

到可能的分支目标的地址。如果分支的判断结果为“真”,则把分支处理的目标地址写入PC,

且在本段的结束时分支必须被处理完成。

由于RISC指令系统指定的寄存器位置是固定的,使得译码过程和读指令的过程可以同

时进行。这种技术称为“固定域译码”。注意,我们可能会读取一个并没有使用的寄存器,

这不会对指令的执行产生任何影响(但是,这种读取确实浪费了能量,在对功耗要求比较严

格的设计中,要尽量避免发生这种问题)。由于指令的立即数部分也保存在相同的位置,所

以对于需要扩展立即数的操作也可以在本时钟周期内进行。

3.执行/有效地址周期(EX)

ALU指令对上一个时钟周期准备好的操作数进行运算,根据指令的类型执行下面三个功

能中的一个:

•访问存储器:

通过ALU对基址寄存器和偏移量进行加法运算形成有效地址。

•寄存器-寄存器ALU指令:

ALU根据操作码对从寄存器堆中读取的数据进行运算。

•寄存器-立即数ALU指令

ALU根据操作码对从寄存器堆中读取的第一个操作数和扩展后的立即数进行运算。

在一个Load/Store体系结构中,因为没有指令需要在计算数据地址和指令目标地址的

同时对操作数进行运算,所以有效地址周期和指令执行周期可以合并在同一个时钟周期内。

4.访问存储器(MEM)

如果是load指令,将根据前一个周期计算得到的有效地址从存储器中读取数据。如果

是store指令,则根据有效地址将第二个寄存器中的数据写入存储器中。

5.写回周期(WB)

•寄存器-寄存器ALU指令/Load指令

将结果写入寄存器堆。结果可能来自存储器,或者来自ALU。

在这种实现方法中,分支指令需要2个周期,Store指令需要4个周期,而所有其他的

指令需要5个周期。假定分支的频度为12%,Store的频度为10%,那么总的CPI为4.54。

这种实现方法在获取高性能与在相同性能条件下使用最少硬件方面都不是最优的。我们把改

进这种设计的任务作为练习留给读者自己来完成。

A.1.4经典的5段流水线RISC处理器

我们只需简单地在每一个时钟周期启动一条新的指令就可以使上面所描述的指令执行

过程变为的流水线(由此可以看到我们为什么选择这个实现方案!)。前一节中的每•个时钟

周期就成了一个流水节拍,即流水线的一个周期,如图A.1所示的指令执行模式,在这个图

中使用了流水线结构的典型画法。其中,每一条指令经过5个时钟周期执行完成,在每一个

时钟周期内,硬件将启动•条新的指令并执行5条不同指令的某个阶段。

时钟

指令123456789

指令iIFIDEXMEMWB

指令i+1IFIDEXMEMWB

指令i+2IFIDEXMEMWB

指令i+3IFIDEXMEMWB

指令i+4IFIDEXMEMWB

图A.1简单RISC流水线。在每一个时钟周期都有一条新的指令取进来并开始长达5个时

钟周期的执行过程.若在每一个时钟周期都启动一条新的指令,那么性能将是不进行

流水处理的机器的5倍。流水线每一个节拍的名称与前面讲的非流水线的处理周期的

名称相同:IF=取指令、ID=指令译码、EX=执行指令、MEM=存储器访问、WB

=写回结果。

也许你难以理解流水线竟然会如此简单,你的直觉是对的,实际上它并不简单。在这一

节和后面的几节里,我们将讨论一些因为流水而引入的问题,从中你可以对RISC流水线有

一个真正的认识。

作为开始,我们需要确定机器在每一个时钟周期都进行什么样的动作,并保证在同一个

时钟周期没有两条指令使用相同的数据通路资源。例如,一个ALU不能同时用于计算有效地

址和做减法运算。因此,我们必须保证流水线中指令的重叠不会导致这样的冲突。幸运的是,

由于RISC指令集比较简单.,因此评定资源占用情况比较容易。图A.2给出了流水线方式下

简化的RISC数据通路。你可以看到,主要的功能部件都在不同的时钟周期使用,因此多条

指令的重叠执行引起的冲突很少。这从下面三点可以看出。

一厨而(时钟周期)

Time(indockcycles)-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------►

IM

程序执行顺序(指令序列)

图A.2流水线可以看作是随时间移动的一系列数据通路。这张图显示了不同数据通路的重

叠,其中周期5(CC5)表示稳定状态。由于寄存器堆在EX节拍被读,在WB节拍

被写,它就出现了两次。在包围每个节拍的线框中,如果实线在右侧,说明是读操作,

如果实线在左侧,说明是写操作;别的部分用虚线。缩写IM表示指令存储器,DM

表示数据存储器,CC表示时钟周期。

首先,上一节给出的基本的数据通路已经使用了分开的指令和数据存储器,其典型的实

现方式是使用的分开的指令和数据Cache(在第五章中讨论)。使用独立的Cache避免了对

单一存储器进行取指令和访问数据操作之间的冲突。应该注意的是,如果我们的流水线机器

的时钟周期和没有流水的机器相同,存储系统的带宽必须是原先的5倍,这就是取得高性能

的一个代价。

其次,寄存器堆在两个流水节拍中被使用:ID节拍读,WB节拍写。这两种使用是截然

不同的,因此我们简单地在两个地方画出了寄存器堆。这确实意味着在一个时钟周期需要执

行两次读和一次写。为了处理对同一个寄存器的读利写(这样处理的其他原因在不久就会看

到),我们在一个时钟周期的前半部分进行写寄存器操作,在该时钟周期的后半部分进行读

寄存器操作。

最后,图A.2并没有涉及到PC。为了在每一个时钟周期都能够启动一条新的指令,需

要每个周期都对PC进行自加运算并写回结果,这项工作必须在IF节拍完成,以便为下一条

指令做好准备。此外在ID节拍,我们还要为可能的分支目标地址的计算准备一个加法器。

一个需要更进一步考虑的问题是,分支指令只是在ID节拍才对PC的值进行改写,这种变化

引入了如何来处理分支的问题?这里,我们先忽略它,以后再讨论这个问题。

尽管确保流水线中的指令在同一时间不会使用相同的硬件资源是非常重要的,但是我们

还需要确保在流水线不同节拍中的指令不会互相的影响。我们通过在连续的流水线节拍中引

入流水线寄存器来解决这个问题。在每个时钟周期结束之后,该节拍的所有执行结果都保存

在流水线寄存器中,以作为下一个时钟周期,即下一个节拍的输入。图A.3是添加了流水

线寄存器的流水线结构图。

Tme(indockcyctefiy

图A.3通过在各个流水节拍之间增加一系列寄存器来进行流水。这些寄存器用于在一个流

水节拍和下一个流水节拍之间进行数据传递和信息控制。这些寄存器还起到了把指

令执行过程中一个阶段产生的数据传递给另一个阶段的重要作用。

尽管再很多流水线结构图中,为了简单起见省略了这些流水线寄存器,但是为了流水线

的正常工作,它们是必须的。当然,类似的寄存器在没有流水线的多循环数据通路中也是需

要的(因为只有在寄存器中的数据可以在时钟的跳变中被保存下来)。在流水线处理器的例

子中,寄存器也扮演了重要的角色。流水线寄存器把一个流水线节拍的结果传递给需要这个

数据的下一级的流水线。例如:store指令所要存储的寄存器数据值是在RF节拍被读取的,

但是直到MEM节拍才被实际使用。在MEM节拍,该数据是经过两个流水线寄存器才到达

数据存储器中的。同样的,ALU指令是在EX节拍进行计算的,但是直到WB节拍才被真

正的保存,该结果数据也是经过两个流水线寄存器才到达数据存储器中的。有些时候,为寄

存器命名是很有用的。按照惯例,用和寄存器相连的流水线节拍来命名它们,例如:ID/IF,

IF/RF,RF/EX,ID/EX,EX/MEM,MEM/WBo

A.1.5流水线的基本性能

流水线增大了CPU的指令吞吐量——即单位时间完成的指令条数,但是它没有减少指

令各自的执行时间。实际上,流水线技术经常要对流水线附加一些控制,因而增加了开销,

随之使单条指令执行时间略有增加。吞吐量的增大意味着程序运行得更快,总的执行时间变

短,尽管没有任何一条指令的执行变快!

由于流水线没有真正减少每条指令的执行时间,这就限制了流水线的深度,关于这个问

题,我们将在下一节中讨论。除了流水线延迟引起的限制,流水节拍的不平衡和流水线的附

加开销也引入了某些限制。流水节拍不平衡引起的限制,是因为时钟不能快于最慢的流水节

拍。流水线的附加开销引起的限制则是因为流水线寄存器的延迟和时钟偏移。流水线寄存器

或锁存器对时钟周期增加了启动时间和传输延迟,时钟偏移也有这种作用。时钟偏移是指在

时钟到达的时候任何两个寄存器之间的延迟,而时钟偏移的存在也导致了对时钟周期的限

制。一旦时钟周期很小,以至于与时钟偏移和锁存器附加开销相当时,流水就没有用处了,

因为在一个时钟周期内没有足够时间用于有效的工作了。对此问题感兴趣的读者可以参考

Kunkel和Smithll986Jo就像我们在第三章中看到的那样,这种系统开销影响了Pentium4与

Pentiumlll的性能提高。

例题A.1:让我们考察上一节的非流水型机器。假设它的时钟周期是1纳秒,ALU操

作和分支操作需要4个时钟周期,存储器操作需要5个时钟周期。以上操作的比例相应为

40%、20%、40%。假设由于存在时钟偏移和启动时间,时钟周期增加了0.2纳秒,并忽略

延迟的影响,那么该流水线的加速比是多少?

解:在非流水线的机器上,指令平均执行时间是:

指令平均执行时间=时钟周期X平均CPI

=1纳秒义((40%+20%)*4+40%*5)

=1纳秒X4.4

=4.4纳秒

在流水线方式下,时钟周期变慢为1+0.2,即1.2纳秒,这就是指令平均执行时间。于

是加速比为:

流水线加速比=非流水线指令平均执行时间/流水线指令平均执行时间

=4.4ns/1.2ns=3.7

0.2纳秒的附加开销对流水线的效率附加了限制。如果不同时钟周期下附加的开销相同,

那么,使用Amdahl法则就可以知道附加开销限制了加速比不能无限增大。

如果在流水线中执行的每条指令之间都是互相不相关的,那么这个简单的RISC指令系

统可以很好的在该流水线结构中执行。

A.2流水线的主要障碍一一流水线冒险

有一些称为“冒险”的情形,它使得指令流中下一条指令无法在设计的时钟周期执行,

这些冒险将会降低流水线可能获得的理想性能。有三类冒险:

1.结构冒险:当硬件在指令重叠执行中不能支持指令所有可能的组合时发生的资源冲

突。

2.数据冒险:在同时执行的儿条指令中,一条指令依赖于前一条指令的数据,却得不

到时发生的冒险。

3.控制冒险:流水线中的分支指令或其他改写PC的指令造成的冒险。

流水线中的“冒险”引起流水线暂停。要消除冒险就要求流水线中的部分指令正常处理,

而部分指令可以被延迟执行。对本章中讨论的流水线,当一条指令被暂停后,流水线中所有

该指令之后的指令都会被暂停。流水线中该指令之前的指令还是正常执行,否则冒险就不可

能被消除。这种处理的结果就是:当发生流水线暂停时,就不能再启动新的指令。在本节我

们将考察几个流水线如何被暂停的例子。别担心,它们不象听起来那么复杂。

A.2.1有暂停的流水线性能

暂停会使流水线性能比理想情况差,我们用上一节的一个公式,通过一个简单的等式来

看实际情况下流水线的加速比。

非流水线指令平均执行时间

流水线加速比=

流水线指令平均执行时间

非流水CPIX非流水时钟周期

流水CPIX流水时钟周期

非流水CPI非流水时钟周期

X

流水CPI----流水时钟周期

需要注意的是,流水线可以看作是减小了CPI或减小了时钟周期的长度。我们可以按照

传统的比较流水线的方法来使用CPI。流水线机器的理想CPI差不多总是1,因此流水线的

实际CPI是:

流水线CPI=理想CPI+每条指令的暂停周期数

=1+每条指令的暂停周期数

如果忽略流水线的附加开销,并假设流水节拍调整得很好,则两台机器的时钟周期可以

相等,因此

加速比—非流水线CPI

1+每条指令的流水线暂懒期数

一种简单的情况是所有指令执行时需要的时钟周期数都相等,于是我们必须平衡它们的

流水节拍数(又称为流水线深度)。此时非流水CPI等于流水线节拍数,因此

加速比=流水线深度

1+每条指令的流水线暂停周期数

如果没有引入流水线暂停,流水线的性能可以随深度的增加而明显改善。

换个角度,如果我们把流水线看作是减小了时钟周期的长度,那么可以象流水线机器」

样假设非流水机器的CPI是1。因此有:

非流水线CPI非流水线时钟周期数

流水线加速比=

流水线CPI流水线时钟周期数

1非流水线时钟数

=-------------------------------------------------------------------------X------------------------------------------

1+每条指令的流水线暂停周期数流水线时钟周期数

对于流水节拍已经很好地平衡,而且没有附加开销的情况,非流水机器的时钟周期长度

与流水线机器的时钟周期长度之比等于流水线深度:

非流水线时钟周期

流水线时钟周期数=

流水线深度

非流水线时钟周期数

流水线深度=

流水线时钟周期数

于是有:

--------------------------------------------------------------------------X-----------------------------------------

1+每条指令的流水线暂停周期数流水线时钟周期数

1+每条指令的流水线暂停周期数

因此,当没有暂停时,加速比等于流水节拍数,与理想情况吻合。

A.2.2结构冒险

当处理器进行流水处理的时候,指令的重叠执行要求功能部件能够流水,而且资源重复

设置,以便流水线中的指令能自山组合。如果因为资源冲突而无法使用某种指令的组合,那

么这台机器就被称做是有结构冲突的。

最常见的结构冲突出现在部分功能部件没有充分流水的时候,此时•系列使用该部件的

指令不能按照每个时钟周期前进一拍的速率流水。另一种常见的结构冲突是因为某些资源没

有充分重复设置,于是不能足以让流水线中的若干条指令同时执行。例如,一台机器只有一

个寄存器堆写入端口,但在某些情况下,流水线可能要求在一个时钟周期内写入两次,这将

产生一个结构冒险。

当有一系列指令遇到这种冒险时,流水线将暂停其中的一条指令,直到所需的功能单元

能够使用为止。这种暂停将把CPI从理想值1增大。

某些流水线机器的指令和数据共享同一个存储器,结果是当一条指令包含有数据引用

时,它将与下一条指令的取指令冲突,如图A.4所示。为了消除这种冲突,当需要访问数据

存储器时就把流水线暂停一个时钟周期。暂停通常叫作“流水气泡”或者“气泡”,因为它

在流过流水线的过程中只是占据了空间而不做实际有效的工作。当讨论数据冒险时我们还会

看到另一种暂停。

设计者通常不是每次都画出流水线的数据通路,而是用一个只有流水节拍名称的简化图

来表示暂停,如图A.5。表示暂停的方法是当没有实际操作时就标出该周期,并简单的将指

令3右移(将指令3的启动和结束均延后一个时钟周期)。流水气泡的后果就是在它流过流

水线的过程中占据资源。

时钟

指令12345678910

Load指令IFIDEXMEMWB

指令i+1IFIDEXMEMWB

指令i+2IFIDEXMEMWB

指令i+3暂停IFIDEXMEMWB

指令i+4IFIDEXMEMWB

指令i+5IFIDEXMEM

指令i+6IFIDEX

图A.5单端口存储器的load操作引起控制冒险时的流水线暂停。load指令有效地窃取了

一个取指令周期,于是流水线被暂停。在时钟周期4没有指令进入流水线(正常情况

F应该是指令3进入流水线)。因为读入的指令被暂停,所有该指令之前的指令都能

够正常处理。暂停周期将流过流水线,结果是在时钟周期8没有任何指令执行完成。

有时,把这种流水线图表画成“暂停”占据一整行,指令3移到下一行。两种情况的

效果是一样的,因为指令3到时钟周期5才开始执行。我们采用上面的图只是为了节

省空间。

例题A.2:让我们看一下load控制冒险造成的影响有多大。假设数据引用占指令的40%,

在忽略控制冒险的前提下流水线的理想CPI是1。若有控制冒险机器的时钟速率是无控制冒

险机器时钟速率的1.05倍。假设没有别的性能损耗,两种流水线哪个更快?快多少?

解:该题有多种的解法,大概最简单的方法是计算两种机器的指令平均执行时间:

指令平均执行时间=CPIX时钟周期长度

由于没有暂停,理想情况下的平均指令执行时间就是时钟周期长度。有控制冒险的机器

指令平均执行时间是:

指令平均执行时间=CPIX时钟周期长度

=(1+O.4X1)X理想时钟周期长度

1.05

=L3X理想时钟周期长度

显然,没有结构冒险的机器更快。用指令平均执行时间来计算,没有结构冒险的机器大

约要快0.3倍。

对该结构冒险的一种改进方案是为指令提供单独的存储器,具体的是把cache分为指令

cache与数据cache,或者用一个单独的缓冲站来保存指令,称为指令缓冲校。这两种方法均

在第五章中讨论。

当别的因素相同时,没有结构冒险的机器CPI较小。那么为什么设计人员允许结构冒

险存在呢?有两个原因:降低成本或者减少部件延迟。对于各种功能部件,实现流水或者复

制功能部件有可能使成本过高。例如,每个周期都允许访问指令和数据cache的机器(为了

防止上例中的结构冒险)需要两倍的内存带宽,也需要更高带宽的管脚。类似的是,完整流

水的浮点乘法器需要很多逻辑门。如果结构冒险不经常出现,那么消除结构冒险的成本就显

得太高了。

A.2.3数据冒险

流水线的•个主要影响是通过重叠执行指令来改变指令的相对执行时间。当流水线改变

操作数的读写顺序,使得顺序与非流水时的指令序列不同时,就会出现数据冒险。请看下面

的指令如何在流水线中执行:

DADDRI,R2,R3

DSUBR4,R5,RI

ANDR6,Rl,R7

ORR8,RI,R9

XORRIO,RI,RU

DADD指令后的所有指令都用到DADD指令的执行结果。如图A.6所示,DADD操作在WB

节拍写R1,而DSUB操作在ID节拍读R1,这就称为数据冒险。除非采取预防措施,否则SUB

操作读出的将是错误的值,并错误到使用它。实际上,DSUB操作使用的值甚至是不确定的:

尽管我们可能认为DSUB使用的是DADD之前R1的值,但不定总是这样。如果在DADD与

DSUB之间发生了一次中断,DADD指令的WB节拍就可以完成,于是R1提供给DSUB操作的就

是DADD操作的结果。这种不确定性显然,难以容忍的。

,时间(时钟周期)

Time(inclockcycles)

(

us

go

nu

wj

c

M

o

-

U

U3

ex

eE

SJ

JO

o.

图A.6DADD操作的结果在后面三条指令中都使用,这就产生了数据冒险,因为寄存器在

那三条指令读之后才被DADD操作写入。

AND操作也受该冒险的影响,从图A.6可见,写R1直到时钟周期5才能完成。于是,

在时钟周期4读寄存器的AND操作取出的结果是错误的。

XOR操作得到了正确执行,因为它读寄存器是在周期6,此时R1已被正确写入。OR操

作也可以没有冒险,这只需要使用一个已经在流水线图表中画出的简单技巧,就是在前半个

周期读寄存器堆,在后半个周期写。这种技巧在前面的图中通过在寄存器堆周围画的虚线框

来表示。

卜面介绍用来消除SUB操作和AND操作数据冒险的技巧。

A.2.4使用旁路减少数据冒险引起的暂停

图A.6的问题可以用一个简单的硬件技术来解决,这种技术称为“旁路”(也称为直接

通路,有时也叫做短路),其关键是注意到了DSUB操作是在DADD操作产生了结果后才

真正使用这个结果的。如果把DADD的结果从EX/MEM寄存器移到DSUB需要的地方,

即ALU的输入锁存器,那么就没有必要引入暂停了。通过以上观察可知旁路的工作流程为:

1.从EX/MEM流水线寄存器送入到ALU的结果总是反馈到ALU的输入锁存器。

2.如果旁路硬件检测到靠前的ALU操作写入寄存器堆时;是使用当前ALU操作的结

果作为源操作数,那么控制逻辑就选择旁路结果作为ALU的输入,而不是从寄存

器堆读出源操作数。

请注意,在使用旁路时.,如果DSUB操作被暂停,那么DADD操作将完整执行,于是

没有必要激活旁路。当这两个操作之间有一个中断时也是如此。

象图A.6所示的那样,我们需要旁路的操作数可能不止是来自最近的操作,而且来自前

面三个周期启动的操作。图A.7就表明了这一点,并注明了寄存器读写的时刻。执行这条指

令序列不需要暂停。

一-------1时间(时钟周期)

Time(incbckcycleej----------------------------------------------------------------------------------------------------------------------------►

(

g

u

o

q

o

M

g

c

_u

』)

P8

0J

u

o

=

n

<x>

aE>

e

IM

图A.7一些依赖ADD操作结果的指令使用旁路来避免数据冒险。从EX/MEM和MEM/WB

流水线寄存器到SUB和AND的输入被旁路到ALU部件的第一个输入端。OR操作

通过旁路接收数据,这只需要象图中虚线画的那样对寄存器在前半个周期写、后半个

周期读。请注意旁路结果可以从ALU部件的任一个输入端进入,实际上ALU可以

使用从同一个或不同流水线寄存器来的旁路输入。例如,对指令ANDR6,R1,R4就是

这样。

旁路思想可以一般化,即把结果直接送到需要它的功能部件:一个结果能够从一个部件

的输出直接送到另一个部件的输入。如下面的序列:

DADDRI,R2,R3

LDR4,O(R1)

SDR4,12(R1)

为了避免在该指令序列中引起暂停,就需要把ALU和内存单元的输出结果从流水线寄存

器的输出旁路到ALU和数据存储器的输入。图A.8画出了该序列的所有旁路。

,。

):于

结了端同一启寄在

的为画列。有从

出不后它

d,有序据要R

a输形之O管

o外把没令数需作尽

L指情为

。此与中要路操,

。的的需d因了

路这图旁a,

端((面作就o晚

旁种l理

入端作下操时太

的U这于同

输入看L始得

数操A,L

器输请开对I到

作U的示L

储的L。期。A来

操A馈所

存它决周9的到据

该个反.

的到解该A现路数

了一来带实

它路在图旁的

出前法与B法

存旁U如器入

画保端于方它S无

图。存送

于出赖的。而本,

本险寄

用输依路示,冒根B作

,eW。

到的r旁表据据员/操

数ot9MB得

路件s用.数数人EU

作AM获

旁部果采到的计S

操以图设从才

端U如得成对

个L用刻时

出。可能造机而

一A)。险径立束

输,都才作算。

要别停险路)计果题结

器址冒579操

需储区暂冒RRR据期d是结问在

地据)2a

拍存的有免据R,,,数周o这把的却

^(IIIMl

et节没避数0RRR线,它殊,

c从作数E

yM并以的水M由路为据

c拍

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论