中央处理器

CPU节主要讨论了CPU如何执行指令与相关的pipeline、指令执行的时候遇到异常与中断如何处理、如何通过并发/多核的方式提高CPU的效率

CPU的基本结构

CPU的基本结构包含

  • 程序计数器(PC) -- 存放即将执行的指令在主存中的地址,并在顺序执行时根据指令执行顺序进行自增,遇到转移型指令时进行指令的转移。
  • 指令寄存器(IR) -- 暂存当前执行的指令
  • 通用寄存器(GRPs) -- 灵活使用的寄存器,可以暂存操作数、地址指针和一些中间结果,用于减少对主存访问以提高运行效率。通用寄存器的容量取决于机器字长
  • 标志寄存器(FR) -- 存储ALU计算的标志值,比如CF、ZF、OF
  • 存储器地址寄存器(MAR) -- 临时存放读写主存的地址用以下一步访问主存
  • 存储器数据寄存器(MDR) -- 临时存放读写主存的数据用以下一步访问主存
  • 算术逻辑单元(ALU) -- 计算的基本单元,输出计算结果与计算标记值

CPU中的寄存器分为用户可见寄存器与用户不可见寄存器。不可见寄存器面向汇编程序员是透明

通用/专用寄存器组与程序计数器是用户可见可修改的用户可见寄存器

标志寄存器是用户可见寄存器,但是其结果来源于ALU计算,用户不可修改。

指令寄存器、存储器地址/数据寄存器、页表基址寄存器是用户不可见的寄存器

指令的执行过程

指令的执行过程分为取值、执行、中断,取值段是指令的预备阶段,进行指令取址;在执行阶段进行指令的译码、操作数取址与执行,存储操作数;中断阶段结束指令,将CPU操作中断并保存断点。

断点通常指的是指令断点,断点寄存器存储中断的指令地址。中断入口存入PC

指令的时间周期

指令的执行通常分为五个流水段

  • 取指
  • 译码/读存
  • 执行/计算地址
  • 访存
  • 写回

指令流水线

指令流水线重叠执行,下一条指令比当前指令晚一个之间周期。满足严格的 CPI=1CPI = 1

高效的指令流水线需要指令集满足:

  • 指令定长: 简化取址逻辑
  • 指令格式规整: 操作数寄存器位置固定,支持译码前预取操作数
  • 只使用LOAD/STORE访存
  • 数据与指令边界对齐排放

RISC指令集是严格标准满足以上条件的指令集

流水线的吞吐率表示单位时间内流水线完成的任务数

TP=nTk\text{TP} = \frac{n}{T_k}

理论情况下单发射的指令pipeline最大的吞吐率是CPU的主频,也就是时钟频率的倒数

MIPS指令集的流水线

MIPS的指令集分为三类六种指令

ALU相关的指令有:

  • R型 -- 寄存器运算
  • I型 -- 立即数运算

存取相关的指令有:

  • lw型 -- 内存读取数据入寄存器
  • sw型 -- 寄存器将数据写入内存

转移相关的指令

  • beq型 -- 比较寄存器值,如果相等就直接转移,否则按顺序执行地址指向的指令
  • j型 -- 将目标指令无条件转移到PC
流水线的冒险

流水线的冒险分为

  • 结构冒险 -- 前后指令占据了相同的功能部件而冲突
  • 数据冒险 -- 前后指令对于某一数据的访问冲突,通常为前一数据修改的时刻晚于后一指令的读取时刻,导致后一指令的读取失真(RAW冲突);或者上一条加载数据的指令晚于下一条使用数据的访存段(load-use冒险)
  • 控制冒险 -- 指令遇到转移、中断、异常等事件,改变了PC的地址导致流水线断流
流水线冒险的解决方式
  • 结构冒险的解决方式

结构冒险通常是访存冒险或者寄存器冒险。

