《计算机组成原理与系统结构》复习参考
作者:互联网
前言
本文档是作者在准备《计算机组成原理与系统结构》时,一边复习一边编撰的,耗时五个白天。今天发出这篇文档与大家共享,是为了帮助大家缕清思路,帮助大家更好的复习。具体在复习时还请以课本或老师的PPT等官方资料为准。
由于文档写成时距离考试还有不到18个小时的时间,作者无暇进行较对。如有错误敬请包涵。
一、概述
1.1 计算机的基本组成
- 冯诺依曼结构(存储程序体系结构):组成:控制器、运算器、存储器、输入设备、输出设备
- 早期以运算器为中心,现在以存储器为中心
1.2 计算机的执行过程
- 寄存器分通用寄存器、专用寄存器
- MDR是存储器数据寄存器
- MAR是存储器地址寄存器
- MDR的宽度叫存储字长
- IR是指令寄存器
- PC是程序计数器,存放指令地址
- IR是指令寄存器,存放指令
- 指令执行:把PC的值放到MAR,PC+4; 存储器按照MAR取指令存到MDR; MDR的内容放到IR; IR传给CPU,执行
- 指令字长:指令的长度
- 存储字长:访存获得数据的长度,即MDR宽度
- 机器字长:CPU能同时处理的数据位数
1.3 计算机的性能指标
- 计算机常用性能指标有执行时间、吞吐率
- 执行时间(墙上时钟时间):计算机完成某任务的总时间,性能=1/执行时间
- 加速比=性能2/性能1=执行时间1/执行时间2
- 吞吐率(带宽):单位时间完成的任务数量
- CPU时间:给定程序任务占处理器的时间
- CPU时间 = 指令条数(IC) × 平均每条指令的执行时间
- 平均每条指令的执行时间 = 平均每条指令所花费的时钟周期(CPI) × 一个时钟周期长度(CT)
- MIPS(Million Instruction Per Second):每秒执行百万指令条数
- FLOPS(Floating Point Operation Per Second):每秒浮点运算次数
- MFLOPS, GFLOPS, TFLOPS
1.4 性能设计的基本原则
- 性能优化设计基本原则:大概率事件优先、Amdahl定律
- 系统加速比 = 改进后性能/改进前性能 = 改进前时间/改进后时间
- Amdahl定律:总时间看作1, 系统加速比 = 改进后时间改进前时间=未改进部分占比+改进部分加速提升比改进部分占比1,加速比上限=未改进部分占比1
- 如果仅对计算机一部分性能做改进,改进越多、系统获得的效果越小
- 并行计算性能的提升,受到了程序中必须串行的部分的限制
二、整数的表示与运算
2.1 整数的编码
- 整数表示:原码、补码、反码
- 原码:最高位符号位、剩下的位是绝对值,零有两种表示,不方便计算
- 反码:最高位符号位,如果是负数后面的部分取反,零有两种表示、不方便计算
- 补码:最高位符号位,如果是正数则数值部分不变,否则取反加一,零唯一、没有正负零,可以直接相加
- 补码中减法可以转化为加法
- 补码是以2n+1为模的计量系统
2.2 有符号数和无符号数之间的转换
- 显式转换、隐式转换
- 当length是无符号数的时候,
i<=length-1
有漏洞(length==0)
2.3 按位运算与逻辑运算
- 位运算有对应的机器指令,逻辑运算没有
- 逻辑短路,表达式可以只判断前面一段
2.4 整数的扩展、截断、移位
- 0扩展:用于无符号数,直接添加0
- 符号扩展:扩展符号位
- 强行将长数转化为短数的时候,发生截断
- 左移:抛弃最高位、低位填0
- 右移:逻辑右移、符号右移(补符号位)
2.5 整数的加减运算
- 一位全加器:输入
A
,B
,carry_in
,输出s
和carry_out
- 32个全加器串联就得到串行进位加法器,简单、速度慢
- 减法就是把B取反加一,通过添加32个异或门,以及在最低位一位全加器的
carry_in
输入1来实现。这个也适用于无符号数 - ALU(arithmetic and logic unit),算术逻辑单元可以进行算术运算和逻辑运算
2.6 溢出的判断
- 符号相异的数做加法或者符号相同的数做减法,都不会溢出;符号相同的数做加法,符号不同的数做减法,可能溢出
- 符号判断法:两个正数相加得到负数,或者两个负数相加得到正数。缺点:速度慢,需要等运算结果产生后才能判断
- 进位判断法:次高位和最高位进位位相异或,结果为1则溢出
- 双符号位判断法:符号位扩展一位,正数00,负数11,相加之后看看符号位两位是否相同,相同就没溢出,不相同就溢出
- 溢出判断只适合于有符号整数,不适合于无符号整数
- C编译器忽略溢出信号
2.7 定点数的乘法
- 用加法器实现原码乘法:被乘数存放在R2,乘数存放在R1,R0作为辅助的寄存器。每次检测R1的最低位决定是否要把R2加给R0,然后把R0,R1这两个寄存器组成的整体进行逻辑右移。假设寄存器宽度是w位,做w次这样的加法之后,R0就存着高w位,R1就存着低w位。优点:简单,缺点:慢
- booth算法:针对补码乘法,流程和原码乘法大致相同,每次把(yi−yi+1)x的值加到R0上,加完之后要把R0,R1整体算术右移。i从−1开始,并规定y−1=0
2.8 整数的乘法
- 有符号数相乘,可以直接当作无符号数相乘,然后取最后w位,结果是正确的
三、浮点数的表示与运算
3.1 浮点数的表示
- 浮点数编码:符号位S、阶码E、尾数M
- 如果用补码表示尾数,那么必须最高位和次高位不同才是规格化的
3.2 IEEE754浮点数
- 单精度浮点数阶码8位,尾数23位;双精度阶码11位,尾数52位
- 阶码所表示的数字减去127得到实际的阶(双精度1023)
- 规格化浮点数的真值为(−1)s×(1+f)×2E−127
- 单精度浮点数绝对值的范围是2×10−38<N<2×1038,精度是十进制下的7位;双精度浮点数绝对值的范围是2×10−308<N<2×10308,精度是十进制下的15位
- 阶码全1时,如果尾数为0则代表无穷(符号位决定是+∞还是−∞);如果尾数不为0则代表Nan
- 阶码全0时,如果尾数全0则表示0,否则是非规格化数
3.3 浮点数运算
- 浮点数加法:对阶(小阶往大阶对)、尾数相加、规格化检查、舍入、溢出检测
- 浮点数乘法:阶码相加、尾数相乘、规格化、舍入、检查溢出
- 四种舍入:向0舍入(直接截断)、向上舍入、向下舍入、最近舍入(恰好0.5的时候舍入到偶数)
- 浮点数转换为int型,向0舍入
- int转化为double没有精度问题,int转化为float采用最近舍入
- 当两个单精度浮点数阶数
3.4 数据在存储器中的存放格式
- 大数端(Big Endian),最低字节存放在高地址;小数端(Little Endian),最低字节存放在低地址
- 数据对齐方式:字对齐、字不对齐
- 对齐存储规律:数据所在位置的起始地址是该数据类型长度(按字节)的倍数
- 通过调整变量定义的顺序,可以减少字节对齐产生的内存空间浪费
四、存储系统(一)
4.1 存储器层次结构
- 按存储介质,存储器分为:半导体存储器、磁存储器、激光存储器
- 按存储方式分:随机存储器、顺序访问存储器
- 按信息的可保存性分:易失性存储器(断电后信息消失)、非易失性存储器
- 高速缓存(SRAM)和主存(DRAM)统称为内存,固态硬盘(SSD)、磁盘、光盘都是外存
- 访存局部性原理:程序倾向于使用最近访问过的相同地址、或相邻地址的数据和指令
- 时间局部性(Temporal locality):最近访问的项目,在不久的将来还会再次被访问
- 空间局部性(Spatial locality):与当前访问项目相邻的项目很可能会被同时访问
4.2 静态随机访问存储器
- 静态:断电前内容持续保持
- 特点:昂贵、速度快
- 采用双译码可以降低译码电路复杂度(表达n个地址只需要2n根线)
4.3 动态随机访问存储器
- 主存一般采用DRAM,相比SRAM密度高、功耗低、价格便宜
- 刷新(refresh):为防止信息丢失而补充电荷的过程
- 刷新周期:两次刷新结束的间隔时间
- 最大刷新周期:从信息存储到信息泄露完毕的时间
- 刷新按行进行,先把一行的信息存入缓冲区(锁存器),然后再写回去
- SDRAM(同步动态随机访问存储器),可以猝发传输,即把一系列地址相邻的数据连续传输
- DDR-SDRAM(双倍速率同步动态随机访问存储器)
- DDR-SRAM的命名:DDR266,单位时间传输数据量为266*带宽,时钟频率为133MHz
4.4 存储器的构成
- 存储器性能衡量指标:延迟(Lantency):访问一个字所画花的时间;带宽(bandwidth):单位时间从存储器传到处理器的数据
- 访存过程:CPU↔内存控制器↔ 内存设备
- 多体交叉:多个存储体并行以实现猝发传输,连续的字存储在不同的存储体里(流水化访问),降低了平均访存延迟、增加了带宽
- 存储器扩展:位扩展(并联多个存储器,以解决CPU接口的数据位数和芯片数据位数不一致的问题),字扩展(增加地址空间),字位扩展(同时用两种方法)
4.5 高速缓存的原理
- Cache是内存以块为单位的一个子集
- 命中率:所有访问中,命中所占的比例
- 命中率设为h,tc表示命中时的访问时间,tm表示命中主存时的访问时间,则平均访问时间ta=htc+(1−h)tm
- Cache的关键问题:数据查找(Data Identification)、地址映射(Address Mapping)、替换策略(Placement Policy)、写入策略(Write Policy)
4.6 高速缓存的地址映射(1)
- 由于以块为单位,主存地址 = 主存块号 | 块内偏移量;同理Cache内数据的地址 = Cache块号 | 块内偏移量;地址映射变换机构将主存块号映射到Cache块号
- Cache对程序员是透明的
- 直接映射:假设Cache可以装n个块,则主存块号为i的块被映射到imodn,⌊i/n⌋被成为区号。主存地址 = 区号 | 块号 | 块内偏移量 = ⌊i/n⌋ | ⌊imodn⌋ | 块内偏移量;Cache的每一个块都有一个tag,这个tag就等于当前所存块的区号;缺点:交替访问两个冲突的地址,会发生乒乓效应
- 全相联映射:任何内存里的块都可以映射到任何告Cache中的块,命中率高,但是硬件开销大,替换算法复杂。一般用在容量小的Cache中
4.7 高速缓存的地址映射(2)
- 组相联映射:假设Cache有n块,Cache被分成u组,则内存被分成nm个区,每个区也被分成u组,内存中一个区的第i组和Cache中的第i组是全相联映射,把Cache中所有块按照除以u的余数分组,余数相同的是同一组。
- 主存地址 = Tag | 组号 | 块内偏移量,其中组号就是块号除以u的余数
- 假设每一组有s=un个块,则被成为s路组相联映射
- 增加关联度:增加一组之中的路数
- Cache容量小的场合用组相联或全相联映射
- Cache容量大的场合用直接映射
- Cache访问速度要求高的场合用直接相联映射
- Cache访问速度要求低的场合用全相联或组相联映射
五、存储系统(二)
5.1 高速缓存替换策略
- 常用替换策略:随机替换法、先进先出法(FIFO)、近期最久未使用法(LRU)
- FIFO:记录进入时间,替换最早进入的
- LRU:记录多久未访问,替换最久未使用的
- LRU一般优于FIFO,但是LRU可能出现颠簸现象
- LRU硬件开销大,可以使用伪LRU,使用二叉树,硬件开销更少、速度更快
5.2 高速缓存的更新策略
- 缓存命中时的写策略:写直达法(write through),同时修改Cache和内存;写回法(write back),该块被替换时修改内存(需要增加Drity位)
- 高速缓存行 = 高速缓存块 + valid位 + tag位 + (dirty位) + (LRU/FIFO位)
- 缓存不命中时的写策略:按写分配法(write-allocate),将数据读入缓存,在缓存中更新内容,常与写回法搭配使用;不按写分配法(No-write-allocate),直接修改内存中的内容,常与写直达搭配使用
- 对效率要求高,使用写回法;对安全性要求高,使用写直达法
5.3 高速缓存友好的代码
- 重复引用同一变量(时间局部性)、优先访问邻近的变量(空间局部性),可以降低失效率
- 关注最内层循环的失效率
- 矩阵乘法可以通过调整循环次序、矩阵分块来提高效率
5.4 虚拟存储器
- 一个程序的内存空间可以分成多个大小相同的页
- 如果不划分成大小相同的页,会发生碎片化
- 启动程序只需要调入部分页
- 页表项:页号、页框架号、状态位、访问字段(记录多久未被访问或者最近访问次数,替换页时参考)、修改位(类似dirty)、外存地址
- 地址转换策略:虚拟地址->物理地址
- 虚拟地址:虚页号+页内偏移量
- 页表很大,驻留在内存里
- 由于页表很大,不能线性存储,而采用多级页表
- TLB(Translation Lookaside Bffers)快表,将经常访问的虚实页关系放在高速缓存里
- VPN(Virtual page number),虚页号。VPO(Vritual page offset),虚页内偏移量。TLBT(TLB tag)。TLBI(TLB index),TLB组号,组相联时使用。
六、指令系统
6.1 MIPS指令系统简介
- MIPS-32发展到MIPS-64,寄存器数目没变,只是寄存器位宽从32变成了64
- 三种指令类型:I型(immediate,op|rs|rt|immediate),J型(Jump,op|target),R型(Register,op|rs|rt|rd|sa|funct)
6.2 MIPS控制流指令
- 条件跳转指令,立即数后面加上两个零,然后符号扩展,再与PC+4的结果相加
- beq,bnq,条件跳转
- slt和bne配合使用,可以表示小于跳转
- j,立即数无条件跳转(后面补两个0,然后与PC+4的高位拼接)
- jr,跳转到寄存器所存储的地址
- jal(jump and link),跳转到指定立即数地址之前,把当前的PC+4(下地址)存下来
6.3 MIPS过程调用指令
- 过程调用的六个步骤
- 主程序(调用者)将参数放置在过程(被调用者)可以访问到的位置($a0~$a3)
- 调用程序将系统控制权移交给被调用过程(jal)
- 被调用过程申请所需的内存资源
- 被调用过程执行相应的任务
- 被调用过程将结果放在主程序可以访问的位置($v0~$v1)
- 被调用过程将系统控制权移交给调用程序(jr $ra)
- stack是一块从高地址向低地址增长的存储空间,寄存器不够用时传参可以使用栈
- 为了防止过程调用时寄存器信息被覆盖,要把寄存器的内容存入栈
- $sp指向当前栈顶,$fp指向当前栈帧第一个字或者结构
七、处理器设计
7.1 处理器设计步骤
- 寄存器文件
- 读操作看作组合电路,ra、rb有效则输出busA和busB。
- 写操作,CLK边沿触发,当write enable=1时,将busW上的数据写入rw指定的寄存器
- 存储器
- 读操作,看作组合电路,一定时间内完成从address取出数据到data out
- 写存储器操作,时序电路,当clk边沿来到,且write enable=1时,将data in的数据写入address选中的字
- 加法器,组合逻辑单元
- 译码器,用于在多个输出中选中一个(比如3-8译码器,5-32译码器),组合逻辑
- ALU,算术逻辑单元,组合逻辑
- 多路选择器,组合逻辑
7.2 处理器的数据通路
- PC寄存器存储当前指令地址,时序逻辑
- 指令存储器存储指令,组合逻辑
- 这一节主要讲了如何连线,所以电路图比较多,难以描述,建议直接看ppt或者看书
7.3 控制信号
- 控制信号
- ALUCtr 运算操作码(指定操作类型)
- ALUSrc ALU数据选择(立即数/寄存器读出来的值)
- ExtOp 是否带符号扩展
- Branch 是否为条件转移指令
- Jump 是否为无条件转移指令
- MemWrite 存储器写
- MemtoReg 用ALU的结果还是Mem读出的数写进Reg
- RegWrite 寄存器写使能
- RegDst 用哪个字段作为写目的寄存器(rt/rd)
- 机器指令输入控制器,控制器输出这些信号,同时ALU的零标志位fz也会作为控制器的输入
7.4 控制逻辑
- 这部分讲了控制器中如何根据输入输出的逻辑关系,建立逻辑表达式,从而建立逻辑电路,这部分主要是大量的推导,而且比较偏实践,掌握方法即可,理论考试中应该大概率不会详细考察
7.5 多周期处理器
- 单周期处理器的周期必须设置为耗费时间最长的指令所消耗的时间
- 单周期处理器在一个周期内只进行一次译码,直接确定所有的控制信号
- 多周期处理器在部件之间添加了寄存器,因此执行单条指令所化的时间会长于单周期处理器
- 多周期处理器在一个时钟周期只能完成一个最基本的动作
- 机器周期/CPU周期:从内存中读取一个指令字的最短时间,包含若干时钟周期
- 指令周期:从内存中取一条指令并执行指令所用的时间,又若干个CPU周期组成。
注意
- 这一部分光看提纲应该无法较好的掌握,需要结合电路图才能深刻理解,建议去看一下ppt、教材或者网课
八、流水线处理器
8.1 流水线处理器的原理
- 五个流水段
- Ifetch(IF): 取指令,PC+4
- Reg/Dec(ID):读寄存器、指令译码
- Exec(EX):计算
- Mem(MEM):访问存储器
- Wr(WB):写寄存器
- R型指令的Mem阶段,sw指令的Wr阶段,beq的Wr阶段等等,都是空操作,添加空操作是为了统一每条指令的阶段数,从而避免冲突;beq的Mem阶段写入PC
- 流水线提高了吞吐率
- 理想情况下,流水线CPI=1
8.2 流水线处理器的实现
- 流水线处理器要设置段寄存器
- 译码阶段将控制信号装入段寄存器,后面每个阶段取一部分信号使用
- 扩展立即数在第二阶段,译码结束之后立刻扩展(译码得出ExtOp )
- 在EX阶段使用RegDst信号,将rd和rt保留其中一个,可以减少EX/MEM寄存器的位宽
- 条件转移指令在MEM阶段修改PC
- 每个段寄存器需要的位数:
- IF/ID:32+32=64(指令+下一条指令地址)
- ID/EX:9+32×4+5×2=147(控制信号+下一条指令地址+扩展后的立即数+寄存器取出的两个数+rt+rd)
- EX/MEM:4+1+32×3+5=106(控制信号+zero+ALUout+Branch地址+rt或rd的编码)
- MEM/WB:2+32×2+5=71(控制信号+ALUout+MEMout+rt或rd的编码)
8.3 相关性与冒险
- MIPS流水线简化表达:IM,Reg,ALU,DM,Reg
- 结构冒险:所需的部件正在为之前的指令工作
- 数据冒险:需要等待之前的指令完成读写
- 控制冒险:需要根据指令的结果决定下一步
- 解决结构冒险方案:插入空指令(nop)
- 为了防止取指令和取数据的时候发生结构冒险,现在都采用指令cache与数据cache分离的方法
- 由于Reg的读写时间比较快,为了避免发生读写寄存器的结构冒险,采用前半个周期写寄存器(clock下降沿)、后半个周期读寄存器的方法(clock上升沿)
8.4 数据冒险
- 两类数据冒险:使用寄存器引发的数据冒险、读存储器-使用数据冒险
- 一种解决数据冒险的硬件方法:流水线停顿(stall),将指令停顿几个周期,需要在译码时增加检测电路。
- 软件解决方法:编译器插入NOP
- 另一种硬件解决方法:前向传递(forwarding),不等写回寄存器,就将结果直接送至需要结果的单元
8.5 控制冒险
- 由转移指令引起
- 解决控制指令最简单的方法:清空,把错误执行的指令对应的段寄存器清空。代价较大,会导致无条件跳转指令CPI变成2,条件跳转指令CPI变成4
- 控制冒险
- 分支提前决策:把=0的判断移至ID段
- 转移延迟槽:将一条或几条肯定会执行的指令移到branch之后,隐藏转移指令的延迟
- 转移延迟槽大小是n,这是体系结构与编译器之间的约定
8.6 流水线的优化
- 策略1:深度流水。减少时钟周期的长度(提高时钟频率),同时要增加流水线的段数(级数)。但不是段数越多越好,因为段寄存器的延迟会成为时间瓶颈,而且段寄存器的延迟会增加单挑指令的执行时间。会引起前向通路增多,硬件开销增加,性能下降,增加停顿的可能性,功耗增大
- 策略2:多发射,一次取出并执行多条指令,使得CPI<1。静态多发射:编译器决定哪些指令可以同时发射;动态发射:执行时确定哪些指令可以并行(超标量处理器)。动态发射可以分为按序执行、乱序执行。
版权所属
西北工业大学2018级数据科学专业ACoder
标签:存储器,复习,参考,Cache,32,系统结构,地址,指令,寄存器 来源: https://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/107008907