6.4 节介绍的超流水线技术就采用了将流水段更细、更均匀地划分的思想。

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

<!-- page: 214 -->

指令流水线
表 6.1 Pentium Ⅲ功能部件性能
操 作 类 型
执行周期数
发射时间
操 作 类 型
执行周期数
发射时间
整数加减法
1
1
浮点数乘法
5
2
整数乘法
4
1
浮点数除法
38
38
整数除法
36
36
取数(cache 命中)
3
1
浮点数加减法
3
1
存数(cache 命中)
3
1
(4)重排序缓冲(reorder buffer,ROB)。用于保存已完成的指令结果,等待在可能时写
回寄存器堆。功能部件一旦完成操作,则将结果同时送其他等待该结果的保留站和ROB
中。指令结果也可在 ROB中被转发。当指令发射时,其源操作数可能是其他指令的运算
结果,因而可能正在寄存器堆或 ROB中,此时可立即将操作数复制到相应的保留站中;若
操作数不在寄存器堆或ROB中,则一定会在某个时刻由一个功能单元计算出来,硬件通过
定位该功能单元,将结果从旁路转发到相应的保留站。
动态多发射流水线的执行模式有3种:按序发射、按序完成;按序发射、无序完成;无序
发射、无序完成。下面用一个例子来说明这3种执行模式的实现思想。
例6.5 假定某个2-发射超标量处理器的指令执行过程分为取指(IF)、译码(ID)、执行
(Ex)、写回(WB)4个阶段。其中,IF、ID和 WB阶段在一个
时钟周期内完成,在这3个阶段可同时有两条指令执行。Ex
阶段有3个执行部件:①访存部件用于完成数据 cache 访问,
需要1个时钟周期;②整数 ALU 用来完成 ALU 操作,需两
个时钟周期;③整数乘法器用来完成乘法运算,需3个时钟
周期。整数 ALU和乘法器均采用流水化方式执行。假定有
$1.A
i2 add
$2.$2,$1
i3 add $3,$3,$4
i4 mul $4,$5,$4
i5 lw
i6
$6,$6,$7
一个如图 6.29 所示的指令序列在该处理器上执行,试说明按
图6.29 一个 MIPS指令序列
3种模式(按序发射、按序完成;按序发射、无序完成;无序发射、无序完成)执行指令的过程,
并说明各需要多少个时钟周期。
解:显然,取指阶段总是按顺序进行,并且可以保证一次取两条指令。因此,下面给出
的示意图中只考虑译码、执行和写回3个阶段的情况。根据题意可知,某个时钟周期内,处
理器中最多有两条指令在取指、两条指令在译码、一条指令在访存、两条指令进行ALU 操
作、3条指令执行乘法运算、两条指令进行写回操作,即最多可有12条指令正在被处理。但
是这只是理想的情况,实际上指令序列中指令的排序不一定正好和功能部件一一对应,而且
指令之间还存在相互关联,因此,很多情况下,并不是每个功能部件的每个流水段都能被
充满。
对图6.29所示的指令序列进行分析后可知:指令il和i2之间、i3和i4之间、i5和i6之
间具有数据相关性,其中i1和i2之间是$1被写后再读,称为RAW(read after write);i5和
i6之间的$6既是RAW,又是写后写WAW(write after write)。所以不管采用哪种模式,
在这两处的两条指令都不能同时发射,并要按序完成。i3和i4之间的$4是读后写WAR
(write after read),因此,必须保证在i3读$4之前,i4不能写$4。
图6.30(a)~(c)分别给出了“按序发射、按序完成”“按序发射、无序完成”“无序发射、无
第6章
197


<!-- page: 215 -->