对于指令、数据共享的存储器,假如第 ii 条指令是访存指令LOAD,其第四个时钟周期处于MEM访问数据存储器流水段,而第i+3i+3 条指令处于IF取指段,此时两条指令出现主存/Cache访问冲突

WB写回流水段写入区域是CPU内的寄存器而不是存储单元,因此不会发生结构冒险

解决结构冒险的主要方法

  • 每一个功能部件在单条指令内部只使用一次且在固定阶段使用

  • 增加硬件资源,例如将指令存储器和数据存储器解耦;将寄存器堆的写口和读口分离;支持将单个时钟周期分为前半周期写,后半周期读等策略

  • 数据冒险

数据冒险分为RAW冒险和Load-Use冒险

  • RAW冒险指前序指令写结果段晚于后序指令读数据段,导致读结果的数据失真。通常发生在WB-ID之间

解决RAW冒险的方式有延迟执行指令与转发技术。延迟执行指令通过软件插入空指令以延后执行指令,硬件插入气泡阻塞延迟单条指令执行的首时间周期; 转发技术则是在EX段通过转发通路实现ALU之间的通信,相对应的值通过流水段寄存器存储并传递,从而规避了写/读数据的时间差

  • Load-Use冒险只发生在相关的 load指令与use指令间,第ii时条load指令的第四个流水段MEM段才读取主存中的数据,但是第i+1i+1use指令只能读取load未更新的操作数

use指令添加一个阻塞时间周期后,loadMEM段就能与useID段对齐,这样能严格保证useEX段发生在loadMEM段之后

  • 控制冒险

核心策略为加阻塞和分支预测

分支预测技术分为静态预测与动态预测,静态预测使用简单的规则预测转移发生与否;动态预测程序转移的历史动态以调整预测,准确度更高。分支预测错误需要清空流水线内的错误路径指令并重新取指

高级流水线

高级流水线技术能提高流水线并行度以提高效率

  • 超标量流水线技术(动态多发射) -- 一个周期并行多条指令,通常以顺序执行(现代计算机支持乱序执行),控制较为复杂

  • 超长指令字技术(静态多发射) -- 将多条可并行执行指令打包为一条超长的指令字作为单条指令执行,包含多指令多操作码,分别实现不同功能。并行性由软件决定,控制比较简单

  • 超流水线技术 -- 进一步细分流水段以压缩时钟周期,使得整体主频降低

数据通路*

控制器

控制器分为硬布线控制器与微程序控制器。CISC-微程序控制器. RISC-硬布线控制器

硬布线控制器

硬布线控制器将操作码 nn 位操作码译码为 2n2^n 种具体输出信号。硬布线控制器的控制逻辑简单,响应速度快,但是灵活性差,修改新增指令需要重新设计控制器

微程序控制器

微程序控制器相当于将单一指令拆解为若干条微指令执行,机械指令与微程序一一对应。一个微程序可以划分为若干个微指令,微指令可以划分为若干个微命令,以及相对应的微操作。

微程序控制器中有对应的专门寄存器

  • 微地址寄存器(μ\mu PC/ CMAR)
  • 微指令寄存器(μ\mu IR/ CMDR)

微指令编码方式

  • 直接编码方式 -- 每一位直接对应一个微指令

  • 字段直接编码方式 -- 分为若干互斥段编码, 互斥的微指令归入相同的互斥段,相容的微指令放入不同的互斥段。互斥段之间的相容进指令进行静态多发射类似的并行。每一个字段内还保留一个全置0的状态,因此有效的互斥微指令只有 2n12^n-1

  • 字段间接编码方式 -- 使用交叉编码的方式确定单条微指令的某一字段的意义,字段A的实际意义可能由字段A与字段B共同决定。

微指令的格式

微指令格式可分为水平型微指令与垂直型微指令

直接编码方式、字段直接编码方式与字段间接编码方式均为水平型编码,能快速并行执行微指令,但是微指令的整体字长会很长,且编写程序较为困难

垂直型微指令由微操作码、目的地址与源地址构成,格式规整,但是一次只能完成一个基本动作,执行效率低,并行能力差。

