ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《计算机组成原理与系统结构》复习参考

2020-06-30 21:36:36  阅读:592  来源: 互联网

标签:存储器 复习 参考 Cache 32 系统结构 地址 指令 寄存器


前言

本文档是作者在准备《计算机组成原理与系统结构》时,一边复习一边编撰的,耗时五个白天。今天发出这篇文档与大家共享,是为了帮助大家缕清思路,帮助大家更好的复习。具体在复习时还请以课本或老师的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) ×\times× 平均每条指令的执行时间
  • 平均每条指令的执行时间 = 平均每条指令所花费的时钟周期(CPI) ×\times× 一个时钟周期长度(CT)
  • MIPS(Million Instruction Per Second):每秒执行百万指令条数
  • FLOPS(Floating Point Operation Per Second):每秒浮点运算次数
  • MFLOPS, GFLOPS, TFLOPS

1.4 性能设计的基本原则

  • 性能优化设计基本原则:大概率事件优先、Amdahl定律
  • 系统加速比 = 改进后性能/改进前性能 = 改进前时间/改进后时间
  • Amdahl定律:总时间看作1, 系统加速比 = =1+\Large\frac{改进前时间}{改进后时间} = \frac{1}{未改进部分占比+\frac{改进部分占比}{改进部分加速提升比}}改进后时间改进前时间​=未改进部分占比+改进部分加速提升比改进部分占比​1​,加速比上限=1=\frac{1}{未改进部分占比}=未改进部分占比1​
  • 如果仅对计算机一部分性能做改进,改进越多、系统获得的效果越小
  • 并行计算性能的提升,受到了程序中必须串行的部分的限制

二、整数的表示与运算

2.1 整数的编码

  • 整数表示:原码、补码、反码
  • 原码:最高位符号位、剩下的位是绝对值,零有两种表示,不方便计算
  • 反码:最高位符号位,如果是负数后面的部分取反,零有两种表示、不方便计算
  • 补码:最高位符号位,如果是正数则数值部分不变,否则取反加一,零唯一、没有正负零,可以直接相加
  • 补码中减法可以转化为加法
  • 补码是以2n+12^{n+1}2n+1为模的计量系统

2.2 有符号数和无符号数之间的转换

  • 显式转换、隐式转换
  • 当length是无符号数的时候,i<=length-1有漏洞(length==0)

2.3 按位运算与逻辑运算

  • 位运算有对应的机器指令,逻辑运算没有
  • 逻辑短路,表达式可以只判断前面一段

2.4 整数的扩展、截断、移位

  • 0扩展:用于无符号数,直接添加0
  • 符号扩展:扩展符号位
  • 强行将长数转化为短数的时候,发生截断
  • 左移:抛弃最高位、低位填0
  • 右移:逻辑右移、符号右移(补符号位)

2.5 整数的加减运算

  • 一位全加器:输入A,B,carry_in,输出scarry_out
  • 32个全加器串联就得到串行进位加法器,简单、速度慢
  • 减法就是把B取反加一,通过添加32个异或门,以及在最低位一位全加器的carry_in输入1来实现。这个也适用于无符号数
  • ALU(arithmetic and logic unit),算术逻辑单元可以进行算术运算和逻辑运算

2.6 溢出的判断

  • 符号相异的数做加法或者符号相同的数做减法,都不会溢出;符号相同的数做加法,符号不同的数做减法,可能溢出
  • 符号判断法:两个正数相加得到负数,或者两个负数相加得到正数。缺点:速度慢,需要等运算结果产生后才能判断
  • 进位判断法:次高位和最高位进位位相异或,结果为1则溢出
  • 双符号位判断法:符号位扩展一位,正数00,负数11,相加之后看看符号位两位是否相同,相同就没溢出,不相同就溢出
  • 溢出判断只适合于有符号整数,不适合于无符号整数
  • C编译器忽略溢出信号

2.7 定点数的乘法

  • 用加法器实现原码乘法:被乘数存放在R2R2R2,乘数存放在R1R1R1,R0R0R0作为辅助的寄存器。每次检测R1R1R1的最低位决定是否要把R2R2R2加给R0R0R0,然后把R0,R1R0,R1R0,R1这两个寄存器组成的整体进行逻辑右移。假设寄存器宽度是www位,做www次这样的加法之后,R0R0R0就存着高www位,R1R1R1就存着低www位。优点:简单,缺点:慢
  • booth算法:针对补码乘法,流程和原码乘法大致相同,每次把(yiyi+1)x(y_i-y_{i+1})x(yi​−yi+1​)x的值加到R0R0R0上,加完之后要把R0,R1R0,R1R0,R1整体算术右移。iii从1-1−1开始,并规定y1=0y_{-1}=0y−1​=0

2.8 整数的乘法

  • 有符号数相乘,可以直接当作无符号数相乘,然后取最后www位,结果是正确的

三、浮点数的表示与运算

3.1 浮点数的表示

  • 浮点数编码:符号位S、阶码E、尾数M
  • 如果用补码表示尾数,那么必须最高位和次高位不同才是规格化的

3.2 IEEE754浮点数

  • 单精度浮点数阶码8位,尾数23位;双精度阶码11位,尾数52位
  • 阶码所表示的数字减去127得到实际的阶(双精度1023)
  • 规格化浮点数的真值为(1)s×(1+f)×2E127(-1)^s \times (1+f)\times 2^{E-127}(−1)s×(1+f)×2E−127
  • 单精度浮点数绝对值的范围是2×1038<N<2×10382 \times 10^{-38} < N < 2 \times 10^{38}2×10−38<N<2×1038,精度是十进制下的7位;双精度浮点数绝对值的范围是2×10308<N<2×103082 \times 10^{-308} < N < 2 \times 10^{308}2×10−308<N<2×10308,精度是十进制下的15位
  • 阶码全1时,如果尾数为0则代表无穷(符号位决定是++\infin+∞还是-\infin−∞);如果尾数不为000则代表NanNanNan
  • 阶码全000时,如果尾数全000则表示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 静态随机访问存储器

  • 静态:断电前内容持续保持
  • 特点:昂贵、速度快
  • 采用双译码可以降低译码电路复杂度(表达nnn个地址只需要2n2\sqrt n2n​根线)