计算机组成与系统结构(第3版)
198
序完成”3种指令执行模式下指令序列的执行过程(注:因为一共只有两条乘法指令,故图
中乘法部件流水线未充满)。
译码阶段
il
i2
i2
i3
i4
i5
i6
i6
执行阶段
il
i2
i2i3i4
i5
i3i4
[i5]
i4i6
[i5]
i6
i6
ld/st ALU 乘法器
写回阶段 时钟
2
3
il
4
时钟1 2 3
### 4 5
10
5
il IF ID ExWB
i2 6
i2 IF ID
Ex ExWB
i3
7
i3 IF
ID Ex Ex WB
i4
i4 IF
8
ID Ex Ex Ex WB
i5
9
i5 IF
ID Ex
WB
i6
10
i6 IF
ID
Ex Ex ExWB
(a)按序发射、按序完成
译码阶段
il
i2
i2
i3
i4
i5
i6
i6
执行阶段
il
i2
i2 i3|ii4
is
i3i4
i4 i6
i6
i6
ld/st ALU 乘法器
写回阶段 时钟
2
3
il
4
5
i2 6
i3
i5
7
i4 8
9
i6
10
时钟 1 2 3 45 6 7 8 9 10
il IF ID ExWB
i2 IF ID
Ex ExWB
i3 IF
ID Ex Ex WB
i4 IF
ID Ex Ex Ex WB
i5 IF
ID Ex WB
i6 IF
ID
Ex Ex ExWB
(b)按序发射、无序完成
译码阶段
il
i2
i3
i4
i5
i6
执行阶段
il
1i2
i4
is i2i3 i4
i3 4i6
i6
i6
ld/st ALU 乘法器
写回阶段 时钟
2
3
il
4
5
i2
i5 6
i3
i4 7
8
i6
9
10
时钟1
il IF
i2 IF
i3
i4
### 2 34 5 6 7 8 9
ID Ex WB
ID
Ex ExWB
IF ID
ExEx WB
IF ID Ex Ex Ex WB
i5 IF ID ExWB
i6 IF ID
Ex Ex Ex WB
(c)无序发射、无序完成
图6.30 3种执行模式下的指令序列执行过程
图6.30(a)是“按序发射、按序完成”执行模式,从图中可看出,所有阶段都是按顺序进行
的。因为在第3时钟内i2不能和il同时发射,所以i2在译码阶段被阻塞一个周期。为了
按序完成,虽然i5在时钟6已经完成,但一直要推迟到i4写回后的第9时钟才写回。完成
上述6条指令共需10个时钟周期。
图6.30(b)是“按序发射、无序完成”执行模式,从图中可看出,在执行阶段,指令的发射
是按顺序进行的,而在写回阶段则是无序的。i5在时钟6已经完成,它和i3、i4没有相关性,
所以可先于i4写回。这种方式也需10个时钟周期完成指令,但访存部件在第7和第8时
钟已空出来,可被其他指令使用。


<!-- page: 216 -->

指令流水线
图6.30(c)是“无序发射、无序完成”执行模式,从图中可看出,在执行阶段,指令的发射
是无序进行的。在无序发射的超标量处理器中,译码后的指令被存放在一个“指令窗口”缓
冲中,等待发射。当所需功能部件可用,并且不会因为冲突或相关性阻碍指令的执行时,就
从指令窗口发射,与取指和译码的顺序无关。在时钟周期4,由于乘法器空闲,所以i4在i3
之前先被发射。在写回阶段指令的完成也是无序的。实际上,只要保证 i1和i2之间、i5和
i6 之间的发射和完成是按序的即可。这种方式下,因为可以将无关指令提前发射到空闲部
件执行,所以往往能加快程序的执行。此例中,最终只需9个时钟周期,比上述两种方式快
一个时钟周期。
上述例子说明了处理器如何动态调度指令的过程。前面提到,如果编译器先进行静态
调度,尽量消除依赖关系,可使流水线达到较高的动态发射速率。对于上述例子给出的指令
序列,如果编译器先静态调度指令序列,使i5和i6调到最前面,并使i1和i2之间、i3和i4
之间隔开距离,那么在“无序发射、无序完成”执行模式下,可以使执行时间缩短为8个时钟
周期,如图6.31所示。
时钟
1
2
3
4
5
6
7
8
il:Iw $6,B
IF
ID
Ex
WB
i2: mul $6,$6,$7
IF
ID
Ex
Ex
Ex
WB
i3;1w $l,A
IF
ID
Ex
WB
i4:add $3,S3,S4
IF
ID
Ex
Ex
WB
i5: add $2,$2,$l
IF
ID
Ex
Ex
WB WB
i6:mul $4,$5,54
IF
ID
Ex
Ex
Ex
图6.31 静态调度后的无序发射、无序完成
动态调度可在流水线发生阻塞时,动态地提前执行无关指令。前面说过,超标量处理器
除了需要编译器进行静态指令调度外,还要依靠处理器进行动态调度。因为并不是所有阻
塞都能事先由编译器确定。例如 cache 缺失是编译器无法事先预见的阻塞,只有在动态执
行时,才能发现是否发生了cache缺失;此外,动态分支预测也需要根据执行的真实情况进
行预测。
采用动态调度可使硬件将处理器细节屏蔽起来,不同处理器的发射宽度、流水线延时等
可能不同,流水线的结构也会影响循环展开的深度。通过动态调度使得处理器细节屏蔽起
来,软件发行商无须针对同一指令集的不同处理器发行相应的编译器,并且以前的代码也可
在新的处理器上运行,无须重新编译。
*6.4.3 Pentium 4 处理器的流水线结构
Pentium 4是一种“CISC 壳、RISC核”的体系结构。它利用“踪迹高速缓存”(trace
cache,TC)来实现指令cache。在TC中存放指令解码后的微操作(μop),每个μop 相当于
一条 RISC指令。Pentium 4处理器对μop的执行采用了 20级超流水线技术,使流水线执
行效率得到很大提高,但更多的流水线级数使得分支转移预测错误时带来更大的性能损失,
因而,Pentium 4采用了静态和动态两级分支预测,大大提高了预测正确率。图6.32 是
Pentium 4处理器的逻辑结构示意图。
Pentium4处理器主要包含两部分:处理器核心结构和 L2 cache。这两部分集成在同
第6章
199


