计算机组成原理-——复习笔记
第一章
系统结构中的8个伟大思想
- 面向摩尔定律的设计
- 使用抽象简化设计
- 加速大概率事件
- 通过并行提高性能
- 通过流水线提高性能
- 通过预测提高性能
- 存储器层次
- 通过冗余提高可靠性
计算机硬件 :输入设备,输出设备,数据通路(运算器),控制器,存储器
性能
响应时间:也叫执行时间,是计算机完成某任务所需的总时间
吞吐率:也叫带宽,表示单位时间内完成的任务数量
性 能 x = 1 执 行 时 间 x 性能_x = {1 \over 执行时间_x} 性能x=执行时间x1
如果X比Y快n倍,在Y上的执行时间是在X上执行时间的n倍
性
能
X
性
能
Y
=
执
行
时
间
Y
执
行
时
间
X
=
n
(1)
{性能X\over 性能Y} = {执行时间Y \over 执行时间X} = n \tag{1}
性能Y性能X=执行时间X执行时间Y=n(1)
CPU执行时间:也称CPU时间,是执行某一任务在CPU上所花费的时间(不包括I/O,用户感受的是响应时间)
时钟间隔时间称为时钟周期,他的倒数称为时钟频率
一
个
程
序
的
C
P
U
执
行
时
间
=
一
个
程
序
的
C
P
U
时
钟
周
期
数
×
时
钟
周
期
时
间
(2)
一个程序的CPU执行时间 = 一个程序的CPU时钟周期数 \times 时钟周期时间 \tag{2}
一个程序的CPU执行时间=一个程序的CPU时钟周期数×时钟周期时间(2)
一
个
程
序
的
C
P
U
执
行
时
间
=
一
个
程
序
的
C
P
U
时
钟
周
期
数
时
钟
频
率
(3)
一个程序的CPU执行时间 = {一个程序的CPU时钟周期数 \over 时钟频率} \tag{3}
一个程序的CPU执行时间=时钟频率一个程序的CPU时钟周期数(3)
CPI:表示执行某个程序或片段每条指令所需的时钟周期平均数
C P U 时 间 = 指 令 数 × C P I × 时 钟 周 期 时 间 (4) CPU时间=指令数 \times CPI \times 时钟周期时间 \tag{4} CPU时间=指令数×CPI×时钟周期时间(4)
C P U 时 间 = 指 令 数 × C P I 时 钟 频 率 (5) CPU时间={{指令数 \times CPI} \over 时钟频率} \tag{5} CPU时间=时钟频率指令数×CPI(5)
不同类指令数量
C
i
C_i
Ci和对应的CPI为
C
P
I
i
CPI_i
CPIi
总的时钟周期数
C
P
U
时
钟
周
期
数
=
Σ
(
C
P
I
i
×
C
i
)
(6)
CPU时钟周期数 = \Sigma {(CPI_i \times C_i)} \tag{6}
CPU时钟周期数=Σ(CPIi×Ci)(6)
总的CPI为
C
P
I
=
C
P
U
时
钟
周
期
数
指
令
数
(7)
CPI={CPU时钟周期数 \over 指令数} \tag{7}
CPI=指令数CPU时钟周期数(7)
单周期CPU,指令周期数都为1
多周期每类指令所需周期不同,beq,j需要3个时钟周期,R型,sw需要4个时钟周期,lw需要5个时钟周期
MIPS:基于每百万条指令的程序执行速度的一种测量,指令条数除以执行时间与
1
0
6
10^6
106之积得到MIPS,是执行的速率,规定了性能与执行时间成反比,越快的计算机具有越高的MIPS
M
I
P
S
=
指
令
数
执
行
时
间
×
1
0
6
MIPS = {指令数 \over {执行时间 \times 10^6}}
MIPS=执行时间×106指令数
指令
常见指令
或非nor来取代非not
32位立即数加载
lui $s0,高16位 # 将16位立即数放到寄存器的高16位
ori $s0,$s0,低16位
三种指令类型
-
R型
op rs rt rd shamt funct 6 5 5 5 5 6 [31:26] [25:21] [20:16] [15:11] [10:6] [5:0] 操作码 第一个源操作数寄存器 第二个源操作数寄存器 存放结果的目标寄存器 位移量 功能码 注意的地方 :32个寄存器需要5位二进制表示( 32 = 2 5 32=2^5 32=25),若寄存器数量大于32,则表示寄存器的字段位数将大于5位
算术运算 逻辑运算
-
I型
op rs rt constant or address 6 5 5 16 [31:26] [25:21] [20:16] [15:0] 操作码 16位地址或立即数 beq,bne,addi,lw,sw
立即数范围 ± 2 15 \pm 2^{15} ±215(带符号数)
16位立即数的扩展:有符号和无符号的扩展
-
J型
op target 6 26 [31:26] [25:0] 操作码 j,jal
常用的循环 分支结构
相等则跳转
beq $r1, $r2,L1
若两个寄存器中数值相等,则跳转到标签为L1的语句行
不相等则跳转
beq $r1, $r2,L1
相等时跳转的结构
bne 寄存器一,寄存器二,Else
相等时的操作
j exit
Else:
不等时执行的操作
exit:
循环:
while循环语句
J Judeg
Loop:
执行的操作代码
Judeg:
判断(若条件不成立则退出,跳转到Exit)
j Loop
Exit:
注意:如果是do{}while(条件)则刚刚开始不需要J Judeg这一句
函数
程序的执行与翻译
C语言 编译器 汇编语言
汇编语言 汇编 机器语言
机器语言 链接器 可执行代码 : 将各个独立的汇编机器语言程序组合起来并且解决所有未定义的标记,生产可执行文件
可执行代码 加载器 存储器 : 把目标程序装载到内存中以准备运行的系统程序
五种寻址方式
立即数寻址:i型指令的后16位给定的数据,addi,
寄存器寻址:操作数是寄存器。所有的R型指令
基址偏移量寻址:地址由寄存器给出的基地址和偏移量(16位数做符号位扩展成32位)相加得到 lw,sw指令
PC相对寻址:指令后16位(左移两位)与PC(已更新为PC+4)相加, beq,bne指令
可以跳转到距离当前指令距离为
±
2
15
\pm 2^{15}
±215
伪直接寻址:跳转地址由指令中26位字段和PC高位相连而成
26位给出的是字地址,左移两位得到28位,代替PC的低28位,PC高4位保持不变。
左移两位的原因16位偏移量左移2位以指示以字为单位的偏移量,这样做将偏移量能表示的有效范围扩大了4倍。
寄存器约定
名称 | 用途 | 调用是否保存 |
---|---|---|
$zero | 常数0 | 不适用 |
$v0 $v1 | 用于函数返回值 | 否 |
$a0~ $a3 | 用于函数传递参数 | 否 |
$t0~ $t7 | 临时变量 | 否 |
$s0~ $s7 | 保存的寄存器 | 是 |
$t8 $t9 | 更多的临时变量 | 否 |
$gp | 全局指针:指向静态数据区 | 是 |
$sp | 栈指针 | 是 |
$fp | 帧指针 | 是 |
$ra | 返回地址 | 是 |
计算机的算术运算
溢出的判定
定义:两个操作数的符号位分别为
S
A
S_A
SA
S
B
S_B
SB,结果符号位为
S
f
S_f
Sf
符号位直接参与运算,产生的符号位进位为
C
f
C_f
Cf,最高有效位产生的进位为
C
C
C
方法一:
溢
出
=
S
A
‾
S
B
‾
S
f
+
S
A
S
B
S
f
‾
溢出 = {\overline{S_A}\overline{S_B}}S_f + S_AS_B\overline{S_f}
溢出=SASBSf+SASBSf
只有同号的数相加才能产生溢出,且溢出的时候结果符号位与操作数符号位相反
方法二:
溢
出
=
C
f
⨁
C
…
…
(
异
或
)
溢出=C_f \bigoplus C ……(异或)
溢出=Cf⨁C……(异或)
产生的符号位进位与最高有效位产生的进位不同
方法三:
操作数采用双符号位,通过运算结果的符号位进行判断
00 结果为正 无溢出
01 结果正溢
10 结果负溢
11 结果为负,无溢出
有符号数算术运算溢出时会产生异常
无符号数算术运算指令溢出不产生异常
数据的表示
-
无符号数
-
带符号数
原码:最高位为符号位(0表示正,1表示负)剩余部分用二进制表示绝对值补码:正数的补码是自己,负数的补码是对应正数全部变反加一
以8位为例
二进制补码 0000 0000 0000 0001 …… 0111 1111 1000 0000 1000 0001 …… 1111 1111 对应的真值 0 1 …… 127 -128 -127 …… -1 8位补码表示范围为-128至127(0的表示只有一种)
2 n 2^n 2n位补码表示范围
− 2 n − 1 至 2 n − 1 − 1 -2^{n-1}至2^{n-1}-1 −2n−1至2n−1−1 -
浮点数
浮点数表示
移码:
[ E ] 移 = E + B i a s [E]_移 = E + Bias [E]移=E+Bias
E为指数的真值,Bias为偏阶32bits 单精度浮点数
Bias偏阶为127
(例如 若指数为0 指数位则是 ( 127 + 0 ) 10 = 0111111 1 2 {(127+0)}_{10} = 01111111_2 (127+0)10=011111112
+1表示为 1 + 127 = 1000000 0 2 {1+127} = 10000000_2 1+127=100000002)
31 30 …… …… 23 …… …… …… …… 1 0 符号1位 指数8位 尾数23位 符号位最高位[31] 1表示负数,0表示正数
指数8位[30~23]
尾数23位[22~0]
64bits 双精度浮点数 1 11 52
双精度的指数偏阶(Bias)为1023 (记住0对应的指数位011 1111 1111)
单精度 双精度 表示对象 指数 尾数 指数 尾数 0 0 0 0 0 0 非0 0 非0 ± 非 规 格 化 数 \pm 非规格化数 ±非规格化数(尾数部分无隐含前置0) 1-254 任何数 1-2046 任何数 ± 浮 点 数 \pm 浮点数 ±浮点数 255 0 2047 0 ± 无 穷 \pm 无穷 ±无穷 255 非0 2047 非0 NaN(not a number)
乘法
除法
浮点数加法
step | 操作 | |
---|---|---|
1 | 将较小指数的数向较大指数的数对齐 | |
2 | 将有效位相加 | |
3 | 和不是规格化的数,将其进行调整,检查是否溢出 | |
4 | 若有效位超了,进行舍入,然后再回到步骤3 |
第四章
主要的逻辑单元
组合单元:操作单元 ALU 逻辑门 进行数据处理 输出是输入的函数
状态单元:存储单元 寄存器 存储器 用于存放信息,至少有两个输入(要写入的数据值和决定何时写入的时钟信号)
寄存器堆
RA | RB | RW |
---|---|---|
register to be read on BusA | register to be read on BusA | register to be written |
单周期处理器
指令操作码 | ALUop |
---|---|
存字取字 | 00 |
beq | 01 |
R型指令 | 10 |
ALU控制信号 | 功能 |
---|---|
000 | 与 |
001 | 或 |
010 | 加 |
110 | 减 |
111 | 小于时置位 |
单周期处理器的CPI是1,时钟周期由最长的Lw指令决定
最长延时
读取指令-指令解码寄存器装入数据-地址计算-读取内存数据-将数据写回寄存器
lw在写寄存器的多路选择器RegDst
总延时应该是
读
取
指
令
(
I
−
M
e
m
)
+
寄
存
器
(
R
e
g
)
+
多
选
(
A
L
u
S
r
c
)
+
A
L
U
+
内
存
读
取
(
D
−
M
e
m
)
+
多
选
(
M
e
m
T
o
R
g
e
)
读取指令(I-Mem)+寄存器(Reg)+多选(ALuSrc)+ALU+内存读取(D-Mem)+多选(MemToRge)
读取指令(I−Mem)+寄存器(Reg)+多选(ALuSrc)+ALU+内存读取(D−Mem)+多选(MemToRge)
多周期处理器
在每个周期末尾又增加了额外的寄存器,暂存后续周期会用到的数据
IR 指令寄存器 从内存取出的指令放到IR中
MDR 数据缓冲寄存 从内存中取出的数据放到MDR中
A B寄存器 从寄存器中取出的操作数放到A B两个寄存器中
ALUout : 存放ALU的运算结果
第一个周期结束ALUout=PC+4
第二个周期结束 AILUout=PC+sign extendIR[15:0]>>2
第三个周期结束 ALUout=R型A op B 或者 I型A 与IR[15:0]运算
第四个周期 第五个周期 ALUout结果不确定
每条指令都通常占用3~5个周期
三个周期的指令 J型,beq
四个周期的指令 R型,addi,sw
五个周期的指令 lw
指令过程
-
step1
取指令
IR = Mem[PC]
PC <= PC+4
-
step2
指令解码 寄存器A B获取 分支地址计算
将数据装载到A B两个寄存器中
A = Reg[IR[25-21]]
B = Reg[IR[20-16]]
并且完成PC+符号位扩展后并左移两位后的IR[15:0]装载到ALUout中
ALUout = PC + signExtend(IR[15:0]>>2)
重要的一些控制信号
RegDst=X:第二个周期的时候不需要写回寄存器
ALUop=00:ALU执行加法操作
-
step3
执行其中之一
R型指令计算
计算内存地址
分支比较分类型
R型 I型 J型 ALUout = A op B sw lw ALUout = A + IR[15:0] 分支beq 如果A==B 则PC=ALUout IR低26位左移两位变成28位,但PC高四位保持不边 ALUop=10 ALUop=00 ALUop=01 -
step4
sw存数 lw取数据到MDR寄存器 R型指令将计算结果装回寄存器
R型 sw lw Reg[IR[15:10]=ALUopt] MEM[ALUout]=B MDR=MEM[ALUout] RegDst=1 选择IR[15:11] -
step5
完成lw指令 将MDR寄存器内容放到寄存器中
lw指令
Reg[IR[20:16]=MDR
RegDst=0 选择IR[20:16]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCnUvR3Z-1652083937821)(pic/5.png)]
多周期的ALUop信号
值 | 功能 |
---|---|
00 | ALU执行加法(第一步第二步 sw lw第三步) |
01 | ALU执行减法(beq指令第三步) |
10 | 由funct字段决定操作类型(R型指令第三步) |
xx | j型指令,第四步第五步可为任意值 |
单周期多周期比较
单周期 | 一个时钟周期执行一条指令 | 简单,容易理解效率低,慢,不实用时钟周期由执行时间最长的那条指令决定 | ||
多周期 | 将一条指令的执行过程分为多个阶段,每个阶段占用一个时钟周期 | 可以在不同周期使用同一逻辑功能,执行通路较短的周期占用的周期数较小,可以节省时间 |
第五章
半导体存储器的分类:
SRAM:速度快,比较贵,规模小,用做二级缓存
DRAM:相对SRAM比较慢,相对便宜,规模可以做大,用作内存
主存用DRAM,cache用SRAM(时间局部性和空间局部性)。
闪存
磁盘
名词解释:
块或行:可存在于或不存在于cache中的信息的最小单元。
命中率:在高层存储器中找到目标数据的存储访问比例。
缺失率:在高层存储器中没有找到目标数据的存储访问比例
命中时间:访问某存储器层次结构所需要的时间,包括了判断当前访问是命中还是缺失所需的时间。
缺失代价:将相应的块从低层存储器替换到高层存储器所需的时间。
强制缺失( compulsory miss):对从没有在cache 中出现的块第一次进行访问引起的缺失。
容量缺失( capacity miss):由于cache容纳不了一个程序执行所需要的所有块而引起的cache缺失,当某些块被替换出去,随后再被调入时,将发生容量缺失。
冲突缺失( conflict miss):在组相联或者直接映射的cache中,多个块竞争同一个组时而引起的cache缺失。冲突缺失在直接映射或组相联 cache中存在,而在同样大小的全相联cache 中不存在。
平均访存时间 AMAT:
A
M
A
T
=
命
中
时
间
+
缺
失
率
×
缺
失
代
价
AMAT = 命中时间 + 缺失率 \times 缺失代价
AMAT=命中时间+缺失率×缺失代价
推导 AMAT = 命中率 乘 访问缓存时间 +缺失率 乘 (将数据装入缓存时间+访问缓存时间)
其中 缺失率+命中率=1
将数据装入缓存时间为缺失代价
直接映射:
映射后对应的cache块
(
块
地
址
)
m
o
d
(
c
a
c
h
e
中
的
块
数
)
(1)
(块地址) mod (cache中的块数)\tag{1}
(块地址)mod(cache中的块数)(1)
块地址
块
地
址
=
字
节
地
址
/
块
大
小
(
块
的
字
节
数
)
块地址 = 字节地址/块大小(块的字节数)
块地址=字节地址/块大小(块的字节数)
这个块地址包含了字节地址在
字
节
地
址
/
块
大
小
∗
块
大
小
字节地址/块大小*块大小
字节地址/块大小∗块大小 到
字
节
地
址
/
块
大
小
∗
块
大
小
+
(
块
大
小
−
1
)
字节地址/块大小*块大小 + (块大小-1)
字节地址/块大小∗块大小+(块大小−1) 之间的地址
32位地址,且是直接映射
cache大小为 2 n 2^n 2n个块,需要n位用来索引
块大小为 2 m 2^m 2m个字( 2 m + 2 2^{m+2} 2m+2个字节)需要 m m m位来寻找块中的字,2位是字节偏移信息。offset位数需要 m + 2 m+2 m+2位
标记域tag大小为
32
−
(
n
+
m
+
2
)
32-(n+m+2)
32−(n+m+2)
直接映射的cache总位数
2
n
×
(
块
大
小
+
标
记
域
大
小
(
t
a
g
)
+
有
效
位
大
小
)
2^n \times {(块大小+标记域大小(tag)+有效位大小)}
2n×(块大小+标记域大小(tag)+有效位大小)
其中,块大小为
2
m
2^m
2m个字(
2
m
w
o
r
d
=
2
m
+
2
B
y
t
e
=
2
m
+
5
b
i
t
s
2^m word = 2^{m+2}Byte = 2^{m+5}bits
2mword=2m+2Byte=2m+5bits,同时,需要一位标记为,此时,总位数为
2
n
×
(
2
m
×
32
+
(
32
−
n
−
m
−
2
)
+
1
)
2^n \times {(2^m \times 32 + (32-n-m-2) + 1)}
2n×(2m×32+(32−n−m−2)+1)
cache大小(实际装载数据的位数)
c
a
c
h
e
大
小
=
块
大
小
×
块
数
cache大小 = 块大小 \times 块数
cache大小=块大小×块数
地址拆分为三个部分
Tag标记 索引index 偏移量Index
(地址前面的修饰符,字地址,块地址,字节地址)
掌握例题
组相连 全相连(两个了解)
虚拟存储(不考)
例:一个两路组相连
主存分为256组,每组8块,cache分为8组,每组两块
主存中的各块与Cache的组号之间有固定的映射关系。但可自由映射到对应Cache组中的任何一块。
例如
主存中的第0块、第8块……均映射于Cache的第0组,但可映射到Cache第0组中的第0块或第1块;
主存的第1块、第9块……均映射于Cache的第1组,但可映射到Cache第1组中的第2块或第3块。
组相连的cache组由
(
内
存
中
的
块
地
址
)
m
o
d
(
c
a
c
h
e
中
的
组
数
)
(内存中的块地址) mod (cache中的组数)
(内存中的块地址)mod(cache中的组数)
给出
全相连 组相连 直接映射比较:
直接映射:
优点:硬件简单,成本低,地址变换速度快,而且不涉及替换算法问题。
缺点:不够灵活,Cache的存储空间得不到充分利用,每个主存块只有一个固定位置可存放,容易产生冲突,使Cache效率下降,因此只适合大容量Cache采用。
全相联:
优点:映射方式比较灵活,主存的各块可以映射到Cache的任一块中,Cache的利用率高,块冲突概率低,只要淘汰Cache中的某一块,即可调入主存的任一块。
缺点:由于Cache比较电路的设计和实现比较困难,这种方式只适合于小容量Cache采用。查找麻烦,需要与缓存进行一一对比
组相联结构:是前两种方法的折中方案,适度兼顾二者的优点,尽量避免二者的缺点
cache写操作处理(了解)
写策略
-
写直达
也叫写贯穿,当CPU进行写操作时,在写cache时候同时将内容写会主存中,两个内容同时改写
-
写回
当CPU写数据时,仅仅写回cache,不写主存
当已被改写的块被替换时,将内容写会主存
方法比较
(1)写直达法是在每次写Cache时都有写主存的操作,能始终保持数据块的一致性。写回法则仅在数据块被置换时写入主存,可减少访问主存的开销,但存在Cache块与主存块的瞬间不一致。
(2)写直达法一次写入一个字,仅需一个奇/偶校验位;而写回法一次写入一个数据块,需要多个校验位。
(3)写直达法需要较多的缓冲寄存器存放需要写入主存的数据;而写回法相应要简单些。
码距
码距就是两个码字C1与C2之间不同的比特数。
如:1100与1010的码距为2;1111与0000的码距为4。
一个编码系统的码距就是整个编码系统中任意(所有)两个码字的最小距离。
若一个编码系统有四种编码分别为:0000,0011,1100,1111,此编码系统中0000与1111的码距为4;0000与0011的码距为2,是此编码系统的最小码距。
因此该编码系统的码距为2。
奇偶校验的码距为2
汉明码
汉明码使用 奇偶校验码 进行错误检测
汉明码纠错步骤:
-
将数据从左到右依次编号
-
将编号为 2 n 其 中 n = 1 , 2 , … … , n 2^n 其中{n=1,2,……,n} 2n其中n=1,2,……,n(也就是1,2,4,16) 的位 作为奇偶校验位
-
其余位数作为数据位(位置3,5,6,7,9,10,11,12,13,14,15)
-
奇偶校验位的位置决定对应的数据位
位置 1 2 3 4 5 6 7 8 9 10 11 12 数据位 p1 p2 d1 p3 d2 d3 d4 p4 d5 d6 d7 d8 覆盖范围 p1 X X X X X X p2 X X X X X X p3 X X X X X p4 X X X X X 说明:
校验位1(p1)检查第0001 0011 0101 0111 1001 1011(1,3,5,7,9,11)这些位的最右边第一位均为1
校验位2(p2)检查第0010 0011 0110 0111 1010 1011(2,3,6,7,10,11)这些位的最右边第二位均为1
校验位1(p1)检查第0100 0101 0110 0111 1100 1101(4,5,6,7,12,13,14,15)这些位的最右边第三位均为1
-
进行奇偶校验位,对每一组进行偶校验
纠错:最后将发生错误的位数进行纠错
r位指误码 比如p1p2p3p4
2 r 2^r 2r种可能的错误代码
错误码全为0<==>汉明码无错误
剩余 2 r − 1 2^r-1 2r−1种错误代码对应只有一位错的情况
参数满足
N
=
k
+
r
≤
2
r
−
1
N=k+r \le 2^r-1
N=k+r≤2r−1
k表示数据位位数,r表示检错码位数
k=4 r=3 编码的海明距离为3
k=8 r=4