中央处理器

发布时间 2023-03-23 12:23:58作者: 他太冷静了

image.pngimage.pngimage.png

CPU的功能与基本结构

image.pngimage.png

运算器的基本结构

image.png

右下方蓝字是CPU单总线结构的优缺点,暂时忽略。

控制器的基本结构

控制器主要有硬布线控制器和微程序控制器两类。

image.png

PC有时也通过ACC来自增
MDRinE 指从系统总线输入的端;
MDRin 指从CPU内部总线输入的端;


灰色的是用户不可见的寄存器。

image.pngimage.png

数据通路的基本机构暂时忽略。

指令周期

节拍 = T周期 = 时钟周期 ,是CPU操作的最基本单位。
指令周期 由若干个 工作周期 组成,例如 取值周期、执行周期等。

机器周期 是固定的,等于从内存中读取一个指令字的最短时间。可作为指令执行过程中的一个基准时间。
一个 **机器周期 **内可能完成多个微操作。

image.pngimage.pngimage.pngimage.png

最后,CU控制器将中断服务程序的入口地址(由中断向量生成)送入PC。
记作:CU(中断服务程序的入口地址)->PC。

指令执行方案

image.png


image.png

数据通路的功能和基本结构

数据在功能部件之间传送的路径称为数据通路
数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器。

数据通路是由控制部件控制的,控制部件根据每条指令功能的不同,生成对数据通路的控制信号。
目的是为了实现CPU内部的运算器和寄存器以及寄存器之间的数据交换。

总线结构

CPU内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上。
优点:结构简单。
缺点:数据传输存在较多的冲突现象,性能低。

当CPU内部有两条或更多的总线时,构成双总线结构或多总线结构。

image.pngimage.pngimage.png

专用数据通路

以运算器内部为例。
image.pngimage.png
image.png

控制器的结构和功能

根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器微程序控制器
两类控制器的PC和IR都是相同的,但确定和表示指令执行步骤的方法以及给出控制各部件所需要的控制信号的方案是不同的。

硬布线控制器设计

image.png
image.png

根据指令的要求、当前的时序以及外部和内部的状态,按时间的顺序发送一些列微操作信号。
它由复杂的组合逻辑门电路和一些触发器构成,所以又称组合逻辑控制器

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

CPU的控制方式

控制单元控制一条指令执行的过程,实质上是依次执行一个确定的微操作序列的过程。
由于不同指令所对应的微操作数以及复杂程度的不同,因此每条指令以及每个微操作所需的执行时间也不同。

  • 同步控制方式

系统有统一的时钟,所有的控制信号均按照这个统一的时钟信号。通常以最长的微操作序列和最繁琐的微操作为标准。采取完全统一的、具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令。
所以控制电路简单,但是运行速度慢。

  • 异步控制方式

不存在基准时标信号,各部件按自身固有的速度工作,通过应答的方式进行联络。

  • 联合控制方式

同步、异步方式的折中。大部分指令的微操作采用同步控制,小部分采用异步控制。

微程序控制器设计

image.png

tips:

  • 微命令是微操作的控制信号,微操作是微命令的执行过程。(微命令就相当于代码)
  • 硬布线控制器设计也有微命令和微操作这两个概念,并不是微程序控制器专有。
  • 微周期通常指从控制存储器中读取一条微指令并执行相应的微操作所需的时间。
  • 微程序实际上是机器指令的实时解释器。

image.pngimage.pngimage.pngimage.png

微指令的设计

image.pngimage.pngimage.pngimage.pngimage.png
image.pngimage.pngimage.pngimage.png

微程序控制单元的设计

image.png image.pngimage.pngimage.pngimage.png

动态微程序设计和毫微程序设计

  • 动态微程序设计

在一台微程序控制的计算机中,假如能根据用户的要求来改变微程序,则这台机器就具有动态微程序设计功能。
动态微程序的设计需要可写控制寄存器的支持,否则难以改变微程序的内容。
实现动态微程序设计可采用可擦除可编程只读存储器(EPROM)。

  • 毫微程序设计