<!-- page: 217 -->

计算机组成与系统结构(第3版)
200
64
动态分支
I-TLB和指令预取部件
预测器 BTBI
前端总线
指令译码器
总线
trace cache
trace cache
微代码 ROM
接口部件
(12kμop)
分支预测器
预取
控制逻辑
微操作(μop)缓冲队列
L2 cache
资源分配、寄存器换名、微操作排队/调度/分派部件
(48GBps)
整数寄存器文件
浮点寄存器文件
慢 ALU 2x ALU 2xALU 2xAGU 2xAGU
浮点加减[
浮点存
SSE/
浮点乘
MMX
复杂
简单
简单
存数
取数
浮点取
SSE2
浮点除
指令
指令
指令
地址
地址
L1 D-cache和 D-TLB(8KB,4路)
256
图6.32 Pentium 4处理器的逻辑结构
一个半导体基片上,并都以主频速度运行。总线接口部件和预取控制逻辑用来实现 L2
cache 通过前端总线与处理器片外进行信息交换。L2 cache 中包含了从主存取来的数据以
及指令,采用每行128字节的8路组相联结构,在处理器内部分别和L1数据 cache以及指
令预取部件交换数据和指令。
处理器核心部分主要包括指令预取部件、指令译码器、trace cache、微代码 ROM、动态
分支预测器 BTB1和BTB2、微操作缓冲队列、资源分配、寄存器换名、微操作排队/调度/分
派部件、L1 数据 cache、两个 TLB、整数与浮点寄存器文件,以及9个功能执行部件。
指令预取部件负责从主存或1.2 cache取出指令送指令译码器;指令译码器负责将简单
指令翻译成一个或多个被称为微操作(μop)的RISC指令。转换得到的μop被送到TC中。
对于复杂指令,由于对应的微操作太多,通过硬件转换比较困难,所以直接送 TC,由TC从
微代码 ROM中直接取对应的 μop 序列。
当μop送到TC后,处理器就按“无序发射、无序完成”的 20 级超标量超流水线方式执
行,如图6.33所示。
μop队列
TC 存取
(含预测)
5
功能单元队列
ROB资源
分配、
调度和
寄存器
分派
改名
4
5
寄存器
文件的
存取
2
执行
重排序缓冲
ROB
结果
提交
3
1
2
### 3 4
5
6
TC下指针TC取
驱动|分配
### 8 9
### 10 I
12
13
14
换名
排队调度调度调度分派分派
### 15 16
### 17 18
### 19 20
支测
分3
寄存器执行标志
驱动
检
5级
4级
5级
2级 1级
3级
图6.33 Pentium4 μop的20级流水线


<!-- page: 218 -->

指令流水线
Pentium 4的20级μop流水线分6大步骤,分别用5、4、5、2、1和3个时钟周期完成,共
20个时钟周期。因为驱动段不完成任何操作,只是用于芯片内传输信号的驱动,使其保证
长距离传输,所以,实际功能段只有11个,下面分别介绍这些功能段。
1)TC下指针(TC next IP)
从TC取μop的操作使用的是TC自身的指针,该段主要用来计算下次从 TC取 μop
时的指针。经过指令译码器,指令被转换为μop序列,源源不断地送到TC中。TC中μop
按一条条踪迹(trace)存放,分支μop对应的不同分支中一段连续μop序列构成一个踪迹。
通常沿一个踪迹顺序取,遇到一个分支μop时,由动态预测器BTB2预测将沿哪条踪迹顺序
取。如果被预测到的踪迹不在TC时,则通知指令预取器从L2中取指令并译码。
2)TC取(TC fetch)
根据TC指针从TC中取出μop,送到μop队列。在取μop时,若取到的是从译码器直
接送来的未转换为μop的复杂指令,则需要到微代码 ROM中取出该复杂指令对应的μop
序列。通常,一条简单指令最多包含4个μop,而复杂指令则包含5个或5个以上的μop.
微代码 ROM实际上是一个微操作控制器。
3)分配(allocate)
该段用来为μop的执行分配所需的资源,这些资源包括ROB、物理寄存器或load/store
缓冲器等,但不包括功能执行单元。ROB用来记录μop的执行状态,共有126项,所以最多
可以有126个μop同时在流水线中。一个时钟周期内分配器可同时为3个μop分配资源,
只要有一个 μop所需资源不能满足,则分配器延迟操作,直到3个μop都满足为止。
4)换名(renaming)
在 Pentium 4内部,整数和浮点数各有128个物理寄存器,寄存器换名操作将用户可见
的外部逻辑寄存器换成内部的物理寄存器,换名时,要确定是真实依赖还是名字依赖。名字
依赖时,可用不同的物理寄存器替换相同的逻辑寄存器。
5)μop 排队(queuing)
有两个队列,一个是存/取队列,用于存储器操作;另一个是整数/浮点数队列,用于除存
储器操作以外的其他所有操作。根据资源分配情况进行寄存器换名后,按FIFO的次序分
别送这两个队列保存,直到被调度出去。因此,队列内部是有序的,但队列之间的μop没有
顺序关系。
6)μop调度(scheduling)
有4个调度器,其中一个存储器操作调度器用于对存/取队列中的μop进行调度,其他
3个都是为整数/浮点数队列中的μop进行调度。调度器必须检测 μop流的数据相关性,以
确定μop的先后次序。
7)分派(dispatching)
根据调度结果,将那些没有数据相关性或有相关性但所有源操作数都已就绪的μop分
派出去,这里的分派是指开始启动读浮点/整数寄存器文件中的内容。源操作数就绪是指对
应ROB中的状态表明结果已经在寄存器文件中。
第6章
201


