6.若机器M1和M2具有相同的指令集,其时钟频率分别为1GHz和1.5GHz。
在指令集中有五种不同类型的指令A~E。
下表给出了在M1和M2上每类指令的平均时钟周期数CPI。
机器
A
B
C
D
E
M1
1
2
2
3
4
M2
2
2
4
5
6
请回答下列问题:
(1)M1和M2的峰值MIPS各是多少?
(2)假定某程序P的指令序列中,五类指令具有完全相同的指令条数,则程序P在M1和M2上运行时,哪台机器更快?
快多少?
在M1和M2上执行程序P时的平均时钟周期数CPI各是多少?
参考答案:
(1)M1上可以选择一段都是A类指令组成的程序,其峰值MIPS为1000MIPS。
M2上可以选择一段A和B类指令组成的程序,其峰值MIPS为1500/2=750MIPS。
(2)5类指令具有完全相同的指令条数,所以各占20%。
在M1和M2上执行程序P时的平均时钟周期数CPI分别为:
M1:
20%×(1+2+2+3+4)=0.2×12=2.4
M2:
20%×(2+2+4+5+6)=0.2×19=3.8
假设程序P的指令条数为N,则在M1和M2上的执行时间分别为:
M1:
2.4×N×1/1G=2.4N(ns)
M2:
3.8×N×1/1.5G=2.53N(ns)
M1执行P的速度更快,每条指令平均快0.13ns,也即M1比M2快0.13/2.53×100%≈5%。
(思考:
如果说程序P在M1上执行比M2上快(3.8–2.4)/3.8×100%=36.8%,那么,这个结论显然是错误的。
请问错在什么地方?
)
第二章
(1)大端方式:
将数据的最高有效字节MSB存放在低地址单元中,将最低有效字节LSB存放在高地址单元中,即数据的地址就是MSB所在的地址。
(2)小端方式:
将数据最高有效字节MSB存放在高地址中,将最低有效字节LSB存放在低地址中,即数据的地址就是LSB所在的地址。
7.假定一台32位字长的机器中带符号整数用补码表示,浮点数用IEEE754标准表示,寄存器R1和R2的内容分别为R1:
0000108BH,R2:
8080108BH。
不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。
假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?
(1)无符号数加法指令
(2)带符号整数乘法指令
(3)单精度浮点数减法指令
参考答案:
R1=0000108BH=00000000000000000001000010001011b
R2=8080108BH=10000000100000000001000010001011b
(1)对于无符号数加法指令,R1和R2中是操作数的无符号数表示,因此,其真值分别为R1:
108BH,R2:
8080108BH。
(2)对于带符号整数乘法指令,R1和R2中是操作数的带符号整数补码表示,由最高位可知,R1为正数,R2为负数。
R1的真值为+108BH,R2的真值为–(01111111011111111110111101110100b+1b)=–7F7FEF75H。
(3)对于单精度浮点数减法指令,R1和R2中是操作数的IEEE754单精度浮点数表示。
在IEEE754标准中,单精度浮点数的位数为32位,其中包含1位符号位,8位阶码,23位尾数。
由R1中的内容可知,其符号位为0,表示其为正数,阶码为00000000,尾数部分为00000000001000010001011,故其为非规格化浮点数,指数为–126,尾数中没有隐藏的1,用十六进制表示尾数为+0.002116H,故R1表示的真值为+0.002116H×10-126。
由R2中的内容可知,其符号位为1,表示其为负数,阶码为00000001,尾数部分为00000000001000010001011,故其为规格化浮点数,指数为1–127=–126,尾数中有隐藏的1,用十六进制表示尾数为–1.002116H,故R2表示的真值为–1.002116H×10-126
符号
阶码
尾数
尾数23位表示24位,52位表示23位,其中一位隐藏位。
隐藏位在小数点之前
1位(s)8位(e)23位(f)
8.假定机器M的字长为32位,用补码表示带符号整数。
下表第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
关系表达式
运算类型
结果
说明
0==0U
–1<0
–1<0U
2147483647>–2147483647–1
2147483647U>–2147483647–1
2147483647>(int)2147483648U
–1>–2
(unsigned)–1>–2
无符号整数
有符号整数
无符号整数
有符号整数
无符号整数
有符号整数
有符号整数
无符号整数
1
1
0
1
0
1
1
1
00…0B=00…0B
11…1B(–1)<00…0B(0)
11…1B(232–1)>00…0B(0)
011…1B(231–1)>100…0B(–231)
011…1B(231–1)<100…0B(231)
011…1B(231–1)>100…0B(–231)
11…1B(–1)>11…10B(–2)
11…1B(232–1)>11…10B(232–2)
(1)带符号整数符号位1表示负数,0表示正数。
(2)无符号整数常在后加U或u。
(3)结果1表示真,0表示假。
(4)x=2^32-1=4294967296-1=4294967295=-1,-1的补码表示为“11...1.”
x=2^31=-2^-31=-2147483648,2^31表示为“100...0”
第三章
(1)算术逻辑部件ALU:
能实现多组算术运算和逻辑运算的组合逻辑电路。
(2)先行(超前)进位加法器:
通过“进位生成”和“进位传递”函数来使各进位独立,并行产生速度快,可用单级,两级或更多级先行进位方式。
(3)布斯乘法:
一种补码相乘算法。
可以将符号位和数值位结合在一起参加运算,直接得出用补码表示的乘积,且正数和负数同等对待。
(4)阵列乘法器:
基于移位与求和算法实现。
每一行被乘数与乘数中的一位相乘,产生一组部分积。
(5)数据通路:
数字系统中,各个子系统通过数据总线形成的数据传送路径。
9.已知x=10,y=-6,采用6位机器数表示。
请按如下要求计算,并把结果还原成真值。
(1)求[x+y]补,[x-y]补。
解:
原码:
符号位+数值位(符号位“0”正,“1”负)
正数:
原码、反码、补码一致
负数:
(1)反码:
符号位不变,数值位按位取反。
(2)补码:
符号位不变,数值位按位取反后加“1”。
移码:
与补码的符号位相反,用于表示阶码。
(阶码即浮点数指数,用移码表示)
(1)解:
[10]补=001010[-6]=000110,故[-6]补=111010
二进制加法:
0+0=0,1+0=1,0+1=1,1+1=10
[x+y]补=[10]补+[-6]补=001010+111010=1001100(超出的最高位去掉)=001100(+4)
[x-y]补=[10]补+[-(-6)]补=001010+000110=010000(+16)
用MBA(基4布斯)乘法计算[x×y]补。
解:
[–10]补=110110,布斯乘法过程如下:
PYy-1说明
0000001110100设y-1=0,[P0]补=0注释:
初始化,Y-1补0
y0y-1=00,P、Y直接右移一位
0000000111010得[P1]补注释:
将最低两位Y0Y-1来判断执行
+110110y1y0=10,+[–X]补
110110P、Y同时右移一位
右移一位
1110110011101(右移一位)得[P2]补
+001010y2y1=01,+[X]补
000101P、Y同时右移一位
0000101001110得[P3]补
+1101101001110y3y2=10,+[–X]补
111000P、Y同时右移一位
1111000100111得[P4]补
+0000000100111y4y3=11,+0
111100P、Y同时右移一位
1111100010011得[P5]补
+0000000010011y5y4=11,+0
111110P、Y同时右移一位
1111110001001得[P6]补
因此,[X×Y]补=111111000100,即X×Y=–111100B=–60
第四章
(1).静态RAM(SRAM):
具有静止存取功能的内存,不需要刷新电路,也能保存它内存存储的数据。
(2)动态RAM(DRAM):
只能将数据保持很短的时间,必须隔一段时间刷新一次。
如果存储单元没有被刷新,存储的信息就会丢失。
(3)片送信号:
指传统南北桥架构的主板中,地址线和数据线分开的BIOS芯片里的22脚的那个信号,可以初步判断南北桥级CPM是否开始工作。
(4)时间局部性:
某单元在一个很短的时间段内可能被重复访问。
(5)空间局部性:
某单元被访问后,其邻进单元也可能被访问。
(6)命中时间:
命中时,CPM在cache中直接存取信息所用的时间。
(7)缺失率:
访问信息不再cache中的概率。
(8)LRU:
最近最少用算法,总是把最近最少用到的那个主存块淘汰掉。
4.10假定某机主存空间大小1GB,按字节编址。
cache的数据区(即不包括标记、有效位等存储区)有64KB,块大小为128字节,采用直接映射和全写(write-through)方式。
请问:
(1)主存地址如何划分?
要求说明每个字段的含义、位数和在主存地址中的位置。
标记
Cache行号
块内地址
解:
主存空间大小为1GB,按字节编址,说明主存地址为30位(1GB=2^30B=2^20KB=2^10MB,1B=8bit)主存地址
(直接映射)
cache共有64KB/128B=512行,因此,行索引(行号)为9位(2^9=512行);块大小128字节(2^7=128B),说明块内地址为7位。
因此,30位主存地址中,高14位为标志(Tag);中间9位为行索引;低7位为块内地址。
(2)cache的总容量为多少位?
解:
因为采用直接映射,所以cache中无需替换算法所需控制位,全写方式下也无需修改(dirty)位,而标志位和有效位总是必须有的,所以,cache总容量为512×(128×8+14+1)=519.5K位。
4.13分析比较以下三个函数的空间局部性,并指出哪个最好,哪个最差?
#defineN1000
typedefstruct{
intvel[3];
intacc[3];
}point;
pointp[N];
voidclear3(point*p,intn)
{
inti,j;
for(j=0;j<3;j++){
for(i=0;ip[i].vel[j]=0;
for(i=0;ip[i].acc[j]=0;
}
}
对于函数clear1,其数组访问顺序与在内存的存放顺序完全一致,因此,空间局部性最好。
对于函数clear2,其数组访问顺序在每个数组元素内跳越式访问,相邻两次访问的单元最大相差3个int型变量(假定sizeof(int)=4,则相当于12B),因此空间局部性比clear1差。
若主存块大小比12B小的话,则大大影响命中率。
对于函数clear3,其数组访问顺序与在内存的存放顺序不一致,相邻两次访问的单元都相差6个int型变量(假定sizeof(int)=4,则相当于24B)因此,空间局部性比clear2还差。
若主存块大小比24B小的话,则大大影响命中率。
3.17假设某计算机的主存地址空间大小为64MB,采用字节编址方式。
其cache数据区容量为4KB,采用4路组相联映射方式、LRU替换和回写(writeback)策略,块大小为64B。
请问:
(1)主存地址字段如何划分?
要求说明每个字段的含义、位数和在主存地址中的位置。
2^s路组相联映射(2^q组×2^s行/组映射):
S=1,为2-路组相联,S=2,为4-路组相联。
n=m+q+k,64B=2^6bit/行,即k=6,2^6字节/行
S=2,即2^2行/组
故,有2^4组
解:
(1)主存地址:
标记
(m)
Cache组号
(q)
块内地址
(k)
cache的划分为:
4KB=212B=24组×22行/组×26字节/行,所以,cache组号(组索引)占4位。
(主存地址n=12位)
主存地址划分为三个字段:
高16位为标志字段、中间4位为组号、最低6位为块内地址。
即主存空间划分为:
64MB=226B=216组群×24块/组群×26字节/块
(2)该cache的总容量有多少位?
解:
cache共有64行,每行中有16位标志、1位有效位、1位修改(dirty)位、2位LRU位,以及数据64B。
故总容量为64×(16+1+1+2+64×8)=34048位。
(3)若cache初始为空,CPU依次从0号地址单元顺序访问到4344号单元,重复按此序列共访问16次。
若cache命中时间为1个时钟周期,缺失损失为10个时钟周期,则CPU访存的平均时间为多少时钟周期?
解:
因为每块为64B,CPU访问的单元范围为0~4344,共4345个单元,4345/64=67.89,所以CPU访问的是主存前68块(第0~67块),也即CPU的访问过程是对前68块连续访问16次,总访存次数为16×4345=69520。
cache共有16组,每组4行,采用LRU算法的替换情况如下图所示:
根据图中所示可知,第一次循环的每一块只有第一次未命中,其余都命中;以后15次循环中,有20块的第一字未命中,其余都命中。
所以命中率p为(69520–68–15×20)/69520=99.47%
平均访存时间为:
HitTime+(1–p)×MissPenalty
=1+10×(1–p)=1+0.0053×10=1.053个时钟周期
第五章
(1)指令:
告诉计算机从事某一事物特殊运算的代码。
(2)指令集体系结构ISA:
系统程序员感觉到的计算机的功能特征和概念特征结构。
(3)寻址方式:
指令给出操作数或操作数地址的方式。
(4)CISC:
复杂指令系统计算。
(5)RISC:
精简指令系统计算机。
3.以下程序段是某个过程对应的指令序列。
入口参数inta和intb分别置于$a0和$a1中,返回参数是该过程的结果,置于$v0中。
要求为以下MIPS指令序列加注释,并简单说明该过程的功能。
add$t0,$zero,$zero
loop:
beq$a1,$zero,finish
add$t0,$t0,$a0
sub$a1,$a1,1
jloop
finish:
addi$t0,$t0,100
add$v0,$t0,$zero
假定过程P调用过程Q:
(1)$ao~$a3用于传递前4个非浮点数入口参数,在过程P中应先将入口参数送入$ao~$a3,然后调用Q.(P将入口参数放到Q能访问到的地方)
(2)$vo~$v1用于传递从Q返回的非浮点数返回参数。
(P将返回地址存到特定的地方,然后将控制转移到Q)
(3)$ra用于存放返回地址,由调用指令(jal)自动将返回地址送入$ra.(Q为P保存现场,并为自己局部变量分配空间)
(4)$s0~$s7在过程P中原来的老值从过程Q返回后可被P继续使用,因此,若在过程Q中使用这些寄存器,则必须现将其保存到栈后才能是使用,并在返回P前回复,因此,它们被称为保存寄存器。
(执行过程Q)
(5)$t0~$t9的值,从过程Q返回后在P中不在需要使用,若需要则有P自己保存,因此,在过程Q中不需对其进行保存,可以自由使用,因此称它们为临时寄存器(Q将返回结果放到P能访问到的地方)
(6)$a0~$a3的值从过程Q返回后在P中也不再需要使用,若需要则由P自己保存,因此,在过程Q不需要为过程p保存(Q取出返回地址,将控制转移到P)
类别
指令名称
汇编举例
含义
备注
算术算法
add
add$s1,$s2,$s3
$s1=$s2+$3
三个寄存器操作数
Subtract
sub$s1,$s2,$s3
$s1=$s2-$s3
三个寄存器操作数
存储访问
Loadword
Lw$s1,100($s2)
$s1=Memory[$s2+100]
从内存取一个字到寄存器
storeword
Sw$s1,100($s2)
Memory[$s2+100]=$s1
从寄存器存一个字到内存
逻辑运算
and
And$s1,$s2,$s3
$s1=$s2&$s3
三个寄存器操作数,按位与
or
or$s1,$s2,$s3
$s1=$s2|$s3
三个寄存器操作数,按位或
nor
nor$s1,$s2,$3
$s1=~($s2|$s3)
三个寄存器操作数,三个寄存器数,按位或非
andimmediate
andi$s1,$2,100
$s1=$s2&100
寄位器和常数,按位与
orimmediate
ori$s1,$2,100
$s1=$s2|100
寄位器和常数,按位或
shiftleftlogical
Sll$s1,$2,10
$s1=$s2《10
按常数对寄存器逻辑左移
shiftrightlogical
Srl$s1,$2,10
$s1=$s2》10
按常数对寄存器逻辑右移
条件分支
braanchonequal
Beq$s1,$s2,L
If($s1==$s2)gotoL
相等则转移
Branchonnotequal
Bne$s1,$s2,L
bne($s1!
==$s2)gotoL
不相等则转移
setonlessthane
Slt$s1,$2,$3
setonlessthanimmediate
Slti$s1,$s2,100
无条件跳转
jump
jL
gotoL
直接跳转至目标地址
Jumpregister
Jr$ra
goto$ra
过程返回
Jumpandlink
JalL
$ra=PC+4,gotoL
过程调用
指令
格式
add
R
sub
R
lw
I
Rse
I
and
R
or
R
nor
R
andi
I
ori
I
sll
R
srl
R
Rbeq
I
bne
I
slt
R
j
J
jr
R
jal
J
R型指令是RR型指令,I型指令是立即数指令,J型指令主要是无条件跳转指令。
解:
1:
将t0寄存器置零
2:
如果a1的值等于零则程序转移到finish处
3:
将t0和a0的内容相加,结果存放于t