在普通的微程序计算机中,从主存取出的每条指令是由放在控制存储器中的微程序来解释执行的,通过控制线对硬件进行直接控制。
若硬件不由微程序直接控制,而是通过存放在第二级控制存储器中的毫微程序来解释的,这个第二级控制存储器就称为毫微存储器,直接控制硬件的是毫微微指令。

硬布线和微程序控制器的特点

  • 硬布线控制器(常用于RISC CPU)
    • 优:由于控制器的速度取决于电路延迟,所以速度快;
    • 缺:一旦设计完成,不能通过其他额外修改添加新功能;
  • 微程序控制器(常用于CISC CPU)
    • 优:与硬布线相比,更具有规整性、灵活性、可维护性等;
    • 缺:每条指令都要从控制存储器里取一次,影响速度;

指令流水线

同一时刻,有多条指令在CPU的不同功能部件中并行执行;(所以单处理机也能并行。。)
可以从两方面提高处理机的并行性

  1. 时间上的并行技术(流水线技术)

将一条指令的执行过程分解为几个不同的阶段,每个阶段在处理机的不同的功能部件上并行执行。
同一时刻,能够并行执行多个任务。

  1. 空间上的并行技术(超标量处理机)

在一个处理内设置多个执行相同任务的功能部件(即设置多条流水线),并让这些流水线并行工作。
image.pngimage.pngimage.png

流水线的性能指标

image.png
一个阶段取一个时钟周期是最理想的情况,一般来说一个阶段包括多个时钟周期。
理想情况下,每个时钟周期都有一条指令进入流水线。每个时钟周期都有一条指令完成。每条指令的时钟周期数(即CPI)都为1。

总耗时T = (k + n -1)t
CPI = (k + n -1) t / n ,取极限后为1。

image.pngimage.png

所以,只有大量的连续任务不断输入流水线,才能充分发挥流水线的性能。例如,指令的执行就是连续不断的;
还有一些其他类型的流水线,如浮点运算流水线,仅适合于提升浮点运算密集型应用的性能。

流水线并不会提高单个指令执行过程的速度。(反而会变慢)

流水线的基本实现

一个5段流水线的数据通路如下。

  • IF(Instruction Fetch)段:包含PC、IR以及下一条地址的计算逻辑;
  • ID(instruction Decode)段:包含操作控制器、取操作数逻辑、立即数符号扩展模块;
  • EX(Execute)段:包含ALU、分支地址计算模块;
  • MEM(Memory)段:包含数据存储器读写模块;
  • WB(Write Back)段:包含寄存器写入控制模块;

每个流水段后面都需要增加一个流水寄存器,用于锁定本段处理完成的数据与控制信号,以保证本段的执行结果能在下个时钟周期给下一流水段使用。
各种寄存器和数据存储器均采用统一时钟CLK进行同步,每来一个时钟,就会有一条新的指令进入流水线IF段;同时流水寄存器会锁存前段加工处理完成的数据和控制信号,为下一段的功能部件提供数据输入。
IMG_20221001_162945.jpg

不同流水寄存器锁存的数据不同,上图中的数据传递(由实线表示)。
IF/ID流水寄存器需要锁存从指令存储器取出的指令字,以及PC+4的值。
ID/EX流水寄存器需要锁存从寄存器堆中取出的两个操作数RS和KT(指令中两个操作数字段对应的寄存器值)、写寄存器编号WriteReg#以及立即数符号扩展的值。
EX/MEM流水寄存器需要锁存ALU运算结果、数据存储器待写入数据WriteData、写寄存器编号WriteReg#等数据。
MEM/WB流水寄存器需要锁存ALU运算结果、数据存储器读出数据、写寄存器编号WriteReg#等数据。

流水线的控制信号