<!-- page: 219 -->

计算机组成与系统结构(第3版)
202
8)寄存器文件(register file)
被分派的μop在该阶段读取物理寄存器中的源操作数。若源操作数是存储器数据,则
要从寄存器文件中的旁路网络由L1-D cache 读取。
9)执行(execute)
将所读出的源操作数送到相应的功能部件执行。每个功能部件也采用流水线方式,因
而所需时钟周期数不同。一共有9个功能部件,可同时工作。其中有两个高速整数ALU
(每个时钟周期进行两次操作),用于完成简单的整数运算(如加/减法);一个慢速整数ALU
(需要多个时钟周期才能完成一次操作),用于完成整数乘、除运算;两个地址生成部件
(AGU),用于计算操作数的有效地址,所生成的地址分别用于从内存取操作数或向内存保
存操作结果;一个运算部件用于完成浮点操作数地址的计算;一个运算部件用于完成浮点加
减、乘法和除法运算;一个运算部件用于执行流式SIMD处理(SSE/SSE2/SSE3指令);一
个运算部件用于完成多媒体信号处理(MMX指令)。注意,在功能部件中执行的是微操作,
而不是指令。
10)标志(flags)
该段用于建立标志信息(如 ZF、CF等),并将执行结果写入物理寄存器。
11)分支检测(branch check)
用于对 BTB2中的分支预测进行实际确认,并根据确认结果修改BTB2中该项的历史
位。若预测不正确,则还要清洗(冲刷)被错误执行的μop序列及其执行结果。
6.5本 章 小 结
指令流水线的基本思想是,将每条指令的执行规整化为若干同样的流水阶段,每个流水
阶段的执行时间以最慢的流水段所需时间为准,等于一个时钟周期。流水线段之间需要加
流水段寄存器,用以记录所有流到后面阶段要用的信息。因为不同指令的功能不同,因此并
不是每条指令都能划分成相同多个阶段。按最复杂指令所需规划流水段后,有些指令的某
些流水段执行的可能是空操作。不同流水阶段的功能也可能不同,并不是每个流水段所花
的时间都一样长,按最长时间流水段设置时钟周期后,某些流水段中可能会有时间浪费。随
着流水线深度的增加,流水段寄存器的额外开销比例也增大。指令在资源冲突、数据相关或
控制相关时会发生流水线阻塞,因而影响指令执行效率。
指令级并行技术通常有超流水线、多发射流水线和动态流水线调度等措施。超流水线
指将指令执行过程划分得更细,采用更多级数的流水线,着重在于时间上并行。多发射流水
线(超标量处理器)同时发射多条指令,并由多个功能部件并行执行,着重在于空间上并行。
动态多发射指由处理器硬件在指令执行时动态确定哪些指令被同时发射,如果没有可以被
同时发射的指令或遇到指令相关时,则某些流水段空闲。超标量处理器多指采用动态多发
射流水线的处理器,并且通常会结合采用动态流水线调度技术。采用动态流水线调度的处
理器通过指令相关性检测和动态分支预测等手段,投机性地不按指令顺序执行。当发生流
水线阻塞时,根据指令的依赖关系,动态地到后面找一些没有依赖关系的指令提前执行。在
动态流水线调度下,指令可以乱序执行。