指令的异常与中断

异常(内中断) -- 指CPU执行命令过程中检出的内部同步事件,比如除零错误、缺页、非法操作码等,由指令引发,具有确定性且可复现

中断(外中断) -- 外部设备,如IO发生的异步事件,用于通知CPU外设的状态变化

异常分为

  • 故障(Fault) -- 指令启动后但是未执行完出现的问题,例如非法操作码、缺页故障等。缺页故障这类可以修复的故障,操作系统会处理完毕后恢复,无法修复时会终止进程
  • 自陷(Trap) -- 在指令完成后触发的异常,用于有目的性的转入系统内核。X86中的断点指令INT 3、系统调用指令syscall、MIPS中的条件自陷指令teq
执行当前指令 -- 保存断点并自陷 -- 执行相应处理程序 -- 恢复断点并执行下一条指令
  • 故障(Abort) -- 严重的硬件故障导致的程序中止,CPU会切换到相关的异常服务程序,记录信息或者重启系统。

终止中断与外中断属于硬件中断;故障与自陷属于软件中断

中断的分类

中断可分为可屏蔽中断与不可屏蔽中断

不可屏蔽中断的优先级高于可屏蔽中断,对于总线的占据优先级

DMA > 不可屏蔽中断 > 可屏蔽中断

在IO设备中的中断等级通常为

高速设备 > 低速设备
输入设备 > 输出设备
实时设备 > 普通设备

中断请求通常由中断请求标记寄存器进行管理,中断源设置中断请求标记触发器,当请求标记置为1时表示中断源发出中断

可屏蔽中断的中断请求线为INTR, 不可屏蔽中断的中断请求线为NMI

IO管理

中断的识别

中断的识别分为向量中断非向量中断

向量中断中,中断源分配了唯一中断类型号,以匹配中断源对应中断向量在中断向量表的位置。基于中断向量表的中断源地址管理方式称为向量中断

非向量中断通过软件读取设备的状态寄存器,通过查询确定中断源。

中断的处理

中断的过程分为中断前的中断隐指令中断服务程序

中断隐指令包含:

  • 关中断
  • 保存断点
  • 中段服务寻址

中断隐指令是为中断服务程序做准备的流程

中断服务程序包含:

  • 保存现场与中断屏蔽字
  • 开中断
  • 执行中断服务程序
  • 关中断
  • 恢复现场与中断屏蔽字
  • 开中断
  • 中断返回

多重中断与中断屏蔽

硬件规定了中断响应优先级,中断程序能通过改变中断屏蔽字寄存器以改变中断的处理优先级。中断屏蔽字与中断源头的相对序关系相关

并发与多处理器

计算机体系分类

  • SISD
  • SIMD -- 一条指令并行处理多个处理单元的数据流,处理分支任务效率较低。 向量存储器是是SIMD的典型场景,在计算场景中较为常见。
  • MISD
  • MIMD -- 分为多计算机系统与多处理器系统,多计算机系统的每一个结点都具有独立的存储器和地址空间,无法交叉访存,只能通过消息共享实现通信,也称为消息传递型MIMD; 多处理器系统能够共享存储器,同时地址空间也统一,也称为共享存储型MIMD

硬件多线程

硬件多线程分为

  • 细粒度多线程 -- 单个时钟周期可以并发同一线程的多条指令
  • 粗粒度多线程 -- 连续执行同一线程的指令,直到流水线发生阻塞后切换线程
  • 同时多线程(SMT) -- 能并发不同线程的多条指令

Intel的超线程技术是SMT的代表,通过一个物理核心维护两套完整的线程状态硬件,执行硬件由两个逻辑核心共享,能实现单核性能逼近双核的并发能力。

多核处理器

每一个核心共享独立的CPU状态、执行单元,通过核间共享网络通信并共享存储器,通常具有L1(有时包括L2)寄存器,共享高层级寄存器