1、第 1 章 习 题 答 案5若有两个基准测试程序 P1 和 P2 在机器 M1 和 M2 上运行,假定 M1 和 M2 的价格分别是 5000 元和8000 元,下表给出了 P1 和 P2 在 M1 和 M2 上所花的时间和指令条数。M1 M2程序指令条数 执行时间(ms) 指令条数 执行时间(ms)P1 200106 10000 150106 5000P2 300103 3 420103 6请回答下列问题:(1) 对于 P1,哪台机器的速度快?快多少?对于 P2 呢?(2) 在 M1 上执行 P1 和 P2 的速度分别是多少 MIPS?在 M2 上的执行速度又各是多少?从执行速度来看,对于
2、P2,哪台机器的速度快?快多少?(3) 假定 M1 和 M2 的时钟频率各是 800MHz 和 1.2GHz,则在 M1 和 M2 上执行 P1 时的平均时钟周期数 CPI 各是多少? (4) 如果某个用户需要大量使用程序 P1,并且该用户主要关心系统的响应时间而不是吞吐率,那么,该用户需要大批购进机器时,应该选择 M1 还是 M2?为什么?(提示:从性价比上考虑)(5) 如果另一个用户也需要购进大批机器,但该用户使用 P1 和 P2 一样多,主要关心的也是响应时间,那么,应该选择 M1 还是 M2?为什么?参考答案:(1) 对于 P1,M2 比 M1 快一倍;对于 P2,M1 比 M2 快一
3、倍。(2) 对于 M1,P1 的速度为:200M/10=20MIPS;P2 为 300k/0.003=100MIPS。对于 M2,P1 的速度为: 150M/5=30MIPS;P2 为 420k/0.006=70MIPS。从执行速度来看,对于 P2,因为 100/70=1.43 倍,所以 M1 比 M2 快 0.43 倍。 (3) 在 M1 上执行 P1 时的平均时钟周期数 CPI 为:10800M/(20010 6)=40。在 M2 上执行 P1 时的平均时钟周期数 CPI 为:51.2G/(15010 6)=40。(4) 考虑运行 P1 时 M1 和 M2 的性价比,因为该用户主要关心系统
4、的响应时间,所以性价比中的性能应考虑执行时间,其性能为执行时间的倒数。故性价比 R 为:R=1/(执行时间 价格)R 越大说明性价比越高,也即,“执行时间价格” 的值越小,则性价比越高。因为 105000 58000,所以, M2 的性价比高。应选择 M2。(5) P1 和 P2 需要同等考虑,性能有多种方式:执行时间总和、算术平均、几何平均。若用算术平均方式,则:因为 (10+0.003)/25000 (5+0.006)/28000,所以 M2 的性价比高,应选择 M2。若用几何平均方式,则:因为 sqrt(100.003) 5000 2147483647 12147483647U 2147
5、483647 12147483647 (int) 2147483648U1 2(unsigned) 1 2无符号整数有符号整数无符号整数有符号整数无符号整数有符号整数有符号整数无符号整数11010 111000B = 000B111B (1) 000B(0)0111B (2311) 1000B (231)0111B (2311) 1000B (231)111B (1) 1110B (2)111B (2321) 1110B (2322)9以下是一个 C 语言程序,用来计算一个数组 a 中每个元素的和。当参数 len 为 0 时,返回值应该是0,但是在机器上执行时,却发生了存储器访问异常。请问这是
6、什么原因造成的,并说明程序应该如何修改。1 float sum_elements(float a, unsigned len)2 3 int i;4 float result = 0;56 for (i = 0; i 24);int func2(unsigned word)return ( (int) word 24;假设在一个 32 位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写下表,并说明函数 func1 和 func2 的功能。W func1(w) func2(w)机器数 值 机器数 值 机器数 值0000 007FH 12
7、7 0000 007FH +127 0000 007FH +1270000 0080H 128 0000 0080H +128 FFFF FF80H 1280000 00FFH 255 0000 00FFH +255 FFFF FFFFH 10000 0100H 256 0000 0000H 0 0000 0000H 0函数 func1 的功能是把无符号数高 24 位清零(左移 24 位再逻辑右移 24 位) ,结果一定是正的有符号数;而函数 func2 的功能是把无符号数的高 24 位都变成和第 25 位一样,因为左移 24 位后进行算术右移,高 24 位补符号位(即第 25 位) 。4填写
8、下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。x y xy(截断前) xy(截断后)模式机器数 值 机器数 值 机器数 值 机器数 值无符号数 110 6 010 2 001100 12 100 4二进制补码 110 2 010 +2 111100 4 100 4无符号数 001 1 111 7 000111 7 111 7二进制补码 001 +1 111 1 111111 1 111 1无符号数 111 7 111 7 110001 49 001 1二进制补码 111 1 111 1 000001 +1 001 +15以下是两段 C 语言代码,函数 arith( )是直接用 C 语言写的,而 optarith( )是对 arith( )函数以某个确定的 M 和 N 编译生成的机器代码反编译生成的。根据 optarith( ),可以推断函数 arith( ) 中 M 和N 的值各是多少?#define M #define N int arith (int x, int y)int result = 0 ;result = x*M + y/N; return result;int optarith ( int x, int y)int t = x;x 2;return x+y;