<!-- page: 220 -->

指令流水线
习题
1.给出以下概念的解释说明。
指令流水线
流水线深度
指令吞吐量
流水段寄存器
流水线阻塞
控制冒险
流水线冒险
结构冒险
数据冒险
气泡
空操作
转发(旁路)
分支预测
静态预测
动态预测
分支延迟损失时间片
静态多发射
动态流水线调度
乱序执行
写后写(WAW)相关
分支延迟槽
指令级并行(ILP)
超流水线
动态多发射
超长指令字(VLIW)
超标量流水线
按序发射
无序发射
重排序缓冲(ROB)
按序完成
无序完成
写后读(RAW)相关
2.简单回答下列问题。
(1)流水线方式下,一条指令的执行时间缩短了吗?程序的执行时间缩短了吗?
(2)具有什么特征的指令集易于实现指令流水线?
(3)流水线处理器中时钟周期如何确定?单发射流水线处理器的CPI为多少?每个时钟周期一定有
一条指令完成吗?为什么?
(4)流水线处理器的控制器实现方式更类似于单周期控制器还是多周期控制器?为什么?
(5)为什么要在各流水段之间加寄存器?各流水段寄存器的宽度是否都一样?为什么?
(6)你能列出哪几种流水线被阻塞的情况?
(7)超流水线和多发射流水线的主要区别是什么?
(8)静态多发射流水线和动态多发射流水线的主要区别是什么?
(9)为什么说 Pentium4是“CISC壳、RISC 核”结构?
3.假定在一个5级流水线(如图6.5所示)处理器中,各主要功能单元的操作时间为:存储单元一
200ps;ALU和加法器-150ps;寄存器堆读口或写口—50ps。请问:
(1)若执行阶段Ex所用的ALU操作时间缩短20则能否加快流水线执行速度?如果能,能加快多
少?如果不能,为什么?
(2)若 ALU 操作时间增加20则对流水线的性能有何影响?
(3)若ALU 操作时间增加40则对流水线的性能又有何影响?
4.假定某计算机工程师想设计一个新的CPU,一个典型程序的核心模块有一百万条指令,每条指令执
行时间为100ps。请问:
(1)在非流水线处理器上执行该程序需要花多长时间?
(2)若新 CPU采用20级流水线,执行上述同样的程序,理想情况下,它比非流水线处理器快多少?
(3)实际流水线并不是理想的,流水段之间的数据传送会有额外开销。这些开销是否会影响指令执行
时间和指令吞吐率?
5.假定最复杂的一条指令所用的组合逻辑分成6部分,依次为A~F,其延迟分别为80ps、30ps、60ps、
50ps、70ps、10ps。在这些组合逻辑块之间插入必要的流水段寄存器就可实现相应的指令流水线,寄存器延
迟为20ps。理想情况下,以下各种方式所得到的时钟周期、指令吞吐率和指令执行时间各是多少?应该在
哪里插入流水段寄存器?
(1)插入1个流水段寄存器,得到一个两级流水线。
(2)插入2个流水段寄存器,得到一个三级流水线。
(3)插入3个流水段寄存器,得到一个四级流水线。
第6章
203
(4)吞吐量最大的流水线。