每个流水段除了需要上一个流水段之间的流水寄存器中的数据外,还需要正在执行指令的流水段控制信号。
上图中,控制信号由虚线表示。
控制信号大多由控制器产生,由ID段负责译码生产控制信号,随后在各个流水段中使用。
也有一些控制信号是来自于其他流水段
控制器(在ID段)的输入主要是IF/ID流水寄存器锁存的指令字中的OP字段。

图中输出了7个控制信号:

  • RegDst在ID段内使用。
  • RegWrite需要传递到WB段后,才能反馈到ID段的寄存器堆中的写入控制位WE。
  • MemWrite需要传递到MEM段使用。
  • MemToReg需要传递到WB段,并参与决定是否将数据写回ID段的寄存器堆中的WD位中。
  • AluOp需要传递到EX段,控制ALU进行不同的运算。
  • AluSrc需要传递到EX段,控制ALU的第二输入是寄存器rt还是扩展后的立即数。
  • Branch需要传递到EX段,与ALU运算的标志equal信号进行逻辑与操作后,反馈到IF段控制多路选择器进行分支处理。

所以,每个流水寄存器保存的信息包括:

  1. 后面流水段需要用到的所有数据信息,包括PC+4、指令、立即数、目的寄存器、ALU运算结果、标志信息等。
  2. 由前面流水段传递来的,并且后面流水段需要的控制信号。

流水线的执行过程

所有的指令都需要完整地经过流水线的各功能段。(即使有些指令在某些流水段中,并没有什么操作,只是等待一个时钟周期)
流水线的设计原则是,指令流水线的个数以最复杂指令所用的流水段个数为准;流水段长度以最复杂的操作所花的时间为准。
所以,流水线并无法缩短单条指令的执行时间(反而会增长),而是提高整个程序的执行效率。

为了利于实现指令流水线,指令集应具有以下特征:

  • 指令长度应尽量一致,有利于简化取指令和指令译码操作。
  • 指令格式应尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取寄存器操作数。否则须译码后才能确定指令中各寄存器编号的位置。
  • 采用Load/Store指令,其他指令都不能访问存储器。这样可把Load/Store指令的地址计算和运算指令的执行步骤规整在同一个周期中。
  • 指令和数据在存储器中“对齐”存放。这样有利于减少访存次数,使所需数据在一个流水段内就能从存储器中取到。

取值(IF)

  1. 将PC值作为地址从IR中取出第一条指令字到指令存储器;并计算PC+4,送入PC;
  2. 指令存储器将指令字通过RD输出端送入IF/ID流水线寄存器;PC+4也要送入IF/ID流水线寄存器(以便相对转移指令)。

每次时钟到来时,将PC+4和指令字锁存到IF/ID流水线寄存器中;本条指令进入ID段,IF段开始取下一条指令。

译码/读寄存器(ID)

例:lw访存指令

  1. 由控制器根据IF/ID流水寄存器中的指令字生成后续各段需要的控制信号。
  2. 根据指令字中的rs、rt取出寄存器堆中的值RS和RT;
  3. 符号扩展单元会将指令字中16位的立即数扩展为32位;
  4. 多路选择器根据指令字生成指令可能会写的寄存器编号WriteReg#。

每次时钟到来时,这些数据和控制信号,连同PC+4一起锁存在ID/EX流水寄存器中。

执行/计算地址(EX)

例:lw访存指令(lw指令的EX段主要用来计算访存地址)

  1. 将RS值与立即数相加得到访存地址送入EX/MEM流水寄存器;
  2. 将RT值作为写入数据WriteData送入EX/MEM流水寄存器;
  3. 将写寄存器编号WriteReg#送入EX/MEM流水寄存器。

每次始终到来时,将这些数据和控制信号送入EX/MEM流水寄存器中。

EX段可能还要计算分支地址,生成分支跳转信号BranchToken反馈给IF段。并通过前面传来的PC+4以及在ID段符号扩展后的立即数相加得到跳转地址BranchAddr返回给IF段。

访存(MEM)

