【分析解答】

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

## 【分析解答】

(1) 单周期方式下,时钟周期为 200 + 50 + 100 + 200 + 50 = 600ps,故一条指令的执行时间为 600ps。
(2) 多周期方式下,CPI = 0.25 × 7 + 0.10 × 6 + 0.52 × 5 + 0.11 × 4 + 0.02 × 4 = 5.47,存储器操作变为在2个时钟周期内完成后,多周期数据通路的时钟周期为100ps,故平均一条指令的执行时间为 100 × 5.47 = 547ps。
(3) 流水线方式下,存储器操作变为在2个时钟周期内完成后,其流水线包含了7个阶段。

对于分支指令,若预测正确,则不需额外时钟周期,故只需1个时钟周期;若预测错误,则因为分支延迟损失时间片为2,所以应该将错误预取的2条指令冲刷掉,额外多用了2个时钟周期,因此,预测错误时共需3个时钟周期,故分支指令的 CPI = 0.25 × 3 + 0.75 × 1 = 1.5。

对于load指令,因为一个存储操作占用2个时钟周期,所以随后第1条指令则需3个(其中阻塞2个)时钟周期;随后第二条指令需2个(其中阻塞1个)时钟周期,以后的指令都不需要阻塞,故 CPI = 1/2 × 3 + 1/4 × 2 + 2/8 × 1 = 2.25。

对于ALU指令,随后的数据相关指令都可通过转发解决,故CPI = 1。

对于store指令,不会发生数据冒险,故CPI = 1。


<!-- page: 183 -->

对于jump指令,最快也要在译码阶段才能确定转移地址,因此需阻塞2个时钟周期,加上本身1个时钟周期,共3个时钟周期,故 $\mathrm{CPI} = 3$ 。

因此,综合 $\mathrm{CPI} = 0.25 \times 2.25 + 0.10 \times 1 + 0.52 \times 1 + 0.11 \times 1.5 + 0.02 \times 3 = 1.41$ 。所以,平均一条指令的执行时间为 $1.41 \times 100 = 141\mathrm{ps}$ 。

由上述分析可知,流水线处理器的指令执行速度最快,是单周期的 $600 / 141 \approx 4.26$ 倍,是多周期的 $547 / 141 \approx 3.844$ 倍。

12. 假设一段程序的核心模块中有 5 条分支指令,该模块将会被执行成千上万次,在其中一次执行过程中,5 条分支指令的实际执行情况如下(T: taken; N: not taken)。

分支指令1(B1):T-T-T。

分支指令2(B2):N-N-N-N。

分支指令3(B3):T-N-T-N-T-N。

分支指令4(B4):T-T-T-N-T。

分支指令5(B5):T-T-N-T-T-N-T。

假定各个分支指令在每次模块执行过程中实际执行情况都一样,并且动态预测时,每个分支指令都有各自的预测表项,每次执行时的初始预测位都相同。请给出以下几种预测方案的预测准确率。

(1) 静态预测,总是预测转移(taken)。
(2) 静态预测,总是预测不转移(not taken)。
(3) 一位动态预测,初始预测转移(taken)。
(4) 两位动态预测,初始预测弱转移(taken)。

## 【分析解答】

预测准确率 = 预测正确次数 / 总预测次数 × 100%。以下 R 表示正确预测次数,W 表示错误预测次数。

(1) B1: R-3, W-0; B2: R-0, W-4; B3: R-3, W-3; B4: R-4, W-1; B5: R-5, W-2。预测准确率 60%。
(2) B1: R-0, W-3; B2: R-4, W-0; B3: R-3, W-3; B4: R-1, W-4; B5: R-2, W-5。预测准确率 40%。
(3) 根据主教材图 6.21 所示的状态转换图,可以得到各分支点的预测情况如下。

B1: R-3, W-0; B2: R-3, W-1; B3: R-1, W-5; B4: R-3, W-2; B5: R-3, W-4。预测准确率 52%。

具体每次的预测结果如图 6.10 所示。

B1 ① T ① T ① T
B2 ① X ⑥ Y ⑥ N ⑥ N
B3 ① T ① N ⑥ T ① N ⑥ T ① N
B4 ① T ① T ① T ① N ⑥ T
B5 ① T ① T ① N ⑥ T ① T ① N ⑥ T

图 6.10 一位动态预测(初始预测为转移)的预测情况


<!-- page: 184 -->