<!-- page: 221 -->

计算机组成与系统结构(第3版)
204
6.以下指令序列中,哪些指令对之间发生数据相关?假定采用“取指、译码/取数、执行、访存、写回”5
段流水线方式,如果不用“转发”技术,需要在发生数据相关的指令前加入几条nop指令才能使这段程序避
免数据冒险?如果采用“转发”是否可以完全解决数据冒险?不行的话,需要在发生数据相关的指令前加
入几条 nop指令才能使这段MIPS程序不发生数据冒险?
addu
addu
1w
add
$s3,5s1,Ss0
st2,$s3,§s3
St1, 0($t2)
5t3,5t1,$t2
7.假定以下MIPS指令序列在图 6.18所示的流水线数据通路中执行:
addu
Subu
lw
add
add
ss3, 5s1,$s0
St2,$s3,$s3
stl, 0(5t2)
5t3,5t1, $t2
$t1, Ss4,Ss5
请问:
(1)上述指令序列中,哪些指令的哪个寄存器需要转发?转发到何处?
(2)上述指令序列中,是否存在 load-use数据冒险?
(3)第5周期结束时,各指令执行状态是什么?哪些寄存器的数据正被读出?哪些寄存器将被写入?
8.假定有一个程序的指令序列为“lw,add,lw,add,⋯”。add指令仅依赖它前面的lw指令,而lw指令
也仅依赖它前面的add指令,寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内独立工
作。请问:
(1)在带转发的5段流水线中执行该程序,其CPI为多少?
(2)在不带转发的5段流水线中执行该程序,其CPI为多少?
9.在一个带转发的5段流水线中执行以下MIPS程序段,怎样调整指令序列使其性能达到最好?
lw
52, 100($6)
add 52,52,53
1w
§3, 200($7)
add 56, 54,57
sub
$3, 54,§6
1w
§2,300(58)
beq $2,S8,Loop
10.在一个采用“取指、译码/取数、执行、访存、写回”的5段流水线中,若检测结果是否为“0”和将转移
目标地址(Btarg和Jtarg)送 PC的操作在执行阶段进行,则分支延迟损失时间片(即分支延迟槽)为多少?
在带转发的5段流水线中,对于以下MIPS指令序列,哪些指令执行时会发生流水线阻塞?各需要阻塞几
个时钟周期?
Loop: add
add
add
1w
bne
add
j
$t1,ss3,ss3
$t1, st1,st1
st1,st1, 5s6
$t0, 0($t1)
$t0,$s5,Exit
5s3,5s3,584
Loop
Exit:


<!-- page: 222 -->

指令流水线
11.假设数据通路中各主要功能部件的操作时间是:存储单元为200ps;ALU和加法器为100ps;寄存
器堆读口或写口为50ps。程序中指令的组成比例为:取数为25??存数为10??ALU为52??分支为
11??跳转为2??假设控制单元和传输线路等延迟都忽略不计,则以下实现方式中哪个更快?快多少?
(1)单周期方式。每条指令在一个固定长度的时钟周期内完成。
(2)多周期方式。时钟周期取存储单元操作时间的一半,每类指令时钟数是:取数为7、存数为6、
ALU为5、分支为4、跳转为4。
(3)流水线方式。时钟周期取存储操作时间的一半,采用“取指1、取指2、取数/译码、执行、存取1、存
取 2、写回”7段流水线;没有结构冒险;数据冒险采用“转发”技术处理;load指令与后续各指令之间存在依
赖关系的概率分别1/2,1/4,1/8,⋯;分支延迟损失时间片为2,预测准确率为75???考虑异常、中断和访
问缺失引起的流水线冒险。
12.有一段程序的核心模块中有5条分支指令,该模块将会被执行成千上万次,在其中一次执行过程
中,5条分支指令的实际执行情况如下(T;taken;N:not taken)。
分支指令1:T-T-T。
分支指令2:N N-N-N。
分支指令3:T-N-T-N-T-N。
分支指令4:T-T-T-N-T。
分支指令5:T-T-N-T-T-N-T。
假定各个分支指令在每次模块执行过程中实际执行情况都一样,并且动态预测时每个分支指令都有
自己的预测表项,每次执行该模块时的初始预测位都相同。请分析并给出以下几种预测方案的预测准
确率。
(1)静态预测,总是预测转移(taken)。
(2)静态预测,总是预测不转移(not taken)。
(3)一位动态预测,初始预测转移(taken)。
(4)二位动态预测,初始预测弱转移(taken)。
13.假定选择以下9条RV321指令作为实现目标设计RISC-V的5级流水线处理器:3条R-型指令
(“add rd,rsl,rs2""slt rd,rsl,rs2""sltu rd,rsl,rs2");2条1型指令("ori rd,rsl,imml2""lw rd,rsl,
imm?2”);1条U-型指令(lui rd,imm20);1条S型指令(sw rsl,rs2,imm12);1条B-型指令(beq rsl,rs2,
imm?2);1条」型指令(jal rd,imm20)。参照6.2节中 MIPS流水线数据通路设计方案(见图6.5),完成以
下任务并回答问题
(1)给出RISC-V的5级流水线数据通路基本框架。
(2)对于B-型和J型指令的转移目标地址的生成,RISC-V和MIPS两种架构的处理方式有什么不同?
(3)说明控制信号在流水线中的传递过程和相应的控制点。
(4)设计的流水线数据通路的分支延迟损失时间片为多少?
第6章
205


