计算机组成与系统结构课后答案全清华大学出版社袁春风主编 下载本文

add $rs, $rs, $rt

(2)假定该指令占x%,其他指令占(1-x)%

则用硬件实现该指令时, 程序执行时间为原来的1.1*(x+1-x) =1.1 倍 用软件实现该指令时,程序执行时间为原来的3x+1-x =(2x+1)倍 当1.1 < 2x+1 时,硬件实现才有意义 由此可知,x > 5%

9. 假定图6.33多周期数据通路对应的控制逻辑发生错误,使得在任何情况下控制信号PCWr、IRWr、RegWr、BrWr、PCSource、MemWr、MemtoReg、PCWrCond、R-type总是为0,则哪些指令不能正确执行?为什么? 参考答案:

若PCWr=0,则所有指令都不正确,因为无法更新PC

若IRWr=0,则所有指令都不能正确执行,因为IR中不能写入指令

若RegWr=0,则所有需要写结果到寄存器的指令(如:R-Type指令、load指令等)都 不能正确执行,因为寄存器不发生写操作

若BrWr=0,则Branch指令不能正确执行,因为投机计算的分支地址无法送入寄存器 若PCSource=00,则除j之外的其他指令都不能正确得到下条指令地址 若MemWr=0,则Store指令不能正确执行,因为存储器不能写入数据 若MemtoReg=0,则所有Load指令执行错误,因为寄存器写入的是ALU输出 若PCWrCond=0,则Branch指令不能正确执行,因为不能写入转移目标地址到PC 若R-type=0,则所有R-type指令的执行可能出错

10. 假定P.185图6.32多周期数据通路对应的控制逻辑发生错误,使得在任何情况下控制信号PCWr、IRWr、RegWr、BrWr、PCSource、MemWr、MemtoReg、PCWrCond、R-type总是为1,则哪些指令不能正确执行?为什么? 参考答案:

若PCWr=1,则程序执行顺序失控,因为每个时钟都会更新PC

若IRWr=1,则所有指令都可能不能正确执行,因为写入IR的可能不是当前指令 若RegWr=1,则所有不需写结果到寄存器的指令(如:sw、beq等)都不能正确执行

若BrWr=1,则Branch指令不能正确执行,因为运算阶段的ALU输出也会放入寄存器,成为错误的分支转移目标地址。

若PCSource=01,则j和Branch指令不能正确得到下条指令地址 若MemWr=1,则除Store指令外的所有指令都不能正确执行 若MemtoReg=1,则除Load外的所有指令执行错误

若PCWrCond=1,则除Branch外的其他指令可能不能正确执行 若R-type=1,则所有非R-type指令的执行可能出错

12. 假定某计算机字长16位,标志寄存器Flag中的ZF、NF和VF分别是零、负和溢出标志,采用双字节定长指令字。假定Bgt (大于零转移) 指令的第一个字节指明操作码和寻址方式,第二个字节为偏移地址Imm8,其功能是:

若(ZF+(NF⊕VF)=0) 则 PC=PC+2+Imm8 否则 PC=PC+2 (1) 该计算机的编址单位是什么? (2) 画出实现Bgt指令的数据通路。 参考答案:

(1)该计算机的编址单位是字节。

因为PC的增量是2,且每条指令占2个字节,所以编址单位是字节。

(2)实现Bgt指令的数据通路如下

根据“大于”条件判断表达式,可以看出该bgt指令实现的是带符号整数比较。因为无符号数比较时,其判断表达式中没有溢出标志OF。偏移地址Imm8为补码表示,转移目标地址可能在bgt指令之前,也可能在bgt指令之后。计算转移目标地址时,偏移量为Imm8, 范围为-128~127,故转移目标地址的范围是PC+2+(-128)~PC+2+127

如果偏移量为Imm8x2, 转移目标地址的范围是PC+2+(-128×2)~PC+2+127×2,其实意味着相对于bgt指令的前127条指令到后128条指令之间。

IR

OP MOD Imm8 PC +2 ZF NF VF 1 0 Bgt

13. 对于多周期MIPS处理器,假定将访问数据的过程分成两个时钟周期可使时钟频率从4.8GHz提高到

5.6GHz,但会使得lw和sw指令增加时钟周期数。已知基准程序CPUint 2000中各类指令的频率为:Load: 25%,Store: 10%,Branch: 11%,Jump: 2%,ALU: 52%。以基准程序CPUint 2000为标准计算时钟频率提高后处理器的性能提高了多少?若将取指令过程再分成两个时钟周期,则可进一步使时钟频率提高到6.4GHz,此时,时钟频率的提高是否也能带来处理器性能的提高?为什么? 参考答案:

三种频率的机器上,各类指令的百分比和 CPI M1 4.8GHz M2 5.6GHz M3 6.4GHz Load 25% 5 6 7 Store 10% 4 5 6 Branch 11% 3 3 4 Jump 2% 3 3 4 ALU 52% 4 4 5 三种机器的平均CPI和MIPS