(4) 根据主教材图 6.23 所示的状态转换图,可以得到各分支点的预测情况如下。

B1:R-3,W-0;B2:R-3,W-1;B3:R-3,W-3;B4:R-4,W-1;B5:R-5,W-2。预测准确率 72%。

具体每次的预测结果如图 6.11 所示。

图 6.11 两位动态预测(初始预测为弱转移)的预测情况

13. 对于以下 MIPS 指令序列:

Loop: lw $2, 100($6)
add $3, $2, $7
sw $3, 100($6)
lw $5, 200($6)
sub $4, $5, $2
sw $4, 300($6)
addi $6, $6, 8
bne $6, $8, Loop
假定在一个如图 6.4 所示的采用“转发”技术的 5 段流水线中执行上述循环 50 次,该流水线数据通路中,寄存器写口和寄存器读口分别被安排在一个时钟周期的前、后半个周期内独立工作,分支指令的分支延迟损失时间片为 3。要求回答下列问题: (1)不采用分支预测时,每次循环执行需要多少时钟周期? (2)若采用静态分支预测,并总是预测转移(taken),则各次循环执行需要多少时钟周期?总的执行时间比不采用分支预测时快多少? (3)如何调整指令顺序使得指令序列执行时流水线的阻塞次数最少?在不采用分支预测的情况下,指令顺序调整后总的执行时间少多少?在采用静态预测(总是预测转移)的情况下,指令顺序调整后总的执行时间少多少? 【分析解答】 (1)因为循环中有两个 load-use 冒险和一个控制(分支)冒险,每个 load-use 冒险需要阻塞一个时钟周期,而分支指令的分支延迟损失时间片为 3,所以共有 $2 + 3 = 5$ 次阻塞,因而每次循环的执行共需 $8 + 5 = 13$ 个时钟周期。 (2)若采用静态分支预测,并总是预测转移,则前面 49 次循环中的分支预测都能成功,因而无需额外的时钟周期,故一次循环需 $8 + 2 = 10$ 个时钟周期,而最后 1 次循环中的分支 <!-- page: 185 --> 预测不成功,需要在流水线中冲刷掉3条指令,故最后一次循环需 $8 + 2 + 3 = 13$ 个时钟周期。因此,总的执行时间为 $49 \times 10 + 1 \times 13 = 503$ 个时钟周期。不采用分支预测时总的执行时间为 $50 \times 13 = 650$ 个时钟周期。所以两者相比,采用静态预测比不采用分支预测时少用了 $(650 - 503) = 147$ 个时钟周期。 (3)可以将无关指令插入 load-use 数据相关指令之间,调整指令顺序后的指令序列如下。
Loop: lw $2, 100($6)
lw $5, 200($6)
add $3, $2, $7
sw $3, 100($6)
sub $4, $5, $2
sw $4, 300($6)
addi $6, $6, 8
bne $6, $8, Loop
指令顺序调整后,消除了load-use数据冒险,因而,在不采用分支预测的情况下,每次循环需 $8 + 3 = 11$ 个时钟周期,共 $11 \times 50 = 550$ 个时钟周期。比调整指令顺序前少了 $650 - 550 = 100$ 个时钟周期。 指令顺序调整后,在采用静态预测(总是预测转移)的情况下,前49次每次循环需8个时钟周期,最后1次预测错误,需在流水线中冲刷3条指令,因而需 $8 + 3 = 11$ 个时钟周期,共需 $49 \times 8 + 1 \times 11 = 403$ 个时钟周期,与调整指令顺序前相比,总的执行时间少了 $503 - 403 = 100$ 个时钟周期。 如果将优化指令序列并采用分支预测的情况与未进行指令序列优化且未采用分支预测的情况相比,则总的执行时间少了 $650 - 403 = 247$ 个时钟周期。 14. 某高级语言源程序中的一个 while 语句为“while (save[i] == k) i += 1;”,若对其编译时,编译器将 $i$ 和 $k$ 分别分配在寄存器 $s3$ 和 $s5$ 中,数组 save 的基址存放在 $s6$ 中,则生成的 MIPS 汇编代码段如下。
1 loop: s11 $t1, $s3, 2 #R[$t1] * -R[$s3] &amp;lt;&amp;lt; 2, 即 R[$t1] = i × 4
2     add $t1, $t1, $s6 #R[$t1] * -R[$t1] + R[$s6], 即 R[$t1] = Address of #save[i]
3     lw $t0, 0($t1) #R[$t0] * -M[R[$t1] + 0], 即 R[$t0] = save[i]
4     bne $t0, $s5, exit #if R[$t0] ≠ R[$s5] then goto exit
5     addi $s3, $s3, 1 #R[$s3] * -R[$s3] + 1, 即 i = i + 1
6     j loop #goto loop
7 exit:
假定如图6.1所示流水线数据通路中各主要功能单元的操作时间是:存储器为200ps;ALU和加法器为100ps;寄存器堆(读或写)为50ps。请回答下列问题: (1)在不考虑流水段寄存器、多路选择器、控制单元、PC、扩展器和线路等延迟的情况下,5段流水线处理器的最小时钟周期为多少? (2)请指出循环体中指令之间的数据相关性。 (3)假定采用“转发”技术,并对分支冒险采用“一位动态预测”(初始预测为转移)方式,条件检测和分支目标地址修改都在“执行(Ex)”阶段进行,jump指令在“译码(ID)”阶段进 <!-- page: 186 --> 行跳转目标地址修改,则在流水线处理器上执行8次循环所用的时间为多少纳秒?对于同样的8次循环执行,与第5章的分析应用题16中的单周期和多周期处理器相比,流水线处理器的速度快了多少倍? ## 【分析解答】 (1)因为最复杂的部件(存储器)所用的最长时间为 200ps,所以,在不考虑流水线寄存器、多路选择器、控制单元、PC、扩展器和线路等延迟的情况下,5段流水线处理器的最小时钟周期为 200ps。 (2)循环体中第1条和第2条、第2条和第3条、第3条和第4条、第5条和第1条指令之间存在数据相关。 (3)采用“转发”技术可以消除第1条和第2条、第2条和第3条、第5条和第1条指令之间的数据相关,但不能消除第3条和第4条指令之间的load-use冒险,需要额外一个时钟的阻塞,8次循环共有8个时钟的阻塞;此外,对于bne控制(分支)冒险,第一次和最后一次预测错误,所以有两次需要对预取执行的指令进行冲刷。因为条件检测和转移目标地址修改都在“执行(Ex)”阶段进行,因此,分支延迟损失时间片(分支延迟槽)为2,也即每次冲刷掉两条指令。因此,两次共被冲刷掉4条指令,使流水线阻塞了4个时钟周期;对于最后一条jump指令,因为在“译码(ID)”阶段进行跳转目标地址修改,所以每次有一个时钟阻塞,8次循环jump指令共执行了7次,因而有7个时钟周期的阻塞。综上可知,8次循环总共有 $8 + 4 + 7 = 19$ 次阻塞,且第 $1 \sim 4$ 条指令各执行了8次,第 $5 \sim 6$ 条指令各执行了7次,因此,8次循环所用的时钟周期数为 $4 \times 8 + 2 \times 7 + 19 = 65$,总共时间为 $65 \times 200\mathrm{ps} = 13\mathrm{ns}$。 与第5章的分析应用题16中的单周期处理器相比,该流水线处理器执行上述程序段的速度快了 $(27.6 - 13) / 13 = 1.12$ 倍;与多周期处理器相比,快了 $(35.4 - 13) / 13 = 1.72$ 倍。 <!-- page: 187 --> # 第 7 章 ## 存储器层次结构 ### 7.1 教学目标和内容安排 主要教学目标:使学生掌握构成存储器层次结构的几类存储器的工作原理和组织形式,包括各种半导体随机存储器、外部辅助存储器、存储器数据校验、高速缓存和虚拟存储器等方面的基本原理和层次化存储器系统结构。要求学生深刻理解程序访问局部性的意义,学会利用时间局部性和空间局部性编写高效的程序;了解指令执行过程中访问指令和访问数据的整个过程,以及存储访问过程中硬件和软件的分工和联系,并深刻理解提高各种访问命中率的意义;了解虚拟存储管理的必要性和实现思路,为学习操作系统中的存储管理等内容打下坚实基础。 ### 基本学习要求: (1) 了解存储器的各种分类方式。 (2) 掌握如何构建存储器的层次化结构。 (3) 深刻理解程序访问的局部化特性。 (4) 熟悉主存储器的基本逻辑结构。 (5) 了解 SRAM 和 DRAM 芯片的内部结构。 (6) 了解半导体随机存取存储器的组织方式。 (7) 了解各种只读存储器的特点。 (8) 掌握存储器芯片扩展技术及其与 CPU 的连接方式。 (9) 了解加快存储访问速度的几种措施。 (10) 了解多体交叉编址存储器的基本原理。 (11) 了解磁盘存储器的主要技术指标和基本结构。 (12) 了解磁盘存储器的记录格式。 (13) 了解冗余磁盘阵列(RAID)的基本原理。 (14) 了解闪存存储器和固态硬盘的基本原理。 (15) 掌握奇偶校验方法。 (16) 理解海明校验的基本原理。 (17) 理解 CRC 码校验位的计算和检错方法。 (18) 掌握 cache 的基本原理与实现方式,包括映射方式、替换算法、写策略等。 <!-- page: 188 --> (19) 理解为何采用虚拟存储管理方式。 (20) 理解什么是虚拟地址和虚拟地址空间。 (21) 零握虚拟地址向物理地址转换的基本原理与实现技术。 (22) 了解页表的功能和页表项的内容。 (23) 了解“缺页”异常的发现和处理过程。 (24) 零握 TLB(快表)的结构和实现技术。 (25) 零握一次存储访问的全过程,并深刻理解在此过程中硬件与软件之间的分工协作方式。 本章主要包含 5 个核心内容:半导体随机访问存储器、外部辅助存储器、存储器数据校验、高速缓存 (cache) 和虚拟存储器,并阐述了如何以这 5 个核心内容为基础,构建存储器的层次化体系结构框架。 对于半导体随机访问存储器,可以按照“记忆单元→存储阵列→存储器芯片→存储模块(内存条)→存储器”的顺序,采用由点到面的组织方式,着重讲清楚 SRAM 和 DRAM 两类存储器的结构、特点和用途,以及存储芯片的扩展和连接技术。有关存储芯片的扩展和连接技术方面的知识,有助于对总线、数据的存放顺序和对齐方式等许多概念的理解,同步动态存储器(SDRAM 芯片)的概念与后面有关总线设计、系统互连等内容相关。在课时受限的情况下,对于记忆单元的存储和读写原理、存储芯片的读写周期、DRAM 的刷新、只读存储器等内容只要概要说明即可,因为这些不属于主干内容,也比较独立,对其他内容的学习影响不大。 对于外部存储辅助器,因为它是存储器分层体系结构中的一个重要组成部分,所以它属于主干内容,特别是硬盘存储器,它与操作系统中的存储管理和设备管理都有很大的关联,因此,本课程中应该把硬盘存储器讲清楚,包括性能指标、读写原理、硬盘驱动器的内部结构、硬盘控制器的结构和功能、磁道和扇区记录格式等。关于冗余磁盘阵列(RAID),因为其应用的广泛性,作为计算机专业的学生必须对其有一定的了解,课时有限的情况下,可以把 RAID 技术的基本思想、基本实现原理简单介绍一下。对于 U 盘、移动硬盘、固态硬件、磁带存储器、光盘存储器等,在课时有限时,也可以不展开来细讲,而是主要介绍基本原理和主要使用场合。 对于存储器数据校验,奇偶校验作为最基础的数据校验方式,需要让学生掌握。课时有限时,可以把海明校验和循环冗余码校验(CRC)的基本原理简单介绍一下,而固态硬盘(SSD)的数据校验方式让学生自学。 对于 cache,首先,应着重讲清楚程序访问的局部性,因为程序的时间局部性和空间局部性是提出并实现 cache 的基础,对这些内容的深刻理解,也有助于编写高效的程序。通过具体程序示例,可以将程序访问的局部性特点讲深、讲透。cache 和主存之间的映射关系是难点,主教材中例 7.5、例 7.7 和例 7.8 是针对相同主存大小和相同 cache 行数的三种不同映射关系的例子,课堂教学中,可以直接通过这三个例子来说明不同的映射关系,使学生能够较快地掌握不同映射关系的不同实现方式和访存过程。对于主教材中的例 7.10,可通过详细讲解几个关键单元(如第 0、1、63、64 单元)的访问,使学生能够深入了解 CPU 的访存过程和替换算法。如果课时受限,cache 性能评估、影响 cache 性能的因素,以及 cache 结构举例等内容可以跳过或仅作简单讲解。 <!-- page: 189 --> 对于虚拟存储器,着重讲清楚请求分页的思想、虚拟地址空间的概念、页表的结构、地址转换过程和快表的概念。主教材中图7.43和图7.44反映了CPU进行一次存储访问的过程,结合对这两张图的讲解和对主教材中表7.3的解读,可以加深学生对CPU访存过程的理解,特别是加深对软件和硬件分工协作过程的了解,从而加深对完整的存储器层次化结构体系的理解。如果课时受限,有关分段式虚拟存储器、段页式虚拟存储器和存储保护等内容可跳过或仅作简单讲解。 ## 7.2 主要内容提要 ### 1. 存储器的分类 存储器按存取方式分为随机存取存储器、顺序存取存储器、直接存取存储器和相联存取存储器;按存储介质分为半导体存储器、磁表面存储器和光盘存储器;按信息可更改性分为可读可写存储器和只读存储器;按断电后可否保存来分,分为易失性存储器和非易失性存储器;按功能、容量、速度三方面来分,分成寄存器、cache、主存储器(内存)、辅助存储器(外存)和海量后备存储器。 ### 2. 存储器的分层结构 因为每一种单独的存储器都不是又快、又大、又便宜,为了构建这种理想的存储器系统,计算机中采用了一种层次化的存储器体系结构。按照速度从快到慢、容量从小到大、价格从贵到便宜的顺序,由近到远地将不同存储器设置在离CPU远近不同的地方,这样的顺序是寄存器→cache→主存→SSD或磁盘→光盘和磁带。 ### 3. 半导体随机存取存储器的组织 主存空间的RAM(Random Access Memory)区由若干内存条组成,每个内存条上有若干存储器芯片,存储器芯片由用于存储信息的存储阵列外加地址缓存器、地址译码器、读写控制电路等组成,每个存储阵列由若干行和若干列构成,每个行、列交叉处是一个记忆单元(存储元),每个记忆单元用来存储一位二进位0或1。根据记忆单元结构的不同分为SRAM芯片和DRAM芯片两种,SRAM芯片的记忆单元采用6管静态MOS管存储电路,其功耗大、集成度低,但速度快,无须再生和刷新,适合构作高速小容量的存储器,如cache;DRAM芯片的记忆单元采用单管动态MOS管存储电路,因为只用一个MOS管,所以功耗小、集成度高,但由于靠电容储存电荷和充放电来存储和读写信息,所以速度慢,并需定时刷新,适合构作慢速大容量的存储器,如主存。 ### 4. 只读存储器 只读存储器(Read Only Memory, ROM)中的信息用特殊方式写入,一经写入就可长久保存,是非易失性存储器。其存取方式也以随机存取方式工作,主要用于存放固定信息,如微程序、BIOS、引导程序或嵌入式系统中固化的程序和数据等。ROM有MROM、PROM、EPROM、EEPROM、FlashROM等几种类型。ROM区也属于内存空间的一部分。 ### 5. 存储器芯片及其与CPU的连接 RAM芯片分为字片式和位片式两种。通常DRAM芯片都是位片式,DRAM芯片采用多个位平面构成,每个位平面是一个二维的存储阵列。DRAM芯片中的行地址和列地址共用同一组地址引脚,称为行列地址线复用。为提高存储器芯片的读写速度,DRAM芯片内 <!-- page: 190 --> 通常会有一个用 SRAM 实现的行缓冲(row buffer)。 存储器芯片和 CPU 之间通过总线相连,总线包括地址线、数据线和控制线。地址线的连接需要考虑芯片在字方向上的扩展,采用芯片内连续编址方式时,地址的低位用于芯片内地址,高位用于片选逻辑,片选信号译码器的输出连到芯片的片选信号引脚上;若采用交叉编址方式时,地址的高位用于芯片内寻址,低位部分用于片选逻辑。数据线的连接需要考虑芯片在位方向上的扩展,分别连到位扩展的芯片上;控制线的连接,包括读写信号、主存或 I/O 访问信号等。 ## 6. 主存的主要技术指标 主存的主要技术指标包括存储容量、存取时间、存储周期和存储器带宽。存储容量是指某计算机实际配置的容量,通常它小于最大可配置容量(主存地址空间大小);存取时间是指执行一次读操作或写操作的时间,分读出时间和写入时间两种;存储周期是指存储器进行连续两次独立的读或写操作所需的最小时间间隔,它通常大于存取时间;存储器带宽是指单位时间内从存储器读出或写入存储器的最大信息量。