<!-- page: 223 -->

第
章
7
存储器层次结构
存储器是计算机系统的重要组成部分,用来存放程序和数据。有了存储器,计算机就有
了记忆能力,从而能自动地从存储器中取出保存的指令,按序进行操作。计算机中所用的记
忆元件有多种类型,如寄存器、静态RAM、动态RAM、磁盘、磁带、光盘等,它们各自有不同
的速度、容量和价格,各类存储器按照层次化方式构成存储器层次结构。
本章主要介绍构成存储器层次结构的几类存储器的工作原理和组织形式。包括半导体
随机存取存储器、只读存储器和 Flash 存储器的基本读写原理和组织结构,存储器芯片和
CPU的连接,存储器的数据校验,高速缓存的基本原理和实现技术,以及虚拟存储器系统的
实现技术。
7.1存储器概述
7.1.1存储器的分类
根据存储器的特点和使用方法的不同,可以有以下几种分类方法。
1.按存储元件分类
存储元件必须具有两个截然不同的物理状态,才能被用来表示二进制代码0和1。目
前使用的存储元件主要有半导体器件、磁性材料和光介质。用半导体器件构成的存储器称
为半导体存储器;磁性材料存储器主要是磁表面存储器,如磁盘存储器和磁带存储器;光介
质存储器称为光盘存储器。
2.按存取方式分类
按存取方式来分,存储器可以分成随机存储、顺序存取、直接存取和按内容存取几类。
随机存取存储器(random access memory,RAM)的特点是按地址访问存储单元,因为每个
地址译码时间相同,所以,在不考虑芯片内部缓冲的前提下,每个单元的访问时间是一个常
数,与地址无关。半导体存储器属于随机存取存储器,可用作 cache 和主存储器。
顺序存取存储器(sequential access memory,SAM)的特点是信息按顺序存放和读出,
其存取时间取决于信息存放位置,以记录块为单位编址。磁带存储器就是一种顺序存取存
储器,其存储容量大,但存取速度慢。
直接存取存储器(direct access memory,DAM)的存取方式兼有随机访问和顺序访问的
特点。首先可直接选取所需信息所在区域,然后按顺序方式存取,磁盘存储器就是如此。


<!-- page: 224 -->