例:lw访存指令
根据EX/MEM流水寄存器中的访存地址、写入数据WriteData以及内存控制读写信号MemWrite(从ID段一直传过来的)对存储器进行读或写操作。
EX/MEM流水寄存器中的访存地址、写寄存器编号WriteReg#以及读出的数据都会送入MEM/WB流水寄存器。

写回(WB)

例:lw访存指令
将MEM/WB流水寄存器中的读出数据写回指定寄存器WriteReg#。
时钟到来时会完成数据写入寄存器WriteReg#。指令离开流水线。

流水线冒险

在流水线运行过程中,可能会出现一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿。
原因主要有以下三种:

结构冒险

image.png

Instr3 暂停一个时钟周期。

image.png

单独设置了数据存储器和指令存储器,使得取数取指令操作分别在不同的存储器进行。
Load的DM段在数据存储器取数。
Instr3的IF段在指令存储器取指令。
两者访问的是不同的cache,一个是data cache,一个是instruction cache。所以不会有结构冒险。

事实上,现代计算机中的L1 cache通常都是采用数据cache和指令cache分离的方式,避免流水线结构冒险。

数据冒险

在一个程序中,下一条指令会用到当前指令计算处的结果(数据依赖),此时两条指令上流水线运行就可能出现数据冒险。
数据冒险可分三类:

  • 写后读(Read After Write,RAW)相关:表示当前指令将数据写入寄存器后,下一条指令才能从该寄存器读取数据。
  • 读后写(WAR)相关:表示当前指令读出数据后,下一条指令才能写该寄存器。
  • 写后写(WAW)相关:表示当前指令写入寄存器后,下一条指令才能写该寄存器。

解决的方法有以下三种:
image.pngimage.pngimage.png

数据旁路技术:设置相关专用通路。不等前一条指令把计算结果写回寄存器组,而直接把前一条指令的计算结果作为自己的输入数据开始计算过程,使得本来需要暂停的操作可以继续执行。

控制冒险

指令通常是顺序执行的,但是有时会遇到改变指令执行顺序的情况(执行转移、调用、返回等),会改变PC值,造成流水线断流。

cache的缺失的处理过程也会引起流水线阻塞。

image.pngimage.png

流水线的分类

image.pngimage.png

高级流水线技术

超标量技术

超标量技术也叫动态多发射技术。每个时钟周期并行的发射多条指令。

image.png

超流水技术

通过提高流水线主频的方式来提升流水线性能。
image.png

与超标量技术一样,不能调整指令的执行顺序,靠编译来优化。

但是,流水线级数越多,用于流水线寄存器的开销就越大,所以流水线级数是有限制的。
超流水线CPU在充满后,每个时钟周期还是执行一条指令,但是因为其主频更高,每个时钟周期可以处理多条指令,CPI<1。 不过成本也会更高,控制更复杂。

超长指令字

超长指令字技术又叫静态多发射技术。

image.pngimage.png

例:五段式指令流水线

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

多处理器概念

基于指令流和数据流的数量,将计算机体系结构分为SISD、SIMD、MISD和MIMD四类。

SISD 单指令流单数据流

传统的串行计算机结构,通常只包含一个处理器和一个存储器。
处理器按指令流规定的顺序串行地执行。
为了提高速度,有些SISD计算机采用流水线的方式(即前面介绍的内容)。
所以SISD处理器会设置多个功能部件,并采用多模块交叉方式(低位)组织存储器,以方便流水线执行。

SIMD 单指令流多数据流

一般称为数据级并行技术,通常包含一个指令控制部件、多个处理单元。
每个处理单元虽然执行的都是同一条指令,但都有自己的地址寄存器,这样每个处理单元就有不同的数据地址,因此,不同处理单元执行的同一条指令所处理的数据是不同的

SIMD在处理数组、表等数据结构时十分有效,可以同时对不同的区域执行相同的操作。
而在使用条件分支等语句时效率不佳,因为需要根据不同的数据做不同的操作。

