【分析解答】
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 【分析解答】
程序 P 中 100 条指令的循环被执行了 50 次,所以在 20000 个时钟周期中共执行了 5000 条指令,因此,系统 S 在执行程序 P 时的 CPI = 20000 / 5000 = 4。
3. 假定执行某种指令 I 需要 20 个时钟周期,该指令在程序中的出现频度为 10%,其他所有指令的平均 CPI 为 5,则 CPU 执行指令 I 所用时间占整个 CPU 时间的百分比是多少?如果通过对硬件进行改进,能使指令 I 的执行时间缩短为 10 个时钟周期,但同时会使 CPU 时钟周期延长 10%,你认为是否应该采取这种改进措施?
## 【分析解答】
假定 CPU 执行的所有指令条数为 $N$,时钟周期为 $T$,则 CPU 执行总时间为 $(20 \times 10\% + 5 \times 90\%) \times N \times T$,其中指令 I 所用时间为 $20 \times 10\% \times N \times T$,因此,CPU 执行指令 I 所用时间占整个 CPU 时间的百分比是 $20 \times 10\% \times N \times T / ((20 \times 10\% + 5 \times 90\%) \times N \times T) = 30.77\%$。如果改进后将指令 I 的执行时间缩短为 10 个时钟周期,时钟周期的长度延长 10%,则改进后 CPU 执行的总时间为 $(10 \times 10\% + 5 \times 90\%) \times N \times 1.1 \times T = 6.05 \times N \times T$,改进前的总时间为 $(20 \times 10\% + 5 \times 90\%) \times N \times T = 6.5 \times N \times T$,因而,改进后的性能是改进前的 $6.5 / 6.05 = 1.07$ 倍。由此可见,对硬件的这种改进措施能够提高 CPU 的性能。
4. 若有两个基准测试程序 P1 和 P2 在机器 M1 和 M2 上运行,假定 M1 和 M2 的价格分别是 5000 元和 8000 元,表 1.3 给出了 P1 和 P2 在 M1 和 M2 上所用的时间和指令条数。
表 1.3 P1 和 P2 在 M1 和 M2 上所用的时间和指令条数
[tbl-2.md](tbl-2.md)
请回答下列问题:
(1)对于 P1,哪台机器的速度快?快多少?对于 P2 呢?
(2)在 M1 上执行 P1 和 P2 的速度分别是多少 MIPS?在 M2 上的执行速度又各是多少?从执行速度来看,对于 P2,哪台机器的速度快?快多少?
(3)假定 M1 和 M2 的时钟频率各是 800MHz 和 1.2GHz,则在 M1 和 M2 上执行 P1 时的平均时钟周期数 CPI 各是多少?
(4)如果某个用户需要大量使用程序 P1,并且该用户主要关心系统的响应时间而不是吞吐率,那么,该用户需要大批购进机器时,应该选择 M1 还是 M2?为什么?(提示:从性价比方面考虑)
(5)如果另一个用户也需要购进大批机器,但该用户使用 P1 和 P2 一样多,主要关心的
<!-- page: 24 -->
也是响应时间,那么应该选择 M1 还是 M2?为什么?
## 【分析解答】
(1)对于程序 P1,M1 所花的执行时间是 M2 的 2 倍,故 M2 比 M1 快 1 倍;对于程序 P2,M2 所花的执行时间是 M1 的 2 倍,故 M1 比 M2 快 1 倍。
(2)在 M1 上 P1 的速度为 $200 / 1 = 200\mathrm{MIPS}$,P2 的速度为 $0.3 / 0.003 = 100\mathrm{MIPS}$;在 M2 上 P1 的速度为 $150 / 0.5 = 300\mathrm{MIPS}$,P2 的速度为 $0.42 / 0.006 = 70\mathrm{MIPS}$。从执行速度来看,对于 P2,因为 $100 / 70 \approx 1.43$,所以 M1 比 M2 快 0.43 倍。
(3)在 M1 上执行 P1 时的平均时钟周期数 CPI 为 $1 \times 800 / 200 = 4$;在 M2 上执行 P1 时的平均时钟周期数 CPI 为 $0.5 \times 1200 / 150 = 4$。
(4)考虑运行 P1 时 M1 和 M2 的性价比,因为该用户主要关心系统的响应时间,所以性价比中的性能主要考虑执行时间,其性能为执行时间的倒数。故性价比 $R = 1 /$(执行时间 × 价格)。R 越大说明性价比越高,即“执行时间 × 价格”的值越小则性价比越高。
对于程序 P1,M1 的性价比为 $R1 = 1 / (1 \times 5000)$,M2 的性价比为 $R2 = 1 / (0.5 \times 8000)$,根据计算,可知 $R2 > R1$,故 M2 的性价比高,应选择购买 M2。
(5)因为 P1 和 P2 需要同等考虑,所以需要考虑综合性能。有多种计算综合性能的方法,如执行时间总和、执行时间算术平均值、执行时间几何平均值等。
若用执行时间总和,则 M1 的性价比为 $R1 = 1 / (1003 \times 5000)$,M2 的性价比为 $R2 = 1 / (506 \times 8000)$,显然 $R2 > R1$,故 M2 的性价比高,应选择 M2。
若用算术平均值,则 M1、M2 上执行时间的算术平均值分别为 501.5ms 和 253ms。因此,M1 的性价比为 $R1 = 1 / (501.5 \times 5000)$,M2 的性价比为 $R2 = 1 / (253 \times 8000)$,显然 $R2 > R1$,故 M2 的性价比高,应选择 M2。
若用几何平均值,则 M1、M2 上执行时间的几何平均值都一样,约为 54.7。因此,M1 的性价比为 $R1 = 1 / (54.7 \times 5000)$,M2 的性价比为 $R2 = 1 / (54.7 \times 8000)$,显然 $R1 > R2$,故 M1 的性价比高,应选择 M1。
由此可见,用不同的综合性能计算方法得到的结论可能不同。
5. 假定 M1 和 M2 是以不同方式实现同一个指令集的两种机器,M1 的时钟频率为 $800\mathrm{MHz}$,M2 的时钟频率为 $400\mathrm{MHz}$。在该指令集中一共有 A、B 和 C 三类指令。有三种不同的编译器,其中 C1 和 C2 分别是 M1 和 M2 的生产厂商提供的,C3 是第三方编译器。假设对于同一个程序而言,三个编译器生成的程序代码中指令总数相等,但是指令的组合情况各不相同。各类指令在 M1 和 M2 上运行时所需的平均时钟周期数和在三类编译器生成的程序中所占的百分比如表 1.4 所示。
表 1.4 M1 和 M2 的 CPI 以及三个程序的指令频度
[tbl-3.md](tbl-3.md)
请回答下列问题:
(1)如果 M1 和 M2 都使用 C1 编译器,则 M1 的生产厂商可以声称其性能是 M2 的多
<!-- page: 25 -->
少倍?
(2)如果 M1 和 M2 都使用 C2 编译器,则 M2 的生产厂商可以声称其性能是 M1 的多少倍?
(3)如果你购买了 M1,那么你会选择哪种编译器?如果你购买了 M2,你又会选择哪种编译器?
(4)如果其他所有指标(包括价格)都相同,你会买哪台机器?
【分析解答】
(1)在 M1 和 M2 上都用 C1 编译器,则 M1 上的 CPI 为 $2 \times 30\% + 3 \times 50\% + 4 \times 20\% = 2.9$,M2 上的 CPI 为 $1 \times 30\% + 2 \times 50\% + 1.5 \times 20\% = 1.6$;M1 的时钟频率为 $800\mathrm{MHz}$,M2 的时钟频率为 $400\mathrm{MHz}$,所以,M1 上一条指令的平均执行时间为 $2.9 \times 1000 / 800 = 2.9 \times 1.25 = 3.625\mathrm{ns}$,M2 上一条指令的平均执行时间为 $1.6 \times 1000 / 400 = 1.6 \times 2.5 = 4\mathrm{ns}$;M1 的性能和 M2 的性能之比约为 $4 / 3.625 \approx 1.1$,所以,M1 的生产商可以声称 M1 的性能大约是 M2 的 1.1 倍。
(2)假定在 M1 和 M2 上都用 C2 编译器,则 M1 上的 CPI 为 $2 \times 30\% + 3 \times 20\% + 4 \times 50\% = 3.2$,M2 上的 CPI 为 $1 \times 30\% + 2 \times 20\% + 1.5 \times 50\% = 1.45$;M1 的时钟频率为 $800\mathrm{MHz}$,M2 的时钟频率为 $400\mathrm{MHz}$,所以,M1 上一条指令的平均执行时间为 $3.2 \times 1000 / 800 = 3.2 \times 1.25 = 4\mathrm{ns}$,M2 上一条指令的平均执行时间为 $1.45 \times 1000 / 400 = 1.45 \times 2.5 = 3.625\mathrm{ns}$;M2 的性能和 M1 的性能之比约为 $4 / 3.625 \approx 1.1$,所以,M2 的生产商可以声称 M2 的性能大约是 M1 的 1.1 倍。
(3)由上述分析可知,C1 编译器在 M1 上的性能比 M2 好,因此,如果购买了 M1,则编译器应选择 C1;同理,如果购买了 M2,则编译器应选择 C2。
(4)从上述(1)和(2)分析结果来看,用生产商各自自己的编译器无法衡量 M1 和 M2 的好坏,所以借助第三方提供的编译器 C3 来考查更客观。假定在 M1 和 M2 上都用 C3 编译器,则 M1 上的 CPI 为 $2 \times 50\% + 3 \times 30\% + 4 \times 20\% = 2.7$,M2 上的 CPI 为 $1 \times 50\% + 2 \times 30\% + 1.5 \times 20\% = 1.4$;M1 的时钟频率为 $800\mathrm{MHz}$,M2 的时钟频率为 $400\mathrm{MHz}$,所以,M1 上一条指令的平均执行时间为 $2.7 \times 1000 / 800 = 2.7 \times 1.25 = 3.375\mathrm{ns}$,M2 上一条指令的平均执行时间为 $1.4 \times 1000 / 400 = 1.4 \times 2.5 = 3.5\mathrm{ns}$;M1 的性能和 M2 的性能之比约为 $3.35 / 3.375 \approx 1.04$,用第三方编译器 C3 说明 M1 的性能大约是 M2 的 1.04 倍,因此,可选择购买 M1。
6. 若机器 M1 和 M2 具有相同的指令集,其时钟频率分别为 $0.8\mathrm{GHz}$ 和 $1.6\mathrm{GHz}$。在指令集中有 5 种不同类型的指令 $\mathrm{A} \sim \mathrm{E}$。表 1.5 给出了在 M1 和 M2 上每类指令的平均时钟周期数 CPI。
表 1.5 在 M1 和 M2 上每类指令的平均时钟周期数 CPI
[tbl-4.md](tbl-4.md)
请回答下列问题:
(1)M1 和 M2 的峰值 MIPS 各是多少?
<!-- page: 26 -->
(2) 假定某程序 P 的指令序列中,5 类指令具有完全相同的指令条数,则程序 P 在 M1 和 M2 上运行时,哪台机器更快?快多少?在 M1 和 M2 上执行程序 P 时的平均时钟周期数 CPI 各是多少?
【分析解答】
(1) 计算峰值 MIPS 时应该选择 CPI 最少的指令,故在 M1 上可以选择一段全部由 A 类指令组成的程序,其峰值 MIPS 为 $800 / 1 = 800 \mathrm{MIPS}$,在 M2 上可以选择一段全部由 A 类和 B 类指令组成的程序,其峰值 MIPS 为 $1600 / 2 = 800 \mathrm{MIPS}$。
(2) 对于程序 P,每类指令的条数均占 $1 / 5$,故 M1 的 CPI 为 $\mathrm{CPI}_1 = (1 + 2 + 2 + 3 + 4) / 5 = 2.4$,M2 的 CPI 为 $\mathrm{CPI}_2 = (2 + 2 + 4 + 5 + 6) / 5 = 3.8$。当然,不能根据以上结果说明程序 P 在 M1 上运行更快,因为 M1 和 M2 的时钟频率不同。
假设程序 P 的指令条数为 $N$,则 P 在 M1 上的执行时间为 $2.4 \times N \times 1 / 0.8 = 3.0N$(单位为 ns);在 M2 上的执行时间为 $3.8 \times N \times 1 / 1.6 = 2.375N$(单位为 ns),所以,M2 执行 P 的速度更快,每条指令平均快 $0.625\mathrm{ns}$。
从该题可以看出,虽然程序 P 在 M1 中每条指令执行所花的时钟周期数少,但是,因为 M2 的时钟频率更快,因而时钟周期更短,使得每条指令的平均执行时间更短。
7. 假设同一套指令集用不同的方法设计了两种机器 M1 和 M2。机器 M1 的时钟周期为 0.8ns,机器 M2 的时钟周期为 1.2ns。某个程序 P 在机器 M1 上运行时的 CPI 为 4,在 M2 上的 CPI 为 2。对于程序 P 来说,哪台机器的执行速度更快?快多少?
【分析解答】
因为 M1 和 M2 实现的是同一套指令集,所以程序 P 在机器 M1 和 M2 上的指令条数相同,假定是 N 条,则 P 在 M1 上的执行时间为 $4 \times 0.8 \times N = 3.2N$(单位为 ns);P 在 M2 上的执行时间为 $2 \times 1.2 \times N = 2.4N$(单位为 ns)。由此可知,对于程序 P 来说,M2 的执行速度更快,平均每条指令快 0.8ns。
8. 假设某机器 M 的时钟频率为 $2\mathrm{GHz}$,用户程序 P 在 M 上的指令条数为 $1 \times 10^{9}$,其 CPI 为 1.5,则 P 在 M 上的执行时间是多少?若在机器 M 上从程序 P 开始启动到执行结束所需的时间是 $2\mathrm{s}$,则程序 P 的用户 CPU 时间占用的百分比是多少?
【分析解答】
程序 P 在机器 M 上执行所需时钟周期数为 $1 \times 10^{9} \times 1.5 = 1.5 \times 10^{9}$,所需时间为 $1.5 \times 10^{9} / (2 \times 10^{9}) = 0.75\mathrm{s}$,程序 P 的用户 CPU 时间在 $2\mathrm{s}$ 内占用的百分比是 $0.75 / 2 \times 100\% = 37.5\%$。
9. 假定某编译器对某段高级语言程序编译生成两种不同的指令序列 S1 和 S2,在时钟频率为 $1\mathrm{GHz}$ 的机器 M 上运行,目标指令序列中用到的指令类型有 A、B、C 和 D 共 4 类。4 类指令在 M 上的 CPI 分别为 1、2、3、4,两个指令序列 S1 和 S2 所用的各类指令条数如表 1.6 所示。
表 1.6 两个指令序列所用的 4 类指令条数
[tbl-5.md](tbl-5.md)
<!-- page: 27 -->
请问 S1 和 S2 各有多少条指令?CPI 各为多少?所含的时钟周期数各为多少?执行时间各为多少?
## 【分析解答】
序列 S1 的指令条数为 $5 + 2 + 2 + 1 = 10$,CPI 为 $(5 \times 1 + 2 \times 2 + 2 \times 3 + 1 \times 4) / 10 = 1.9$,所含的时钟周期数为 $1.9 \times 10 = 19$,故执行时间为 $19 / (1 \times 10^{9}) \mathrm{s} = 19 \mathrm{~ns}$。
序列 S2 的指令条数为 $1 + 1 + 1 + 5 = 8$,CPI 为 $(1 \times 1 + 1 \times 2 + 1 \times 3 + 5 \times 4) / 8 = 3.25$,所含的时钟周期数为 $3.25 \times 8 = 26$,故执行时间为 $26 / (1 \times 10^{9}) \mathrm{s} = 26 \mathrm{~ns}$。
10. 假定机器 M 的时钟频率为 $200\mathrm{MHz}$,某程序 P 在机器 M 上的执行时间为 12s。对 P 优化时,将其所有的乘 4 指令都换成了一条左移 2 位的指令,得到优化后的程序 $\mathbf{P}^{\prime}$。若在 M 上乘法指令的 CPI 为 102,左移指令的 CPI 为 2,P 的执行时间是 $\mathbf{P}^{\prime}$ 执行时间的 1.2 倍,则 P 中有多少条乘法指令被替换成了左移指令执行?
## 【分析解答】
$\mathbf{P}^{\prime}$ 的执行时间为 $10\mathrm{s}$,$\mathbf{P}$ 比 $\mathbf{P}^{\prime}$ 多用了 $2\mathrm{s}$,即多 $200\times 10^{6}\times 2 = 4\times 10^{8}$ 个时钟周期,每条乘法指令比左移指令多 100 个时钟周期,因为 $4\times 10^{8} / 100 = 4\times 10^{6}$,即有 400 万条乘法指令被替换为左移指令执行。
11. 假定机器 M 在运行程序 P 的过程中,共执行了 $0.5 \times 10^{9}$ 条浮点数指令、$4 \times 10^{9}$ 条整数指令、$3 \times 10^{9}$ 条访存指令、$1 \times 10^{9}$ 条分支指令,这 4 种指令的 CPI 分别是 2、1、4、1。若要使程序 P 的执行时间减少一半,则浮点指令的 CPI 应如何改进?若要使程序 P 的执行时间减少一半,则访存指令的 CPI 应如何改进?若浮点数指令和整数指令的 CPI 减少 $20\%$,访存指令和分支指令的 CPI 减少 $40\%$,则程序 P 的执行时间会减少多少?
## 【分析解答】
程序 P 执行过程中,浮点、整数、访存、分支 4 类指令所用的时钟周期数分别为 $2 \times 0.5 \times 10^{9}$、$1 \times 4 \times 10^{9}$、$4 \times 3 \times 10^{9}$、$1 \times 1 \times 10^{9}$,总计为 $18 \times 10^{9}$。在执行总时间中 4 类指令占用的时间比例分别约为 $5.55\%$、$22.2\%$、$66.7\%$、$5.55\%$。
浮点、整数和分支指令相加后占比只有 $33.3\%$,未达到 $50\%$,因此单独改进浮点数指令或整数指令或分支指令,甚至三类指令同时改进,不管如何改进都不可能使 P 的执行时间减少一半。
假定程序 P 的执行时间减少一半(即性能提升到原来的 2 倍)时访存指令性能提升倍数为 $n$,根据 Amdahl 定律有 $2 = 1 / (0.667 / n + 0.333)$,得 $n = 4$。因此,访存指令的 CPI 应从 4 提升到 1。
若浮点数指令和整数指令的 CPI 减少 $20\%$,则这两种指令的时钟周期数变为 $80\% \times (1 + 4) \times 10^{9}$;若访存指令和分支指令的 CPI 减少 $40\%$,则这两种指令的时钟周期数变为 $60\% \times (12 + 1) \times 10^{9}$。4 类指令的时钟周期数总计变为 $11.8 \times 10^{9}$,因此,程序 P 的执行时间会减少 $(18 - 11.8) \times 10^{9} / (18 \times 10^{9}) \approx 34.4\%$。
<!-- page: 28 -->
# 第2章 数据的机器级表示
## 2.1 教学目标和内容安排
主要教学目标:使学生掌握计算机内部各种数据的机器级表示,并能将这些知识熟练运用到高级语言和机器级语言的编程和调试工作中。
### 基本学习要求:
(1) 了解真值和机器数的含义。
(2) 了解无符号整数的含义、用途和表示。
(3) 了解带符号整数的表示方法。
(4) 理解为什么现代计算机都用补码表示带符号整数。
(5) 掌握在真值和各种编码表示数之间进行转换的方法。
(6) 了解浮点数表示格式及其与表示精度和表示范围之间的关系。
(7) 掌握规格化浮点数的概念和浮点数规格化方法。
(8) 掌握 IEEE 754 标准,并能在真值与单精度格式浮点数之间进行转换。
(9) 能运用数据表示知识解释和解决高级语言编程中数据表示和转换问题。
(10) 掌握常用的十进制数的二进制编码方法,如 8421 码。
(11) 了解逻辑数据、西文字符和汉字字符的常用表示方法,如 ASCII 码、GB 2312。
(12) 了解常用数据长度单位的含义,如 b、B、KB、MB、GB、TB 等。
(13) 了解大端和小端排列方式。
本章内容相对比较容易,学生也比较熟悉,对于信息的二进制表示、进位记数制等简单内容,完全可以让学生自学。如果课时不充裕,对于十进制数的表示和汉字字符编码部分,也可以只简单介绍其概要内容,细节部分留给学生课后阅读。关于高级语言中的各种数据类型与机器级数据表示之间的关系,应该要求学生掌握,这对于提高学生程序设计和调试能力起到很大的作用。其实,这部分内容很简单,只要在教学过程中提醒学生关注并进行一些编程练习就能达到目的,而且程序设计课程中大多也会介绍这部分内容。
对于本章内容,教学过程中普遍存在的问题是,学生缺乏将机器级数据表示和程序设计及程序调试工作相互关联的意识。许多学生也许对机器级数据表示的基本原理和概念很了解,但在程序设计和调试工作中,往往不会运用所学知识解决实际问题,不会把高级语言中的类型定义、数值范围、数据类型转换等问题和本课程所学的知识联系起来,因而,所学知识
<!-- page: 29 -->
没有起到真正的作用。
为了增强学生对机器级数据表示的认识,可以让学生亲自编写相关的程序,通过程序的执行结果来理解本章所学的知识。与本章内容相关的编程练习可以有很多,例如:①编程得出主教材第2章习题8表中的结果;②确定float型变量和double型变量的精度;检查一些特殊表达式的运行结果,如一个非零整数除以0、一个非零实数除以0、0除以0、负数开平方等;③检查机器是大端还是小端方式数据;④检查数据是对齐存放还是不对齐存放。