文章目录
用于计算机组成原理期末复习,教材为《计算机组成与设计——硬件/软件接口》第5版,内容为前五章部分内容。
第一章 计算机还要与技术
计算机系统结构的8个伟大思想
1、面向摩尔定律的设计
2、使用抽象简化设计
3、加速大概率事件
4、通过并行提高性能
5、通过流水线提高性能
6、通过预测提高性能
7、存储器层次
8、通过冗余提高可靠性
冯诺依曼计算机的五大部件
控制器、运算器、存储器、输入设备、输出设备。
性能
响应时间:也叫执行时间,计算机完成某任务的总时间。
吞吐率:也叫带宽,单位时间内完成的任务数量。
CPU性能的度量标准是cpu执行时间
CPI:每条指令所需的时钟周期数的平均值
CPU时钟周期数=指令数*CPI
CPU执行时间=CPU时钟周期数 * 时钟周期时间=CPU时钟周期数/时钟频率 =指令数 *CPI * 时钟周期时间
可在指令数、CPI、时钟周期时间三个方面改善CPU性能。
第二章 指令:计算机的语言
mips指令
mips字段:
目标寄存器在二进制编码中总是在后面,但在mips汇编指令中总是在前面
R型
op:6位,操作码,指令的基本操作
rs:5位,第一个源操作数寄存器
rt:5位,第二个源操作数寄存器
rd:5位,用于存放操作结果的目的寄存器
shamt:5位,位移量
funct:功能码,用于指明op字段操作的特定形式
add $rd $rs $rt $rd= $rs+ $rt
op:0,rs,rt,rd,shamt:0,func:32
sub:$rd $rs $rt $rd= $rs- $rt
op:0,rs,rt,rd,shamt:0,func:34
slt $rd $rs $rt r s < rs< rs<rt? $rd=1: $rd=0
op:0,rs,rt,rd,shamt:0,funct:42
与以上相同形式的func
add:32
sub:34
addu:33
subu:35
and:36
or:37
xor:38
nor:39
slt(小于则置位,补码形式):42
sltu(小于则置位,自然数形式):43
sll $rd $rt,shamt $rd=rt<<shamt
op:0,rs:0,rt,rd,shamt,funct:0
srl $rd $rt,shamt $rd=rt>>shamt
op:0,rs:0,rt,rd,shamt,funct:2
jr $rs goto $rs
op:0,rs,rt:0,rd:0,shamt:0,funct:8
I型
op:6位,操作码,指令的基本操作
rs:5位,第一个源操作数寄存器
rt:5位,第二个源操作数寄存器,首位的目标寄存器
immediate:16位立即数
addi $rt $rs immediate
$rt= $rs+immediate
op:8,rs,rt,immediate
lw $rt $rs
immediate
r
t
=
rt=
rt=rs(immediate)
op:43,rs,rt,immediate
格式同上的op
addi:8
lw:35
sw:43
beq:4
bne:5
addiu:9
andi:12
ori:13
xori:14
slti:10
sltiu:11
lui(取立即数高16位,低16位用0补齐) $rt immediate
op:15,rs:0,rt,immediate
j型
op:6位
address:26位
j
op:2
jal:3
寻址
分支指令:
指令中16位立即数地址左移两位和当前pc值相加(pc+4之后)
跳转指令:
26位地址左移两位后与当前pc前4位组合
寄存器
$zero 0 值恒为0
$at 1 被汇编器保留,用来处理大的常数
$v ~ $v1 2~3 用于返回值的两个值寄存器 调用时不保存
$a0~ $a3 4~7 用于传递参数的4个参数寄存器 调用时不保存
$t0 ~ $t7 8~15 临时变量 调用时不保存
$s0 ~ $s7 16~23 保存寄存器 调用时保存
$t8 ~ $t9 24~25 更多临时变量 调用时不保存
$gp 28 全局指针 调用时保存
$sp 29 栈指针 调用时保存
$fp 30 帧指针 调用时保存
$ra 31 用于返回起始点的返回地址寄存器 调用时保存
第三章 计算机的算术运算
整数
减法
计算a-b可直接减,也可a+(-b的补码)
乘法
设乘数位数为4
初始:乘数4位,被乘数8位,置于低4位,乘积8位初始为0
重复4次以下步骤:
1、 乘积+乘数末位*被乘数
2、 左移被乘数
3、 右移乘数
除法
设除数位数为4
初始:商4位初始为0,除数8位,置于高4位,余数8位,初始为被除数,置于低4位
重复5次以下步骤:
1、余数=余数-除数
2、若余数<0则余数+除数,商左移,最低位置0;若余数>=0,则商左移,最低为置1
3、除数右移
浮点数
浮点数表示
单精度
阶码:
符号位:1位
指数:8位
尾数:23位
偏阶:127
指数 | 尾数 | 表示对象 |
---|---|---|
0 | 0 | 0 |
0 | 非0 | 非规格化数 |
1~254 | 任何值 | 浮点数 |
255 | 0 | 无穷 |
255 | 非0 | NaN(非数,即不是数) |
双精度
阶码:
符号位:1位
指数:11位
尾数:20位
偏阶:1023
指数 | 尾数 | 表示对象 |
---|---|---|
0 | 0 | 0 |
0 | 非0 | 非规格化数 |
1~2046 | 任何值 | 浮点数 |
2047 | 0 | 无穷 |
2047 | 非0 | NaN(非数,即不是数) |
加法
1、将较小指数向较大指数对齐,即通过右移(小数点左移)并增大相应指数使两个数指数相同
2、将两数位数相加
3、对结果进行规格化,右移则增大指数,左移则减少指数
4、检查是否溢出(对于单精度,最大的指数是127,最小的指数是-126),若无溢出,继续进行第五步,否则返回异常
5、对尾数按要求进行舍入,判断是否为规格化数,若否,返回第3步,否则结束。
乘法
1、将两个偏阶指数相加,然后减去偏阶得到新的偏阶指数
2、位数相乘
3、将结果规格化
4、检查是否溢出,若溢出,返回异常,否则继续第五步
5、对尾数按要求进行舍入,判断是否为规格化数,若否,返回第3步,否则结束
浮点数精确性
舍入规则:
右边多保留两位,第一位为保护位,第二位为舍入位,若两位为0~49 ,向下舍入,若为 51~ 99,则向上舍入,若为50,则看粘贴位(若舍入后面的位数不全为0,则粘贴位为1,否则为0),若粘贴位为1,则向上舍入,否则向偶数舍入。
第四章 处理器
数据通路
ALUOp指明要进行的操作是存取指令时需要的加法(00)、beq指令时需要的减法(01),还是由指令的funct字段(R型)决定(10)
由2位的ALUOp与(前提是R型指令)6位funct字段形成ALU控制信号(4位):‘
加:0010
减:0110
与:0000
或:0001
小于则置位:0111
多选器上面一位是0,代表控制信号无效
下面以为是1,代表控制信号有效
控制信号名 | 无效时的含义 | 有效时的含义 |
---|---|---|
RegDst | 写寄存器目标地址来自rt字段(20-16) | 写寄存器目标地址来自rd字段(15-11) |
RegWrite | 无 | 寄存器堆写使能有效 |
ALUSrc | 第二个ALU操作数来自寄存器堆的第二个输出 | 第二个ALU操作数位指令低16位的符号扩展 |
PCSrc | PC由PC+4取代 | PC由分支目标地址取代 |
MemRead | 无 | 数据存储器读使能有效 |
MemWrite | 无 | 数据寄存器写使能有效 |
MemtoReg | 写入寄存器的数据来自ALU | 写入寄存器的数据来自数据存储器 |
信号名 | R型 | lw | sw | beq |
---|---|---|---|---|
RegDst | 1 | 0 | X | X |
ALUSrc | 0 | 1 | 1 | 0 |
MemtoReg | 0 | 1 | X | X |
RegWrite | 1 | 1 | 0 | 0 |
MemRead | 0 | 1 | 0 | 0 |
MemWrite | 0 | 0 | 1 | 0 |
Branch | 0 | 0 | 0 | 1 |
ALUOp1 | 1 | 0 | 0 | 0 |
ALUOp2 | 0 | 0 | 0 | 1 |
jump:加入一个jump控制信号,并加入一个多选器
当jump信号无效,则为jump指令,跳转到指定地址,若控制信号有效,还为原先branch的结果。
流水线
提高的是吞吐率
分为五个阶段:
IF:取指令
ID:指令译码,都寄存器堆
EX:执行或计算地址
MEM:数据存储器访问
WB:写回
lw有完整的5个步骤
sw没有WB
R型没有MEM
beq没有MEM和WB
流水线级数:
太少效率不高
太多会恶化预测的性能,提高预测错误的代价。
流水线冒险
结构冒险
因缺乏硬件支持而导致指令不能在预定的时钟周期内执行的情况。即硬件不支持多条指令在同一时钟周期内执行。
解决方案:在硬件设计上避免结构冒险,设计者在设计流水线时能够非常容易地避免结构冒险。
数据冒险
因无法提供指令执行所需数据而导致指令不能在预定的时钟周期内执行的情况。
解决方案:旁路,从内部寄存器而非程序员可见寄存器或存储器提前取出数据。
但旁路不能解决所有数据冒险,如取数—使用型(load-use)冒险,解决此类冒险在旁路的基础上还需进行流水线阻塞,也称气泡进行一次阻塞。
旁路通过加入旁路单元
旁路单元通过输入的寄存器号生成控制信号ForwardA和ForwardB,判断是否旁路以及旁路哪一步的运算结果
EX冒险:
if(EX/MEM.RegWrite
and(EX/MEM.RegisterRd
≠
0
\neq0
=0
and(EX/MEM.RegisterRd=ID/EX.RegisterRs))ForwardA=10
if(EX/MEM.RegWrite
and(EX/MEM.RegisterRd
≠
0
\neq0
=0
and(EX/MEM.RegisterRd=ID/EX.RegisterRt))ForwardB=10
MEM冒险:
if(MEM/WB.RegWrite
and(MEM/WB.RegisterRd
≠
0
\neq0
=0
and not(EX/MEM.RegWrite
and(EX/MEM.RegisterRd
≠
0
\neq0
=0
and(EX/MEM.RegisterRd=ID/EX.RegisterRs))
and(MEM/WB.RegisterRd=ID/EX.RegisterRs))ForwardA=01
if(MEM/WB.RegWrite
and(MEM/WB.RegisterRd
≠
0
\neq0
=0
and not(EX/MEM.RegWrite
and(EX/MEM.RegisterRd
≠
0
\neq0
=0
and(EX/MEM.RegisterRd=ID/EX.RegisterRt))
and(MEM/WB.RegisterRd=ID/EX.RegisterRt))ForwardB=01
多选器控制 | 源 | 解释 |
---|---|---|
ForwardA=00 | ID/EX | 第一个ALU操作数来自寄存器堆 |
ForwardA=10 | EX/MEM | 第一个ALU操作数由上一个ALU运算结果旁路获得 |
ForwardA=01 | MEM/WB | 第一个ALU操作数由数据存储器或者前面的ALU结果中旁路获得 |
ForwardB=00 | ID/EX | 第二个ALU操作数来自寄存器堆 |
ForwardB=10 | EX/MEM | 第二个ALU操作数由上一个ALU运算结果旁路获得 |
ForwardB=01 | MEM/WB | 第二个ALU操作数由数据存储器或者前面的ALU结果中旁路获得 |
加入气泡通过加入冒险检测单元判断是都存在load-use冒险,若存在,将D级将控制信号置0并退出,重新执行load指令。
控制冒险
因为取到的指令并不是所需要的而导致指令不能再预定的时钟周期内执行。即决策依赖于一条指令的执行结果,而这条指令还在执行中。
解决方案:阻塞:效率较低
分支预测:预测分支结果并立即沿预测方向执行,而不是等真正的分支结果确定后才开始执行
延迟分支:即指令重排,把原先在分支指令的之前且不影响结果的指令排在分支指令后起到延迟分支的作用。
当分支预测错误时,则要丢弃流水线中的指令,将流水线的IF、ID、EX级的指令都置零
缩短分支延迟:在IF/ID流水线寄存器中已有PC值和立即数字段,所以可以将分支地址计算提前到ID级,其将分支预测错误的代价减少为一条指令。
可增加一条IF.Flush控制信号,若有效,则将下一条取到的指令置为空指令。
动态分支预测
流水线寄存器
因为存在数据逆向移动,后续指令会将当前指令的数据覆盖,而当前指令的流水线后续阶段可能会用到前面阶段的数据,所以需要通过流水线寄存器将当前阶段的数据通过流水线寄存器传递到后面的阶段。如写回操作的目标寄存器和beq中的地址。
异常和中断
异常:指打断程序正常执行的突发事件,用于检测溢出等。
中断:来自处理器外部的异常。
异常处理:
EPC:异常程序计数器,保存出错程序的地址,并把控制权转交给操作系统的特定地址。
Cause:状态寄存器,其中一个字段用于记录异常产生的原因(溢出,页表缺页等)。
第五章 大容量和高速度:开发存储器层次结构
存储器层次结构
局部性原理
时间局部性:某个数据项在被访问之后可能很快被再次访问的特性
空间局部性:某个数据项在被访问之后,与其地址相近的的数据很可能被访问
存储器层次结构:一种由多存储器层次组成的结构,存储器的容量和访问时间随着离处理器距离的增加而增加
主存储器由DRAM(动态随机存取存储器)实现
靠近处理器的那层cache由SRAM(静态随机存取存储器)存储器
DRAM成本低于SRAM,速度比SRAM慢
cache
块或行:可存在于或不存在于cache中的信息的最小单元
块较大能更好地利用空间局部性以降低缺失率
但仅仅增加块的大小会导致确实成本增加
索引:用来选择块
标记:标记只包含地址的高位,也就是没有用来检索cache的那些位,用来判断cache中的字是否是所请求的字
有效位:用来标识一个块中是否含有一个有效数据
一个地址可以划分为标记位和索引位
计算机多少位一个字就是多少位
1字节占8位
32位地址,直接映射cache,cache大小为2n,因此n位被用来索引,块大小为2m个字(2m+2字节,2m+5位)其中m位用来查找块中的字,两位是字节偏移信息
地址由三个部分组成:
标记,索引,块偏移(块中被请求数据的地址)
标记域大小为32-(n+m+2)
直接映射的cache总位数为2n(块大小+标记域大小+有效位域大小)
有效位为1位,块大小2m+5位
因此一个cache的位数是2n(2m+5+(32-n-m-2)+1)
通常对cache命名时只考虑数据大小而不考虑标记域和有效位域的大小
块地址(块号)=字节地址/每块字节数,包含了
字节地址/每块字节数 * 每块字节数
和 字节地址/每块字节数 * 每块字节数+(每块字节数-1)之间的地址
cache缺失处理步骤:
1、把程序计数器(PC)的原始值(当前PC-4)送到存储器中
2、通过主存执行一次读操作,并等待主存访问完成
3、写cache项,将从主存中读回的数据写入cache中存放数据的部分,并将地址的高位写入标记域,设置有效位
4、重启指令执行第一步,重新取指,这次该指令在cache中
写操作:
写直达:同时更新cache和下一存储器层次,以保持二者一致
写回:当发生写操作时,新值仅仅被写入cache中,只有当修改过的块被替换时才写到较低层存储层次中
直接映射:
块地址(块号) mod cache中的块数
组相联:
块地址(块号) mod cache中的组数
相连度每增加1倍,组数就会减少1/2,索引位减1,标记位加1,总位数不变
全相联:块可以放置到cache中的任何位置
提高相连度通常能够降低缺失率,但是会增加命中时间
虚拟存储
页表
虚拟存储器中,块被称作页,访问缺失被称为缺页
虚拟地址被划分为虚页号和页偏移,虚拟页号通过地址转换成物理页号,物理页号构成物理地址的高位,页偏移不变构成其低位。
页偏移的位数决定了页的大小
页表:保存着虚拟地址和物理地址之间转换关系的表,保存在主存中,通常使用虚页号来索引,如果这个虚页当前在主存中,页表中对应项将包含虚页对应的物理页号。
页表放在主存中,程序每次方寸至少需要两次,第一次访存先获得物理地址,第二次访存才获得数据
引用位(使用位):实现近似LRU(最近最少使用),当一页被访问时,该位被置位。
页表容量:
虚拟地址32位,页大小为4KiB,页表每一项为4字节
页表项数=232/212=220
页表容量=页表项数*页表项大小=220*4=4MiB
TLB
快表(TLB):地址转换cache,页表的cache,用于记录最近使用地址的映射信息的高速缓存,可以避免每次都访问页表。
页表需要包括其他状态位,如脏位和引用位
存储器层次结构由1个TLB和一个cache组成,页表在存储器中,存储器访问可能遇到三种不同类型的缺失
TLB | 页表 | cache | 这种情况可能发生么?如果可能,在什么情况下发生 |
---|---|---|---|
命中 | 命中 | 缺失 | 可能,但若TLB命中则不可能检查页表 |
缺失 | 命中 | 命中 | TLB缺失,但在页表中找到表项,重试后在cache中找到数据 |
缺失 | 命中 | 缺失 | TLB缺失,但在页表中找到表项,重试后在cache中未找到数据 |
缺失 | 缺失 | 缺失 | TLB缺失,随后发生缺页,随后发生缺页;重试后在cache中必找不到数据 |
命中 | 缺失 | 缺失 | 不可能,如果页不在主存中,TLB中没有此转换 |
命中 | 缺失 | 命中 | 不可能,如果页不在主存中,TLB中没有此转换 |
缺失 | 缺失 | 命中 | 不可能,如果页不在主存中,数据不允许在cache中出现 |
有些地方个人理解可能有误。