6.5 单项选择题
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 6.5 单项选择题
1. 以下关于指令流水线设计的叙述中,错误的是( )。
A. 指令执行过程中的各个子功能都须包含在某个流水段中
B. 所有子功能都必须按一定的顺序经过流水段
C. 虽然各子功能所用实际时间可能不同,但经过每个流水段的时间都一样
D. 任何时候各个流水段的功能部件都不可能执行空(nop)操作
2. 以下关于流水段寄存器的叙述中,正确的是( )。
A. 指令译码得到的控制信号需要通过流水段寄存器传递到下一个流水段
B. 每个流水段之间的流水段寄存器位数一定相同
C. 每个流水段之间的流水段寄存器存放的信息一定相同
D. 用户程序可以通过指令指定访问哪个流水段寄存器
3. 以下关于指令流水线和指令执行效率关系的叙述中,错误的是( )。
A. 加倍增加流水段个数不能成倍提高指令执行效率
B. 为了提高指令吞吐率,流水段个数可以无限制地增多
C. 加深流水线深度,可以提高处理器的时钟频率
D. 随着流水段个数的增加,流水段之间缓存开销的比例增大
4. 以下有关流水线数据通路的描述中,错误的是( )。
A. 每个流水段由执行指令子功能的功能部件和流水段寄存器组成
B. 控制信号仅作用在功能部件上,时钟信号仅作用在流水段寄存器上
C. 在没有阻塞的情况下,PC的值在每个时钟周期都会改变
D. 取指令阶段和指令译码阶段不需要控制信号的控制
5. 某计算机的指令流水线由 4 个功能段组成,指令流经各功能段的时间(忽略各功能段之间流水段寄存器的缓存时间)分别为 90ns、80ns、70ns 和 60ns,则该计算机的 CPU 时钟周期至少是( )。
A. 90ns
B. 80ns
C. 70ns
D. 60ns
6. 假定执行最复杂的指令需要完成 6 个子功能,分别由对应的功能部件 A~F 来完成,每个功能部件所花的时间分别为 80ps、40ps、50ps、70ps、20ps、30ps,流水段寄存器延时为 20ps,现把最后两个功能部件 E 和 F 合并,以产生一个 5 段流水线。该 5 段流水线的时钟周期至少是( )。
A. 70ps
B. 80ps
C. 90ps
D. 100ps
<!-- page: 172 -->
7. 以下有关流水段的功能部件的描述中,错误的是( )。
A. 所有功能部件都是用组合逻辑实现
B. 同一个功能部件可以在不同的流水段中被使用
C. 每个功能部件在每条指令中都只被用一次
D. 寄存器写口只能在指令结束时的“写回”阶段被用
8. 以下给定的情况中,不会引起指令流水线阻塞的是( )。
A. 访存冲突
B. 指令数据相关
C. 执行空操作指令
D. cache 缺失
9. 以下给定的情况中,不会引起指令流水线阻塞的是( )。
A. 数据旁路(转发)
B. TLB 缺失
C. 条件转移
D. 外部中断
10. 以下是关于结构冒险的叙述:
① 结构冒险是指同时有多条指令使用同一个资源
② 避免结构冒险的基本做法是使每个指令在相同流水段中使用相同的部件
③ 重复设置功能部件可以避免结构冒险
④ 数据 cache 和代码 cache 分离可解决两条指令同时分别访问数据和指令的冒险
以上叙述中,正确的是( )。
A. 仅①和②和④
B. 仅①和②和③
C. 仅①和③和④
D. 全部
11. 以下是关于数据冒险的叙述:
① 数据冒险是指后面指令用到的数据还未来得及由前面指令产生
② 在发生数据冒险的指令之间插入空操作指令能避免数据冒险
③ 采用转发(旁路)技术可以解决一部分数据冒险现象
④ 通过编译器调整指令顺序可解决部分数据冒险
以上叙述中,正确的是( )。
A. 仅①和②和④
B. 仅①和②和③
C. 仅①和③和④
D. 全部
12. 以下是关于控制冒险的叙述:
① 条件跳转指令执行时可能会发生控制冒险
② 在分支指令后加入若干空操作指令可避免控制冒险
③ 采用转发(旁路)技术可以解决部分控制冒险
④ 通过编译器调整指令顺序可解决部分控制冒险
以上叙述中,正确的是( )。
A. 仅①和②和④
B. 仅①和②和③
C. 仅①和③和④
D. 全部
13. 以下是有关分支预测的叙述:
① 分支预测技术可用于控制冒险和数据冒险处理
② 采用静态预测技术时,每次的预测结果总是一样
③ 通常情况下,动态预测比静态预测的预测成功率高
④ 预测错误时已被错误地取到流水线执行的指令必须被冲刷掉
以上叙述中,正确的是( )。
A. 仅①和②和③
B. 仅①和②和④
C. 仅②和③和④
D. 全部
<!-- page: 173 -->
14. 以下是一段 MIPS 指令序列:
[tbl-37.md](tbl-37.md)
以上指令序列中,第( )行指令产生了一个分支控制冒险。
A. 2
B. 4
C. 5
D. 7
15. 以下是一段 MIPS 指令序列:
[tbl-38.md](tbl-38.md)
以上指令序列中,( )指令之间产生数据相关。
A. 1 和 2、2 和 3
B. 1 和 2、2 和 3、3 和 4
C. 1 和 2、1 和 3
D. 1 和 2、1 和 3、2 和 3
16. 以下是一段 MIPS 指令序列:
[tbl-39.md](tbl-39.md)
以上指令序列中,第 1 条和第 3 条、第 2 条和第 3 条指令之间发生数据相关。假定采用“取指、译码/取数、执行、访存、写回”5 段流水线方式,并控制在时钟的前半周期写寄存器堆,后半周期读寄存器堆,那么不采用“转发”技术时,需要在第 3 条指令前加入( )条空操作(nop)指令才能使这段程序不发生数据冒险。
A. 1
B. 2
C. 3
D. 4
17. 以下是一段 MIPS 指令序列:
[tbl-40.md](tbl-40.md)
以上指令序列中,第 1 条和第 3 条、第 2 条和第 3 条指令之间发生数据相关。假定采用“取指、译码/取数、执行、访存、写回”5 段流水线方式,那么在采用“转发”技术时,需要在第 3 条指令前加入( )条空操作(nop)指令才能使这段程序不发生数据冒险。
A. 0
B. 1
C. 2
D. 3
18. 以下有关超标量技术的叙述中,错误的是( )。
A. 超标量技术是指在流水线中采用更多的流水段个数
B. 超标量方式执行指令时可以同时发射多条指令至流水线中
<!-- page: 174 -->
C. 采用超标量技术的 CPU 中必须配置多个不同的功能部件
D. 采用超标量技术的目的是利用部件的并行性以提高指令吞吐率
【参考答案】
1. D
2. A
3. B
4. B
5. A
6. D
7. B
8. C
9. A
10. D
11. D
12. A
13. C
14. B
15. A
16. B
17. B
18. A
【部分题目的答案解析】
第 4 题
流水线数据通路中,控制信号也可以作用在流水段寄存器上,例如,当发生流水线阻塞时,通常需要保持流水段寄存器 IF/ID 中的指令不变,使得在随后一个时钟周期内继续对其中的指令进行译码/取数,这样就需要有相应的控制信号作用在 IF/ID 上。同时,时钟信号也不是仅仅需要作用在流水段寄存器上,也需要作用于 PC 或其他功能部件上,例如,需要时钟信号作用于某个特定的电路,以产生前半个时钟周期写寄存堆,后半个时钟周期读寄存器堆的控制信号。因此,选项 B 中的说法是错误的,答案为选项 B。
第 5 题
流水线 CPU 以最长功能段时间为基准确定时钟周期,通常要考虑流水段寄存器的延时,但是,本题忽略这个时间,因此,该计算机 CPU 时钟周期至少是 90ns,答案为选项 A。
第 7 题
流水线数据通路中,所有功能部件都属于组合逻辑,每个功能部件在每条指令中都只被用一次,因而不可能在不同的流水段中被使用,选项 C 的说法是错误的,答案为选项 C。
第 8 题
执行空操作指令时只要保证最终没有信息写入任何寄存器和存储单元就行,因此,空指令的执行不会引起指令流水线阻塞,而访存冲突(两条以上指令同时要求访问同一个存储器)、指令数据相关和 cache 缺失这三种情况的发生都会导致指令无法正常执行下去,从而引起指令流水线阻塞。答案为选项 C。
第 16 题
不采用“转发”技术时,需要在第 3 条指令前加入两条空操作 (nop) 指令才能使这段程序不发生数据冒险,如图 6.5 所示。答案为选项 B。
图 6.5 加入两条 nop 指令的情况
<!-- page: 175 -->
# 6.6 分析应用题
1. 假定某计算机工程师想设计一个新 CPU,其中运行的一个典型程序的核心模块需要执行一百万条指令,每条指令执行时间为 100ps。
(1) 在非流水线处理器上执行该程序大约需要花多长时间?
(2) 若新 CPU 是一个 20 级流水线处理器,执行上述同样的程序,理想情况下,它比非流水线处理器快多少?
(3) 实际流水线并不是理想的,流水段之间的数据传送会有额外开销。这些开销是否会影响指令执行时间(instruction latency)和指令吞吐率(instruction throughput)?
## 【分析解答】
(1) 非流水线处理器上执行该程序的时间大约为 $100\mathrm{ps} \times 10^{6} = 100\mu \mathrm{s}$。
(2) 若在一个 20 级流水线的处理器上执行,忽略流水段之间的寄存器延时,理想情况下,每个时钟周期为 $100 / 20 = 5\mathrm{ps}$,所以,程序执行时间大约为 $5 \times 10^{6} = 5\mu \mathrm{s}$,因此,大约快 $100 / 5 = 20$ 倍。
(3) 流水段之间数据的传递产生的额外开销,使得一条指令的执行时间被延长,即影响了指令执行时间;同时,也延长了每个流水段的时间,即影响了指令吞吐率。
2. 某计算机指令流水线由 6 个功能段组成,依次为 A~F,每个功能段的组合逻辑延迟分别为 80ps、30ps、60ps、50ps、60ps、20ps,最后一个功能段需要写寄存器,寄存器延时为 20ps。在这些组合逻辑块之间插入必要的流水段寄存器就可实现相应的指令流水线。理想情况下,以下各种方式所得到的时钟周期、指令吞吐率和指令执行时间各是多少?应该在哪里插入流水段寄存器(假定插入的流水段寄存器的延时也为 20ps)?根据对以下 4 种情况的分析,你能得到什么结论。
(1) 插入一个流水段寄存器,得到一个两级流水线。
(2) 插入两个流水段寄存器,得到一个三级流水线。
(3) 插入三个流水段寄存器,得到一个四级流水线。
(4) 吞吐量最大的流水线。
## 【分析解答】
(1) 两级流水线的平衡点在 C 和 D 之间,其前面一个流水段的组合逻辑延时为 $80 \div 30 + 60 = 170\mathrm{ps}$,后面一个流水段的组合逻辑延时为 $50 + 60 + 20 = 130\mathrm{ps}$。最长功能段延时为 $170\mathrm{ps}$,加上流水段寄存器延时 $20\mathrm{ps}$,因而时钟周期为 $190\mathrm{ps}$,理想情况下,指令吞吐率为每秒执行 $1 / 190\mathrm{ps} = 5.26\mathrm{G}$ 条指令。每条指令在流水线中的执行时间为 $2 \times 190 = 380\mathrm{ps}$。
(2) 两个流水段寄存器分别插在 B 和 C、D 和 E 之间,这样第一个流水段的组合逻辑延时为 $80 \div 30 = 110\mathrm{ps}$,中间第二段的延时为 $60 \div 50 = 110\mathrm{ps}$,最后一个段延时为 $60 \div 20 = 80\mathrm{ps}$。这样,每个流水段所用时间都按最长延时调整为 $110 \div 20 = 130\mathrm{ps}$,故时钟周期为 $130\mathrm{ps}$,指令吞吐率为每秒执行 $1 / 130\mathrm{ps} = 7.69\mathrm{G}$ 条指令,每条指令在流水线中的执行时间为 $3 \times 130 = 390\mathrm{ps}$。
(3) 三个流水段寄存器分别插在 A 和 B、C 和 D、D 和 E 之间,这样第一个流水段的组合逻辑延时为 80ps,第二段延时为 $30 + 60 = 90\mathrm{ps}$,第三段延时为 50ps,最后一段延时为 60
<!-- page: 176 -->
$+20 = 80\mathrm{ps}$。这样,每个流水段都以最长延时调整为 $90 + 20 = 110\mathrm{ps}$,故时钟周期为 $110\mathrm{ps}$,指令吞吐率为每秒执行 $1 / 110\mathrm{ps} = 9.09\mathrm{G}$ 条指令,每条指令在流水线中的执行时间为 $4\times 110 = 440\mathrm{ps}$。
(4)因为各功能部件对应的组合逻辑中最长延时为80ps,所以,流水线的时钟周期肯定比 $80\mathrm{ps} + 20\mathrm{ps} = 100\mathrm{ps}$ 长。为了达到最大吞吐率,时钟周期应该尽量短,因此,最合理的划分方案应该按照每个时钟周期为100ps来进行。根据每个功能部件所用时间可知,流水线至少按5段来划分,分别把流水线寄存器插入在A和B、B和C、C和D、D和E之间,这样各段的组合逻辑延时为80ps、30ps、60ps,50ps和80ps。其中,最后一个延时80ps是E和F两个阶段的时间相加而得到的。这样时钟周期为100ps,指令吞吐率为每秒执行 $1 / 100\mathrm{ps} = 10\mathrm{G}$ 条指令,每个指令的执行时间为 $5\times 100 = 500\mathrm{ps}$。
通过对上述4种情况进行分析,可以得出以下结论:划分的流水段多,时钟周期就变短,指令执行吞吐率就变高,而相应的额外开销(即插入的流水段寄存器的延时)也变大,使得一条指令的执行时间变长。
3. 假定在如图6.1所示的5级流水线处理器中,各主要功能部件的操作时间是:存储器为200ps;ALU和加法器为150ps;寄存器堆读口和写口为50ps。
(1)若执行阶段EX所用的ALU操作时间缩短 $20\%$ ,则能否加快流水线执行速度?如果能的话,能加快多少?如果不能的话,为什么?
(2)若 ALU 操作时间增加 $20\%$ ,对流水线的性能有何影响?
(3)若 ALU 操作时间增加 $40\%$ ,对流水线的性能又有何影响?
## 【分析解答】
(1)ALU操作时间缩短 $20\%$ 不能加快流水线指令速度。因为指令流水线的执行速度取决于最慢的功能部件所用时间,最慢的是存储器,只有缩短了存储器的操作时间才可能加快流水线速度。
(2)ALU操作时间延长 $20\%$ 时,变为了180ps,比存储器所用时间200ps还小,因此,对流水线性能没有影响。
(3)ALU操作时间延长 $40\%$ 时,变为了210ps,比存储器所用时间200ps大,因此,在不考虑流水段寄存器延时的情况下,流水线的时钟周期从200ps变为210ps,流水线执行速度降低了 $(210 - 200) / 200 = 5\%$ 。
4. 下面是一段 MIPS 指令序列:
1 add $t1, $s1, $s0
2 sub $t2, $s0, $s3
3 add $t1, $t1, $t2
假定在一个采用“取指、译码/取数、执行、访存、写回”的5段流水线处理器中执行上述指令序列,请回答下列问题:
(1)以上指令序列中,哪些指令之间发生数据相关?
(2)不采用“转发”技术的话,需要在何处、加入几条 nop 指令才能使这段指令序列的执行避免数据冒险?
(3)如果采用“转发”技术,是否可以完全解决数据冒险?不行的话,需要在何处、加入几条 nop 指令才能使这段指令序列的执行避免数据冒险?
<!-- page: 177 -->
# 【分析解答】
(1)因为第1条和第2条指令都会更新第3条指令用到的寄存器的值,有可能导致第3条指令取操作数时得到的是更新前的数据,这样第3条指令就不能正确执行,因此,第1条和第3条指令、第2条和第3条指令之间发生数据相关。
(2)不进行“转发”的话,就只能通过在第3条指令前加nop指令来延迟第3条指令的执行。因为只有第2条指令把数据写回到$ t2, 第3条指令才能从$ t2取到正确的值,所以,第2条指令的“写回(Wr)”流水段后面才应该是第3条指令的“译码/取数(ID)”流水段,为此,在第2条和第3条指令之间必须插入3条nop指令,如图6.6所示。
图6.6 题4(2)中的图示一
若将寄存器写口和寄存器读口分别安排在一个时钟周期的前、后半个周期内独立工作,使得前半周期写入寄存器的内容在后半周期能够正确读出,那么只要加入两条nop即可,如图6.7所示。
图6.7 题4(2)中的图示二
<!-- page: 178 -->
(3) 采用“转发”技术,上述程序段可以完全避免数据冒险。只要把第 1 条指令“访存 (Mem)”段结束时在流水段寄存器中的 \$t1 的值和第 2 条指令“执行 (Ex)”段结束时在流水段寄存器中的 \$t2 的值,同时“转发”到第 3 条指令的“执行 (Ex)”段中 ALU 的两个输入端,这样,在 ALU 中运算的两个操作数都是正确的值,不会发生数据冒险,无需再插入 nop 指令,如图 6.8 所示。
图 6.8 题 4(3) 中的图示
5. 下面是一段 MIPS 指令序列:
1 add $s3, $s1, $s0
2 sub $t2, $s0, $s3
3 lw $t1,0($t2)
4 add $t1, $t1, $t2
假定在一个采用“取指、译码/取数、执行、访存、写回”的 5 段流水线处理器中执行上述指令序列,该流水线数据通路中,寄存器写口和寄存器读口分别安排在一个时钟周期的前、后半个周期内独立工作。请回答下列问题:
(1)以上指令序列中,哪些指令之间发生数据相关?
(2)不采用“转发”技术的话,需要在何处、加入几条 nop 指令才能使这段指令序列的执行避免数据冒险?nop 指令增加的百分比为多少?该指令序列的执行共需要多少时钟周期?
(3)如果采用“转发”技术,是否可以完全解决数据冒险?不行的话,需要在何处、加入几条 nop 指令才能使这段指令序列的执行避免数据冒险?
(4)若数据冒险通过硬件阻塞进行处理,则在不采用“转发”和采用“转发”两种情况下,执行上述 4 条指令的 CPI 分别是多少?
【分析解答】
(1)发生数据相关的是:第 1 条和第 2 条指令之间关于 \$s3,第 2 条和第 3 条指令之间关于 \$t2,第 2 条和第 4 条指令之间关于 \$t2,以及第 3 条和第 4 条指令之间关于 \$t1。
(2)不进行“转发”处理的话,需要分别在第 2、3、4 条指令前加 2 条 nop 指令才能避免数据冒险,共加了 6 条 nop 指令。nop 指令增加的百分比为 $6/4 = 150\%$,即平均 1 条指令加 1.5 条 nop 指令。该指令序列执行所需的时钟周期数为 $(5 - 1) + (4 + 6) = 14$。
(3)通过“转发”可以避免第 1 条和第 2 条、第 2 条和第 3 条、第 2 条和第 4 条指令之间的数据相关;但第 3 条和第 4 条指令之间是 load-use 数据相关,因此,无法用“转发”消除冒
<!-- page: 179 -->
险,而需在第4条指令前加入1条nop指令。
(4)数据冒险通过硬件阻塞进行处理时,如不采用“转发”来执行上述4条指令,则需要时钟周期数为14,故CPI为 $14 / 4 = 3.5$。若采用“转发”来执行上述4条指令,则需要时钟周期数为 $(5 - 1) + (4 + 1) = 9$,故CPI为 $9 / 4 = 2.25$。
6. 下面是一段 MIPS 指令序列:
1 add $t1, $s1, $s0
2 sub $t2, $s0, $s3
3 lw $t0, 0($t2)
4 add $s0, $t0, $s2
5 add $t1, $s0, $t2
假定在一个采用“取指、译码/取数、执行、访存、写回”的5段流水线处理器中执行上述指令序列,并且该处理器采用了“转发”和“load-use冒险处理”技术,则在第5个时钟周期内,各指令的执行情况如何?哪些寄存器的内容正在被读?哪些寄存器将被写入数据?
## 【分析解答】
在一个如图6.4所示的带“load-use冒险处理”和“转发”处理的5阶段流水线数据通路中执行上述指令序列,则第5个时钟周期内各条指令的执行情况如下。
第1条指令在“写回(Wr)”阶段,寄存器\$t1将被写入。
第2条指令在“访存(Mem)”阶段,sub指令在该阶段进行的是空操作;在转发检测单元中,因为流水段寄存器Ex/Mem中的目的寄存器RegRd为\$t2,流水段寄存器ID/Ex中的源寄存器Rs也为\$t2,同时,流水段寄存器Ex/Mem中的RegWr控制信号为1,所以检测到转发条件满足,因而,此时sub指令在上一个时钟周期中的执行结果(在流水段寄存器Ex/Mem中的ALU输出结果)正被回送到ALU的输入端。
第3条指令在“执行(Ex)”阶段,ALU正在执行“add”操作,进行地址运算,ALU输出结果将被写入流水段寄存器Ex/Mem中。
第4条指令在“译码/取数(ID)”阶段,寄存器\$t0和\$s2的内容正被读出;在load-use冒险检测单元中,因为流水段寄存器IF/ID中源操作数寄存器Rs为\$t0,流水段寄存器ID/Ex中目的操作数寄存器Rt也为\$t0,同时,因为上条指令是lw,故流水段寄存器ID/Ex中的MemRead控制信号为1,所以在该阶段检测到load-use冒险条件满足,此时,需要进行load-use冒险处理,在流水线中插入一个“气泡”,将指令的执行阻塞一个时钟周期。包括以下三个步骤:①将流水段寄存器ID/Ex中的控制信号全部清0,以保证第4条指令被阻塞一个时钟周期执行;②将流水段寄存器IF/ID中的指令维持不变,以保证第4条指令重新译码后执行;③将PC的值维持不变,以保证根据PC的值重新取出第5条指令。
第5条指令在“IF”阶段,指令正被读出,将要送到流水段寄存器IF/ID的输入端。因为之前发生了load-use数据冒险,所以该指令将在随后的第6个时钟周期内重新被读出。
7. 以下是一段 MIPS 指令序列:
1 loop: add $t1, $s3, $s3
2 add $t1, $t1, $t1
3 add $t1, $t1, $s6
4 lw $t0, 0($t1)
5 bne $t0, $s5, exit
<!-- page: 180 -->
6 add $s3, $s3, $s4
7 j loop
8 exit:
假定在一个采用“取指、译码/取数、执行、访存、写回”的5段流水线中执行上述指令序列,该流水线数据通路中,寄存器写口和寄存器读口分别安排在一个时钟周期的前、后半个周期内独立工作。要求回答下列问题:
(1)哪些指令之间发生数据相关?哪些指令的执行会发生控制相关?
(2)如果不采用“转发”技术进行数据冒险处理,那么应该在何处、加入几条 nop 指令才能避免数据冒险?假定采用“转发”技术处理,是否可以完全解决数据冒险?不行的话,需要在发生数据相关的指令前加入几条 nop 指令,才能使这段指令序列的执行避免数据冒险?
(3)对于第5条分支指令引起的控制冒险(分支冒险),假定检测结果是否为“零”并更新PC的操作在“访存(Mem)”阶段进行,则分支延迟损失时间片(即分支延迟槽)为多少?在何处、加入几条 nop 指令可以消除分支冒险?若检测结果是否为“零”并更新PC的操作在“执行(Ex)”阶段进行,则分支延迟损失时间片(即分支延迟槽)为多少?
(4)对于第7条指令“j loop”,假定更新PC的操作在“执行(Ex)”阶段进行,则流水线会被阻塞几个时钟周期?需要在何处、加入几条nop指令才可消除该控制冒险?假定更新PC的操作在“译码(ID)”阶段进行,则流水线又将被阻塞几个时钟周期?
【分析解答】
(1)发生数据相关的是:第1条和第2条指令之间关于$ t1,第2条和第3条指令之间关于$ t1,第3条和第4条指令之间关于$ t1,第4条和第5条指令之间关于$ t0,以及第6条和第1条指令之间关于$ s3。此外,第5条和第7条指令的执行都会发生控制相关。
(2)对于数据冒险,如果不采用“转发”,而是简单地通过加入 nop 指令来避免冒险的话,那么应该在第 2、3、4、5 条指令前各加两条 nop 指令,以消除数据相关;对于第 6 条和第 1 条指令之间的数据相关,则可通过在第 7 条“j loop”指令后面加一条或两条 nop 指令消除(这样同时还能解决第 7 条“j loop”指令的控制冒险);为解决数据冒险,共需加 13 条或 14 条 nop 指令,大大增加了程序的长度,并极大地降低了指令执行效率。数据冒险在多数情况下可通过“转发”来解决,此处,第 2、3、4 条指令所需的操作数可通过“转发”得到,无需加 nop 指令。第 5 条指令所需的操作数 $ t0 是 load-use 冒险,不能用“转发”解决问题,需要在第 5 条指令前加一条 nop 指令,或通过硬件将第 5 条指令的执行阻塞 1 个时钟周期。
(3)对于分支冒险,若检测结果是否为“零”并更新PC的操作在“访存(Mem)”阶段进行,则分支延迟损失时间片(分支延迟槽)为3,此时在第5条分支指令后加3条nop指令,或从硬件上使分支指令后面一条指令的执行阻塞3个时钟周期。若检测结果是否为“零”并更新PC的操作在“执行(Ex)”阶段进行,则分支延迟损失时间片(分支延迟槽)为2。
(4)假定“j loop”指令更新PC的操作在“执行(Ex)”阶段进行,则流水线将被阻塞2个时钟周期,此时,需要在jump指令后加两条nop指令才能消除该控制冒险。假定更新PC的操作在“译码(ID)”阶段进行,则流水线只被阻塞1个时钟周期。
8. 假定有一个程序共1000条指令,其指令序列为“lw,add,lw,add,…”。add指令仅依赖它前面的lw指令,而lw指令也仅依赖它前面的add指令。寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内独立工作。请回答下列问题:
<!-- page: 181 -->
(1)在带转发的5段流水线中执行该程序,其CPI为多少?
(2)在不带转发的5段流水线中执行该程序,其CPI为多少?
【分析解答】
(1)若流水线中有“转发”逻辑,并且寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内工作,则只存在lw指令和add指令之间的一个load-use数据冒险,因此,每个lw指令和add指令之间有一次流水线阻塞,即每一对lw和add指令需要用3个时钟周期完成,因而CPI为1.5。
(2)若流水线中没有“转发”逻辑,而寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内工作,则在每两条相邻指令之间都会有两个周期的阻塞,这样每条指令相当于都要有3个时钟周期才能完成,因而CPI为3。
9. 假定在一个如图6.4所示的带“转发”功能的5段流水线中执行以下指令序列,则怎样调整以下指令序列才能使其性能达到最好?
```txt
1 lw $2, 100($6)
2 add $2, $2, $3
3 lw $3, 200($7)
4 add $6, $4, $7
5 sub $3, $4, $6
6 lw $2, 300($8)
7 beq $2, $8, Loop
【分析解答】
因为采用“转发”技术,所以,只要对load-use数据冒险进行指令序列调整。从上述指令序列来看,第1条和第2条指令、第6条和第7条指令之间存在load-use数据冒险,所以,可将与第2条和第3条指令无关的第4条指令插入第2条指令之前;将无关的第5条指令插入第7条指令之前。调整顺序后的指令序列如下(粗体部分为变换了位置的指令)。
1 lw $2, 100($6)
4 add $6, $4, $7
2 add $2, $2, $3
3 lw $3, 200($7)
6 lw $2, 300($8)
5 sub $3, $4, $6
7 beq $2, $8, Loop
10. 假设将分支指令中的分支比较操作放到5段流水线的“译码/取数(ID)”阶段进行,那么,下列指令序列的执行过程中,哪些数据冒险不能通过“转发”技术解决?
1 lw $1, 100($2)
2 addi $1, $1, 8
3 beq $1, $3, 10
【分析解答】
如图6.9所示,在给出的指令序列中,第1条和第2条指令之间的load-use数据冒险不能通过转发技术解决。对于第2条和第3条指令之间的数据冒险,如果分支比较操作在“执行(Ex)”阶段以后进行,则完全可以将第2条指令的执行结果(在Ex/Mem流水段寄存器
<!-- page: 182 -->
中)转发给在执行(Ex)阶段的beq指令所用的ALU输入端,但是,如果beq指令在ID阶段进行比较操作,因为在ID阶段的beq指令需要用到$1的值时,第2条addi指令还没有将$1的值在ALU中计算出来,因此来不及转发,因而beq指令的执行需要阻塞一个时钟周期。
图6.9 题10中的图示
11. 假设数据通路中各主要功能部件的操作时间是:存储器为 200ps;ALU 和加法器为 100ps;寄存器堆读口或写口为 50ps。程序中指令的组成比例是:取数 25%、存数 10%、ALU 类 52%、分支 11%、跳转 2%。假设非单周期处理器时的时钟周期取存储器存取时间的一半,MUX、控制单元、PC、扩展器和传输线路等的延迟都忽略不计,则下面的实现方式中,哪个最快?快多少?
(1) 单周期方式:每条指令在一个固定长度的时钟周期内完成。
(2) 多周期方式:每类指令时钟数为取数为7,存数为6。ALU为5,分支为4,跳转为4。
(3) 流水线方式:取指1、取指2、取数/译码、执行、存取1、存取2、写回7段流水线;没有结构冒险;数据冒险采用“转发”技术处理;load指令与后续各指令之间存在依赖关系的概率分别 1/2、1/4、1/8、……;分支延迟损失时间片为2,预测准确率为 75%;不考虑异常、中断和访问缺失引起的流水线冒险。