4.3 动态随机访问存储器

  • 主存一般采用DRAM,相比SRAM密度高、功耗低、价格便宜
  • 刷新(refresh):为防止信息丢失而补充电荷的过程
  • 刷新周期:两次刷新结束的间隔时间
  • 最大刷新周期:从信息存储到信息泄露完毕的时间
  • 刷新按行进行,先把一行的信息存入缓冲区(锁存器),然后再写回去
  • SDRAM(同步动态随机访问存储器),可以猝发传输,即把一系列地址相邻的数据连续传输
  • DDR-SDRAM(双倍速率同步动态随机访问存储器)
  • DDR-SRAM的命名:DDR266,单位时间传输数据量为266*带宽,时钟频率为133MHz

4.4 存储器的构成

  • 存储器性能衡量指标:延迟(Lantency):访问一个字所画花的时间;带宽(bandwidth):单位时间从存储器传到处理器的数据
  • 访存过程:CPUCPU \leftrightarrowCPU↔内存控制器\leftrightarrow↔ 内存设备
  • 多体交叉:多个存储体并行以实现猝发传输,连续的字存储在不同的存储体里(流水化访问),降低了平均访存延迟、增加了带宽
  • 存储器扩展:位扩展(并联多个存储器,以解决CPU接口的数据位数和芯片数据位数不一致的问题),字扩展(增加地址空间),字位扩展(同时用两种方法)

4.5 高速缓存的原理

  • Cache是内存以块为单位的一个子集
  • 命中率:所有访问中,命中所占的比例
  • 命中率设为hhh,tct_ctc​表示命中时的访问时间,tmt_mtm​表示命中主存时的访问时间,则平均访问时间ta=htc+(1h)tmt_a = ht_c+(1-h)t_mta​=htc​+(1−h)tm​
  • Cache的关键问题:数据查找(Data Identification)、地址映射(Address Mapping)、替换策略(Placement Policy)、写入策略(Write Policy)

4.6 高速缓存的地址映射(1)

  • 由于以块为单位,主存地址 = 主存块号 | 块内偏移量;同理Cache内数据的地址 = Cache块号 | 块内偏移量;地址映射变换机构将主存块号映射到Cache块号
  • Cache对程序员是透明的
  • 直接映射:假设Cache可以装n个块,则主存块号为i的块被映射到imod  ni \mod nimodn,i/n\lfloor i/n\rfloor⌊i/n⌋被成为区号。主存地址 = 区号 | 块号 | 块内偏移量 = i/n\lfloor i/n \rfloor⌊i/n⌋ | imod  n\lfloor i \mod n \rfloor⌊imodn⌋ | 块内偏移量;Cache的每一个块都有一个tag,这个tag就等于当前所存块的区号;缺点:交替访问两个冲突的地址,会发生乒乓效应
  • 全相联映射:任何内存里的块都可以映射到任何告Cache中的块,命中率高,但是硬件开销大,替换算法复杂。一般用在容量小的Cache中

4.7 高速缓存的地址映射(2)

  • 组相联映射:假设Cache有nnn块,Cache被分成uuu组,则内存被分成mn\frac{m}{n}nm​个区,每个区也被分成uuu组,内存中一个区的第iii组和Cache中的第iii组是全相联映射,把Cache中所有块按照除以uuu的余数分组,余数相同的是同一组。
  • 主存地址 = Tag | 组号 | 块内偏移量,其中组号就是块号除以uuu的余数
  • 假设每一组有s=nus = \frac{n}{u}s=un​个块,则被成为sss路组相联映射
  • 增加关联度:增加一组之中的路数
  • 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=6432+32=6432+32=64(指令+下一条指令地址)
    • ID/EX:9+32×4+5×2=1479+32\times 4+5\times 2=1479+32×4+5×2=147(控制信号+下一条指令地址+扩展后的立即数+寄存器取出的两个数+rt+rd)
    • EX/MEM:4+1+32×3+5=1064+1+32\times 3+5=1064+1+32×3+5=106(控制信号+zero+ALUout+Branch地址+rt或rd的编码)
    • MEM/WB:2+32×2+5=712+32\times 2+5=712+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=0=0的判断移至ID段
  • 转移延迟槽:将一条或几条肯定会执行的指令移到branch之后,隐藏转移指令的延迟
  • 转移延迟槽大小是nnn,这是体系结构与编译器之间的约定

8.6 流水线的优化

  • 策略1:深度流水。减少时钟周期的长度(提高时钟频率),同时要增加流水线的段数(级数)。但不是段数越多越好,因为段寄存器的延迟会成为时间瓶颈,而且段寄存器的延迟会增加单挑指令的执行时间。会引起前向通路增多,硬件开销增加,性能下降,增加停顿的可能性,功耗增大
  • 策略2:多发射,一次取出并执行多条指令,使得CPI<1。静态多发射:编译器决定哪些指令可以同时发射;动态发射:执行时确定哪些指令可以并行(超标量处理器)。动态发射可以分为按序执行、乱序执行。

版权所属

西北工业大学2018级数据科学专业ACoder

标签:存储器,复习,参考,Cache,32,系统结构,地址,指令,寄存器
来源: https://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/107008907

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有