存储器层次结构
上述3类存储器都是按所需信息的地址来访问,但有些情况下可能不知道所访问信息
的地址,只知道要访问信息的内容特征,此时,只能按内容检索到存储位置进行读写。这种
存储器称为按内容访问存储器(content addressed memory,CAM)或相联存储器(associative
memory.AM).
3.按信息的可更改性分类
按信息的可更改性分为可读可写存储器和只读存储器(read only memory,ROM)。
ROM中的信息一旦确定,通常情况下只读不写,但在某些情况下也可重新写入。RAM是
一种可读可写存储器,RAM和ROM都采用随机存取方式进行信息的访问。
4.按断电后信息的可保存性分类
按断电后信息的可保存性分成非易失(不挥发)性存储器(nonvolatile memory)和易失
(挥发)性存储器(volatile memory)。如 ROM、磁表面存储器、光存储器等非易失性存储器
的信息可一直保留,不需电源维持;如RAM、cache等易失性存储器在电源关闭时信息自动
丢失。
7.1.2主存储器的组成和基本操作
图7.1是主存储器(main memory,MM)的基本框图。其中由一个个存储0或1的记忆
单元(cell)构成的存储阵列是存储器的核心部分。这种记忆单元也称为存储元、位元,它是
具有两种稳态的能表示二进制0和1的物理器件。存储阵列(bank)也被称为存储体、存储
矩阵。为了存取存储体中的信息,必须对存储单元编号,所编号码就是地址。编址单位
(addressing unit)是指具有相同地址的那些位元构成的一个单位,可以是一字节或一个字。
对存储单元进行编号的方式称为编址方式(addressing mode),可以按字节编址,也可以按
字编址。现在大多数通用计算机都采用字节编址方式,此时,存储体内一个地址中有一字
节。也有许多专用于科学计算的大型计算机采用64位编址,这是因为科学计算中数据大多
是64位浮点数。
数据线
读/写的数据(64位)
MDR
地址线
地址寄存器
地址译码器
主存地址
(36位)
MAR
CPU
控制线
读/写控制信号
MM
记忆单元
存储
单元·
地址
读写控制电路
00000[
00001| 01101001
00010[
00011[
00100[
10101010
11110[
111[
存储内容
图7.1 主存储器基本框图
指令执行过程中需要访问主存时,CPU首先把被访问单元的地址送到主存地址寄存器
(memory address register,MAR)中,然后通过地址线将主存地址送到主存中的地址寄存
第7章
207


<!-- page: 225 -->

计算机组成与系统结构(第3版)
208
器,以便地址译码器进行译码,选中相应单元,同时,CPU将读/写信号通过控制线送到主存
的读写控制电路。如果是写操作,CPU同时将要写的信息送主存数据寄存器(memory data
register,MDR)中,在读写控制电路的控制下,经数据线将信息写入选中的单元;如果是读
操作,则主存读出选中单元的内容送数据线,然后被送到 MDR中。数据线的宽度与 MDR
的宽度相同,地址线的宽度与MAR的宽度相同。图7.1中采用64位数据线,所以在字节
编址方式下,每次最多可以存取8个单元的内容。地址线的位数决定了主存地址空间的最
大可寻址范围,例如,36位地址的最大寻址范围为0~2-1,地址从0开始编号。
7.1.3存储器的层次化结构
存储器容量和性能应随着处理器速度和性能的提高而同步提高,以保持系统性能的平
衡。然而,在过去几十年中,随着时间的推移,处理器和存储器在性能发展上的差异越来越
大,存储器在容量尤其是访问延时方面的性能增长越来越跟不上处理器性能发展的需要。
为了缩小存储器和处理器两者之间在性能方面的差距,通常在计算机内部采用层次化的存
储器体系结构。
某一种元件制造的存储器很难同时满足大容量、高速度和低成本的要求。比如双极型
半导体存储器的存取速度快,但是难以构成大容量存储器。而大容量、低成本的磁表面存储
器的存取速度又远低于半导体存储器,并且难以实现随机存取。因此,计算机把各种不同容
量和不同存取速度的存储器按一定的结构有机地组织在一起,形成层次化的存储器体系结
构。程序和数据按不同的层次存放在各级存储器中,整个存储系统在速度、容量和价格等方
面具有较好的综合性能指标。图7.2是存储系统层次结构示意图。
典型容量
典型存取时间
寄存器
<1KB
Ins
高速缓存(cache)
4MB
2ns
内部存储器
500MB~4GB
10ns
主存储器(RAM和 ROM)
10ms
辅助存储器(硬盘)
外部存储器 40~500GB
10s
海量后备存储器(磁带库、光盘库)
10~100TB
图 7.2 存储器层次化体系结构
虽然图7.2中给出的典型存取时间和存储容量会随时间变化,但这些数据反映了速度
和容量之间的关系,以及层次化结构存储器的构成思想。速度越快,则容量越小、越靠近
CPU。CPU可以直接访问内部存储器,而外部存储器的信息则要先取到主存,然后才能被
CPU 访问。
数据一般只在相邻两层之间复制传送,而且总是从慢速存储器复制到快速存储器才能
被使用。传送的单位是一个定长块,因此需要确定定长块的大小,并在相邻两层间建立块映
射关系。
CPU执行指令时,需要的操作数大部分都来自寄存器。如果需要从(向)存储器中取
(存)数据时,先访问cache,如果不在cache中,则访问主存,如果不在主存中,则访问硬盘,
此时,操作数从硬盘中读出送到主存,然后从主存送到 cache。