向量处理器是SIMD的变体,实现了直接操作一维数组(向量)指令集的CPU。而串行处理器只能处理单一数据集。
其设计是将存储器中的一组数据顺序放到一组向量寄存器中,然后以流水线方式对他们依次操作,最后将结果写回寄存器。
对特定的任务,如数值模拟有无可比拟的性能优势。

MISD 多指令流单数据流

同时执行多条指令来处理同一个数据,哈哈哈哈哈哈哈哈。
不存在这样的计算机。

MIMD 多指令流多数据流

分为多处理器系统多计算机系统
多处理器系统是共享存储多处理器(SMP)系统的简称。具有单一地址空间,通过存取(Load/Store)指令来访问系统中的所有存储器。也叫共享存储MIMD。
多计算机系统中的每个计算机节点都具有私有存储器,并且拥有独立的主存地址空间。不能通过存取指令来访问不同节点的存储器,而是要通过消息传递来进行通信。也叫消息传递MIMD。

SIMD与MIMD都是并行计算模式。
SIMD 数据级并行
MIMD 线程级并行或线程级以上并行

共享内存多处理器概念 SMP (MIMD)

具有共享的单一物理地址空间的多处理器称为共享内存多处理器(SMP)。
处理器通过存储器中的共享变量互相通信,所有处理器都能通过Load/Store访问任何存储器的位置。

注意,即使它们共享同一个物理地址空间,但是仍然可以在自己的虚拟地址空间中单独运行程序。

根据各处理器对存储器的访问情况分为以下两类:

  • 统一存储访问(UMA)多处理器:每个处理器对所有的存储单元的访问时间都是大致相同的,访问时间与哪个处理器提出访存请求以及访问哪个字无关。(Intel的内存模型?)

根据处理器与共享存储器之间的连接方式,又分为基于总线、基于交叉开关网络、基于多级交换网络连接等几种处理器。

  • 非统一存储访问(NUMA)多处理器:某些访存请求更快,具体取决于哪个处理器访问以及访问哪个字。这是由于主存被分割给了同一机器上的不同处理器或内存控制器。(AMD的内存模型?)

处理器中不带高速缓存时,被称为NC-NUMA;处理器中带有一致性高速缓存时,被称为CC-NUMA;

早期的计算机,内存控制器没有整合进CPU,访存操作需要经过北桥芯片(集成了内存控制器,并与内存相连)。CPU通过前端总线与北桥芯片相连,这就是UMA构架。
后来随着CPU性能提升由提高主频转到增加CPU数量(多核、多CPU),越来越多的CPU争用前端总线成了性能上的瓶颈。所以,内存控制器被集成到了CPU内部,每个CPU都有独立的内存控制器。这就是NUMA构架。
NUMA构架中,每个CPU独立连接到一部分内存(本地内存),CPU之间通过QPI总线相连,并通过QPI总线访问其他CPU的内存(远程内存)。

硬件多线程概念

为了减少线程切换时,保存现场恢复现场等开销,为每个线程提供单独的通用寄存器组、单独的程序计数器等。
线程的切换只需要激活选中的寄存器即可。
有以下三种实现方式

细粒度多线程

指令级的并行。

多个线程之间轮流交叉执行指令,多个线程之间的指令是不相关的,可以乱序地并行执行。
处理器能在每个时钟周期切换线程。例如,在时钟周期 i,将线程A中的多条指令乱序发射执行;在时钟周期 i + 1,将线程B中的多条指令乱序发射执行。

粗粒度多线程

线程级的并行。

在一个线程出现了较大开销的阻塞时,才切换线程。如cache缺失。
线程阻塞时,需要清理当前线程的流水线。新线程的指令开始之前,需要重载流水线。
因此,线程切换比细粒度多线程要大。

同时多线程 SMT

在实现线程级并行的同时,实现指令级并行。
在同一个时钟周期内,发射多个不同线程中的多条指令执行。

Intel处理器中的超线程(Hyper-threading)就是同时多线程SMT。在一个单处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件。