CPIofM1=25%x5+10%x4+11%x3+2%x3+52%x4=4.12 CPIofM2=25%x6+10%x5+11%x3+2%x3+52%x4=4.47 CPIofM3=25%x7+10%x6+11%x4+2%x4+52%x5=5.47 MIPSofM1=4.8G / 4.12 =1165 MIPSofM2=5.6G / 4.47 = 1253 MIPSofM3=6.4 G / 5.47 = 1170

由此可见,数据存取改为双周期的做法效果较好。进一步把取指令改为双周期的做法反而使MIPS数变小了,所以不可取。因为数据存取只涉及到load/Store指令,而指令存取涉及到所有指令,使得CPI显着提高。

15. 微程序控制器容量为1024×48位,微程序可在整个控存内实现转移,反映所有指令执行状态转换的有

限状态机中有4个分支点,微指令采用水平格式,微地址由专门的下地址字段确定。请设计微指令的格式,说明各字段有多少位?为什么? 参考答案:

微程序控制器容量为1024×48位,说明微地址占10位,微指令字共48位,其中10位下地址字段用来给

出下条微地址;转移控制字段需要对5种情况进行控制,需3位。例如, 000:取指令微指令首地址

100:根据分支1处的条件选择下条微地址 101:根据分支2处的条件选择下条微地址

110:根据分支3处的条件选择下条微地址 111:根据分支4处的条件选择下条微地址 剩下的48-10-3=35位用来表示微操作码字段。

(如果采用计数器法,则转移控制字段需要对6种情况进行控制,比上述5种情况多一种:即顺序执行下条微指令,此时,也要3位。)

也可以用5位作为转移控制字段, 33位作为微操作码字段 00001,00010,00100,01000,10000

------------------其它

16. 对于多周期CPU的异常和中断处理,回答以下问题:

(1)对于除数为0、溢出、无效指令操作码、无效指令地址、无效数据地址、缺页、访问越权和外部

中断, CPU在哪些指令的哪个时钟周期能分别检测到这些异常或中断?

(2)在检测到某个异常或中断后,CPU通常要完成哪些工作?简要说明CPU如何完成这些工作? (3)TLB缺失和cache缺失各在哪个指令的哪个时钟周期被检测到?如果检测到发生了TLB缺失和cache

缺失,那么,CPU各要完成哪些工作?简要说明CPU如何完成这些工作?(提示:TLB缺失可以有软件和硬件两种处理方式。) 部分参考答案:

a. “除数为0”异常在取数/译码(ID/Reg)周期进行检测 b. “溢出”异常在R-Type指令的执行(Exe)周期进行检测 c. “无效指令”异常在取数/译码(ID/Reg)周期进行检测

d. “无效指令地址”、“缺页”和“访问越权”异常在取指令(IF)周期检测

e. “无效数据地址”、“缺页”和“访问越权”异常在存储器访问(Mem)周期检测

f. “中断”可在每条指令的最后一个周期(WB)的最后进行检测

11. 假定有一条MIPS伪指令“Bcmp $t1, $t2, $t3”,其功能是实现对两个主存块数据的比较,$t1和$t2中分

别存放两个主存块的首地址,$t3中存放数据块的长度,每个数据占四个字节,若所有数据都相等,则将0置入$t1;否则,将第一次出现不相等时的地址分别置入$t1和$t2并结束比较。若$t4和$t5是两个空闲寄存器,请给出实现该伪指令的指令序列,并说明在类似于P.185图6.32的多周期数据通路中执行该伪指令时要用多少时钟周期。 参考答案:

(1)实现伪指令“bcmp $t1, $t2, $t3”的指令序列如下。

beq $t3, $zero, done lw $t4, 0($t1) lw $t5, 0($t2)

# 若数据块长度为0,则结束 # 块1的当前数据取到$t4 # 块2的当前数据取到$t5 # $t4和$t5的内容不等,则结束 # 块1中的当前数据指向下一个 # 块2中的当前数据指向下一个 # 比较次数减1

compare:

bne $t4, $t5, done addi $t1, $t1, 4 addi $t2, $t2, 4 addi $t3, $t3, -1

bne $t3, $zero, compare # 若没有全部比较完,则继续比较 addi $t1, $zero, 0 # 若全部都相等,则将$t1置0

done:

(2)在多周期数据通路执行时,上述程序段中用到的指令beq、lw、bne和addi的时钟周期数分别为3、5、3和4。若比较的数据块大小为50个字,则上述指令序列中的循环(粗体部分)最多被执行50次,因而所需的指令数最多为1+50×7+1=352。其中,load指令为50×2=100条,时钟周期数为5×100=500;branch指令数为1+2×50=101,时钟周期数为3×101=303;addi指令数为1+3×50=151,时钟周期数为4×151=604。所以,总时钟周期数最多为500+303+604=1407。

习题

1. 给出以下概念的解释说明。

指令流水线(Instruction pipelining)

指令吞吐量(Instruction throughput)

流水线深度(Pipeline Depth) 流水线冒险(Hazard)