中央处理器
CPU节主要讨论了CPU如何执行指令与相关的pipeline、指令执行的时候遇到异常与中断如何处理、如何通过并发/多核的方式提高CPU的效率
CPU的基本结构
CPU的基本结构包含
- 程序计数器(PC) -- 存放即将执行的指令在主存中的地址,并在顺序执行时根据指令执行顺序进行自增,遇到转移型指令时进行指令的转移。
- 指令寄存器(IR) -- 暂存当前执行的指令
- 通用寄存器(GRPs) -- 灵活使用的寄存器,可以暂存操作数、地址指针和一些中间结果,用于减少对主存访问以提高运行效率。通用寄存器的容量取决于机器字长
- 标志寄存器(FR) -- 存储ALU计算的标志值,比如CF、ZF、OF
- 存储器地址寄存器(MAR) -- 临时存放读写主存的地址用以下一步访问主存
- 存储器数据寄存器(MDR) -- 临时存放读写主存的数据用以下一步访问主存
- 算术逻辑单元(ALU) -- 计算的基本单元,输出计算结果与计算标记值
CPU中的寄存器分为用户可见寄存器与用户不可见寄存器。不可见寄存器面向汇编程序员是透明的
通用/专用寄存器组与程序计数器是用户可见可修改的用户可见寄存器
标志寄存器是用户可见寄存器,但是其结果来源于ALU计算,用户不可修改。
指令寄存器、存储器地址/数据寄存器、页表基址寄存器是用户不可见的寄存器
指令的执行过程
指令的执行过程分为取值、执行、中断,取值段是指令的预备阶段,进行指令取址;在执行阶段进行指令的译码、操作数取址与执行,存储操作数;中断阶段结束指令,将CPU操作中断并保存断点。
断点通常指的是指令断点,断点寄存器存储中断的指令地址。中断入口存入PC
指令的时间周期
指令的执行通常分为五个流水段
- 取指
- 译码/读存
- 执行/计算地址
- 访存
- 写回
指令流水线
指令流水线重叠执行,下一条指令比当前指令晚一个之间周期。满足严格的
高效的指令流水线需要指令集满足:
- 指令定长: 简化取址逻辑
- 指令格式规整: 操作数寄存器位置固定,支持译码前预取操作数
- 只使用
LOAD/STORE访存 - 数据与指令边界对齐排放
RISC指令集是严格标准满足以上条件的指令集
流水线的吞吐率表示单位时间内流水线完成的任务数
理论情况下单发射的指令pipeline最大的吞吐率是CPU的主频,也就是时钟频率的倒数
MIPS指令集的流水线
MIPS的指令集分为三类六种指令
ALU相关的指令有:
- R型 -- 寄存器运算
- I型 -- 立即数运算
存取相关的指令有:
- lw型 -- 内存读取数据入寄存器
- sw型 -- 寄存器将数据写入内存
转移相关的指令
- beq型 -- 比较寄存器值,如果相等就直接转移,否则按顺序执行地址指向的指令
- j型 -- 将目标指令无条件转移到PC
流水线的冒险
流水线的冒险分为
- 结构冒险 -- 前后指令占据了相同的功能部件而冲突
- 数据冒险 -- 前后指令对于某一数据的访问冲突,通常为前一数据修改的时刻晚于后一指令的读取时刻,导致后一指令的读取失真(RAW冲突);或者上一条加载数据的指令晚于下一条使用数据的访存段(load-use冒险)
- 控制冒险 -- 指令遇到转移、中断、异常等事件,改变了PC的地址导致流水线断流
流水线冒险的解决方式
- 结构冒险的解决方式
结构冒险通常是访存冒险或者寄存器冒险。
对于指令、数据共享的存储器,假如第 条指令是访存指令LOAD,其第四个时钟周期处于MEM访问数据存储器流水段,而第 条指令处于IF取指段,此时两条指令出现主存/Cache访问冲突
WB写回流水段写入区域是CPU内的寄存器而不是存储单元,因此不会发生结构冒险
解决结构冒险的主要方法
-
每一个功能部件在单条指令内部只使用一次且在固定阶段使用
-
增加硬件资源,例如将指令存储器和数据存储器解耦;将寄存器堆的写口和读口分离;支持将单个时钟周期分为前半周期写,后半周期读等策略
-
数据冒险
数据冒险分为RAW冒险和Load-Use冒险
- RAW冒险指前序指令写结果段晚于后序指令读数据段,导致读结果的数据失真。通常发生在
WB-ID之间
解决RAW冒险的方式有延迟执行指令与转发技术。延迟执行指令通过软件插入空指令以延后执行指令,硬件插入气泡阻塞延迟单条指令执行的首时间周期; 转发技术则是在EX段通过转发通路实现ALU之间的通信,相对应的值通过流水段寄存器存储并传递,从而规避了写/读数据的时间差
- Load-Use冒险只发生在相关的
load指令与use指令间,第时条load指令的第四个流水段MEM段才读取主存中的数据,但是第条use指令只能读取load未更新的操作数
use指令添加一个阻塞时间周期后,load的MEM段就能与use的ID段对齐,这样能严格保证use的EX段发生在load的MEM段之后
- 控制冒险
核心策略为加阻塞和分支预测
分支预测技术分为静态预测与动态预测,静态预测使用简单的规则预测转移发生与否;动态预测程序转移的历史动态以调整预测,准确度更高。分支预测错误需要清空流水线内的错误路径指令并重新取指
高级流水线
高级流水线技术能提高流水线并行度以提高效率
-
超标量流水线技术(动态多发射) -- 一个周期并行多条指令,通常以顺序执行(现代计算机支持乱序执行),控制较为复杂
-
超长指令字技术(静态多发射) -- 将多条可并行执行指令打包为一条超长的指令字作为单条指令执行,包含多指令多操作码,分别实现不同功能。并行性由软件决定,控制比较简单
-
超流水线技术 -- 进一步细分流水段以压缩时钟周期,使得整体主频降低
数据通路*
控制器
控制器分为硬布线控制器与微程序控制器。CISC-微程序控制器. RISC-硬布线控制器
硬布线控制器
硬布线控制器将操作码 位操作码译码为 种具体输出信号。硬布线控制器的控制逻辑简单,响应速度快,但是灵活性差,修改新增指令需要重新设计控制器
微程序控制器
微程序控制器相当于将单一指令拆解为若干条微指令执行,机械指令与微程序一一对应。一个微程序可以划分为若干个微指令,微指令可以划分为若干个微命令,以及相对应的微操作。
微程序控制器中有对应的专门寄存器
- 微地址寄存器( PC/ CMAR)
- 微指令寄存器( IR/ CMDR)
微指令编码方式
-
直接编码方式 -- 每一位直接对应一个微指令
-
字段直接编码方式 -- 分为若干互斥段编码, 互斥的微指令归入相同的互斥段,相容的微指令放入不同的互斥段。互斥段之间的相容进指令进行静态多发射类似的并行。每一个字段内还保留一个全置0的状态,因此有效的互斥微指令只有 条
-
字段间接编码方式 -- 使用交叉编码的方式确定单条微指令的某一字段的意义,字段A的实际意义可能由字段A与字段B共同决定。
微指令的格式
微指令格式可分为水平型微指令与垂直型微指令
直接编码方式、字段直接编码方式与字段间接编码方式均为水平型编码,能快速并行执行微指令,但是微指令的整体字长会很长,且编写程序较为困难
垂直型微指令由微操作码、目的地址与源地址构成,格式规整,但是一次只能完成一个基本动作,执行效率低,并行能力差。
指令的异常与中断
异常(内中断) -- 指CPU执行命令过程中检出的内部同步事件,比如除零错误、缺页、非法操作码等,由指令引发,具有确定性且可复现
中断(外中断) -- 外部设备,如IO发生的异步事件,用于通知CPU外设的状态变化
异常分为
- 故障(Fault) -- 指令启动后但是未执行完出现的问题,例如非法操作码、缺页故障等。缺页故障这类可以修复的故障,操作系统会处理完毕后恢复,无法修复时会终止进程
- 自陷(Trap) -- 在指令完成后触发的异常,用于有目的性的转入系统内核。X86中的断点指令
INT 3、系统调用指令syscall、MIPS中的条件自陷指令teq等
执行当前指令 -- 保存断点并自陷 -- 执行相应处理程序 -- 恢复断点并执行下一条指令
- 故障(Abort) -- 严重的硬件故障导致的程序中止,CPU会切换到相关的异常服务程序,记录信息或者重启系统。
终止中断与外中断属于硬件中断;故障与自陷属于软件中断
中断的分类
中断可分为可屏蔽中断与不可屏蔽中断
不可屏蔽中断的优先级高于可屏蔽中断,对于总线的占据优先级
DMA > 不可屏蔽中断 > 可屏蔽中断
在IO设备中的中断等级通常为
高速设备 > 低速设备
输入设备 > 输出设备
实时设备 > 普通设备
中断请求通常由中断请求标记寄存器进行管理,中断源设置中断请求标记触发器,当请求标记置为1时表示中断源发出中断
可屏蔽中断的中断请求线为INTR, 不可屏蔽中断的中断请求线为NMI
中断的识别
中断的识别分为向量中断与非向量中断
向量中断中,中断源分配了唯一中断类型号,以匹配中断源对应中断向量在中断向量表的位置。基于中断向量表的中断源地址管理方式称为向量中断
非向量中断通过软件读取设备的状态寄存器,通过查询确定中断源。
中断的处理
中断的过程分为中断前的中断隐指令与中断服务程序
中断隐指令包含:
- 关中断
- 保存断点
- 中段服务寻址
中断隐指令是为中断服务程序做准备的流程
中断服务程序包含:
- 保存现场与中断屏蔽字
- 开中断
- 执行中断服务程序
- 关中断
- 恢复现场与中断屏蔽字
- 开中断
- 中断返回
多重中断与中断屏蔽
硬件规定了中断响应优先级,中断程序能通过改变中断屏蔽字寄存器以改变中断的处理优先级。中断屏蔽字与中断源头的相对序关系相关
并发与多处理器
计算机体系分类
- SISD
- SIMD -- 一条指令并行处理多个处理单元的数据流,处理分支任务效率较低。 向量存储器是是SIMD的典型场景,在计算场景中较为常见。
- MISD
- MIMD -- 分为多计算机系统与多处理器系统,多计算机系统的每一个结点都具有独立的存储器和地址空间,无法交叉访存,只能通过消息共享实现通信,也称为消息传递型MIMD; 多处理器系统能够共享存储器,同时地址空间也统一,也称为共享存储型MIMD
硬件多线程
硬件多线程分为
- 细粒度多线程 -- 单个时钟周期可以并发同一线程的多条指令
- 粗粒度多线程 -- 连续执行同一线程的指令,直到流水线发生阻塞后切换线程
- 同时多线程(SMT) -- 能并发不同线程的多条指令
Intel的超线程技术是SMT的代表,通过一个物理核心维护两套完整的线程状态硬件,执行硬件由两个逻辑核心共享,能实现单核性能逼近双核的并发能力。
多核处理器
每一个核心共享独立的CPU状态、执行单元,通过核间共享网络通信并共享存储器,通常具有L1(有时包括L2)寄存器,共享高层级寄存器
