中央处理器 II
一、控制器的功能和工作原理
1. 控制器的结构和功能
从下图可以看到计算机硬件系统的五大功能部件及其连接关系。它们通过数据总线、地址总线和控制总线连接在一起,其中点画线框内的是控制器部件。
现对其主要连接关系简单说明如下:
-
运算器部件通过数据总线与内存储器、输入设备和输出设备传送数据。
-
输入设备和输出设备通过接口电路与总线相连接。
-
内存储器、输入设备和输出设备从地址总线接收地址信息,从控制总线得到控制信号,通过数据总线与其他部件传送数据。
-
控制器部件从数据总线接收指令信息,从运算器部件接收指令转移地址,送出指令地址到地址总线,还要向系统中的部件提供它们运行所需要的控制信号。
控制器是计算机系统的指挥中心,控制器的主要功能有:
-
从主存中取出一条指令,并指出下一条指令在主存中的位置。
-
对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。
-
指挥并控制 CPU、主存、输入和输出设备之间的数据流动方向。
根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器和微程序控制器,两类控制器中的 PC 和 IR 是相同的,但确定和表示指令执行步骤的办法以及给出控制各部件运行所需要的控制信号的方案是不同的。
2. 硬布线控制器
硬布线控制器的基本原理是:根据指令的要求、当前的时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号。它由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器。
1)硬布线控制单元图
指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从 CU 分离出来,便可得到简化的控制单元图,如下图所示。
CU 的输入信号来源如下:
-
经指令译码器译码产生的指令信息。现行指令的操作码决定了不同指令在执行周期所需完成的不同操作,因此指令的操作码字段是控制单元的输入信号,它与时钟配合产生不同的控制信号。
-
时序系统产生的机器周期信号和节拍信号。为了使控制单元按一定的先后顺序、一定的节奏发出各个控制信号,控制单元必须受时钟控制,即一个时钟脉冲使控制单元发送一个操作命令,或发送一组需要同时执行的操作命令。
-
来自执行单元的反馈信息即标志。控制单元有时需依赖 CPU 当前所处的状态产生控制信号,如 BAN 指令,控制单元要根据上条指令的结果是否为负来产生不同的控制信号。
上图中,节拍发生器产生各机器周期中的节拍信号,使不同的微操作命令 Ci(控制信号)按时间的先后发出。个别指令的操作不仅受操作码控制,还受状态标志控制,因此 CU 的输入来自操作码译码电路 ID、节拍发生器及状态标志,其输出到 CPU 内部或外部控制总线上。
注意: 控制单元还接收来自系统总线(控制总线)的控制信号,如中断请求、DMA 请求。
2)硬布线控制器的微操作
分析每个阶段的微操作序列:
① 取指周期的微操作命令:
② 间址周期的微操作命令:
③ 执行周期的微操作命令:
④ 中断周期的微操作命令:
3)CPU 的控制方式
控制单元控制一条指令执行的过程,实质上是依次执行一个确定的微操作序列的过程。由于不同指令所对应的微操作数及复杂程度不同,因此每条指令和每个微操作所需的执行时间也不同。主要有以下 3 种控制方式。
-
同步控制方式:所谓同步控制方式,是指系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号。通常以最长的微操作序列和最烦琐的微操作作为标准,采取完全统一的、具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令。
同步控制方式的优点是控制电路简单,缺点是运行速度慢。 -
异步控制方式:异步控制方式不存在基准时标信号,各部件按自身固有的速度工作,通过应答方式进行联络。
异步控制方式的优点是运行速度快,缺点是控制电路比较复杂。 -
联合控制方式:联合控制方式是介于同步、异步之间的一种折中。这种方式对各种不同的指令的微操作实行大部分采用同步控制、小部分采用异步控制的办法。
4)硬布线控制单元设计步骤
① 分析每个阶段的微操作序列
确定哪些指令在什么阶段(取值、间址、执行、中断四个阶段)、在什么条件下会使用到的微操作。
② 选择 CPU 的控制方式
采用定长机器周期还是不定长机器周期?每个机器周期安排几个节拍?
③ 安排微操作时序
如何用 3 个节拍完成整个机器周期内的所有微操作?
④ 电路设计
(确定每个微操作命令的逻辑表达式,并用电路实现)
-
列出操作时间表(列出在取指、间址、执行、中断周期,T0、T1、T2 节拍内有可能用到的所有微操作)
-
写出微操作命令的最简表达式
-
画出逻辑图
硬布线控制器的特点:
-
指令越多,设计和实现就越复杂,因此一般用于 RISC(精简指令集系统)。
-
如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令较困难。
-
由于使用纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序(时序信息包含机器周期、节拍),即时产生。
3. 微程序控制器
微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
1)微程序控制器的基本原理
【总结】:
① 微程序控制器的基本概念:
微程序设计思想就是:将每条机器指令编写成一个微程序,每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令。目前,大多数计算机都采用微程序设计技术。
概念之间的地位:程序 > 指令 = 微程序 > 微指令 > 微操作 = 微命令
微程序设计技术涉及的基本术语如下:
- 微命令与微操作。一条机器指令可以分解成一个微操作序列,这些微操作是计算机中最基本的、不可再分解的操作。在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为微命令,它是构成控制序列的最小单位。例如,打开或关闭某个控制门的电位信号、某个寄存器的打入脉冲等。微命令和微操作是一一对应的。微命令是微操作的控制信号,微操作是微命令的执行过程。
微命令有相容性和互斥性之分。相容性微命令是指那些可以同时产生、共同完成某一些微操作的微命令;而互斥性微命令是指在机器中不允许同时出现的微命令。相容和互斥都是相对的,一个微命令可以和一些微命令相容,和另一些微命令互斥。
注意:在组合逻辑控制器中也存在微命令与微操作这两个概念,它们并非只是微程序控制器的专有概念。
-
微指令与微周期。微指令是若干微命令的集合。存放微指令的控制存储器的单元地址称为微地址。一条微指令通常至少包含两大部分信息:
a) 操作控制字段,又称微操作码字段,用于产生某一步操作所需的各种操作控制信号。
b) 顺序控制字段,又称微地址码字段,用于控制产生下一条要执行的微指令地址。
微周期是指执行一条微指令所需的时间,通常为一个时钟周期。 -
主存储器与控制存储器。主存储器用于存放程序和数据,在 CPU 外部,用 RAM 实现;控制存储器(CM)用于存放微程序,在 CPU 内部,用 ROM 实现。
-
程序与微程序。程序是指令的有序集合,用于完成特定的功能;微程序是微指令的有序集合,一条指令的功能由一段微程序来实现。
微程序和程序是两个不同的概念。微程序是由微指令组成的,用于描述机器指令。微程序实际上是机器指令的实时解释器,是由计算机设计者事先编制好并存放在控制存储器中的,一般不提供给用户。对于程序员来说,计算机系统中微程序的结构和功能是透明的,无须知道。而程序最终由机器指令组成,是由软件设计人员事先编制好并存放在主存或辅存中的。
② 微程序控制器组成和工作过程:
下图所示为一个微程序控制器的基本结构,包括:
-
控制存储器。它是微程序控制器的核心部件,用于存放各指令对应的微程序,控制存储器可用只读存储器 ROM 构成。
-
微指令寄存器(CMDR 或 μIR)。用于存放从 CM 中取出的微指令,它的位数同微指令字长相等。
【类比】:指令寄存器(IR):用于存放从主存中读出的指令。 -
微地址形成部件。用于产生初始微地址和后继微地址,以保证微指令的连续执行。
-
微地址寄存器(CMAR)。接收微地址形成部件送来的微地址,为在 CM 中读取微指令作准备(用于存放控制存储器的读/写微指令的地址)。
【类比】:地址寄存器(MAR):用于存放主存的读/写地址。
微程序控制器的工作过程实际上就是在微程序控制器的控制下计算机执行机器指令的过程,这个过程可以描述如下:
-
执行取微指令公共操作。具体的执行是:在机器开始运行时,自动将取指微程序的入口地址送入 CMAR ,并从 CM 中读出相应的微指令送入 CMDR 。取指微程序的入口地址一般为 CM 的 0 号单元,当取指微程序执行完后,从主存中取出的机器指令就已存入指令寄存器中。
-
由机器指令的操作码字段通过微地址形成部件产生该机器指令所对应的微程序的入口地址,并送入 CMAR 。
-
从 CM 中逐条取出对应的微指令并执行。
-
执行完对应于一条机器指令的一个微程序后,又回到取指微程序的入口地址,继续第一步,以完成取下一条机器指令的公共操作。
以上是一条机器指令的执行过程,如此周而复始,直到整个程序执行完毕。
【注】:
- 取指周期的微程序通常是公用的,故如果某指令系统中有 n 条机器指令,则 CM 中微程序的个数至少是 n+1 个。
通常,一条机器指令对应一个微程序。由于任何机器指令的取指令操作都是相同的, 因此可将取指令操作的微命令统一编成一个微程序,这个微程序只负责将指令从主存单元中取出并送至指令寄存器。此外,也可编出对应间址周期的微程序和中断周期的微程序。这样,控制存储器中的微程序个数应为机器指令数再加上对应取指、间址和中断周期等公共的微程序数。
-
一些早期的 CPU、物联网设备的 CPU 可以不提供间接寻址和中断功能,因此这类 CPU 可以不包含间址周期、中断周期的微程序段。
-
物理上,取指周期、执行周期看起来像是两个微程序,但逻辑上应该把它们看作一个整体。因此,“一条指令对应一个微程序”的说法是正确的。
2)微指令的设计
【总结】:
① 微指令的格式:
微指令格式与微指令的编码方式有关,通常分水平型微指令和垂直型微指令两种。
水平型微指令和垂直型微指令的比较如下:
-
水平型微指令并行操作能力强、效率高、灵活性强:垂直型微指令则较差。
-
水平型微指令执行一条指令的时间短;垂直型微指令执行的时间长。
-
由水平型微指令解释指令的微程序,具有微指令字较长但微程序短的特点;垂直型微指令则与之相反,其微指令字较短而微程序长。
-
水平型微指令用户难以掌握,而垂直型微指令与指令比较相似,相对容易掌握。
② 微指令的编码方式:
③ 微指令的地址形成方式:
后继微地址的形成主要有以下两大基本类型:
-
直接由微指令的下地址字段指出。微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称断定方式。
-
根据机器指令的操作码形成。机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。
实际上,微指令序列地址的形成方式还有以下几种:
-
增量计数器法,即 (CMAR) + 1 → CMAR ,适用于后继微指令的地址连续的情况。
-
根据各种标志决定微指令分支转移的地址。
-
通过测试网络形成。
-
由硬件直接产生微程序入口地址。
电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向 CMAR 输入微指令的地址,这个地址即为取指周期微程序的入口地址。
3)微程序控制单元的设计步骤
4)动态微程序设计和毫微程序设计
-
动态微程序设计。在一台微程序控制的计算机中,假如能根据用户的要求改变微程序,则这台机器就具有动态微程序设计功能。
动态微程序的设计需要可写控制寄存器的支持,否则难以改变微程序的内容。实现动态微程序设计可采用可擦除可编程只读存储器(EPROM)。 -
毫微程序设计。在普通的微程序计算机中, 从主存取出的每条指令是由放在控制存储器中的微程序来解释执行的,通过控制线对硬件进行直接控制。
若硬件不由微程序直接控制,而是通过存放在第二级控制存储器中的毫微程序来解释的,这个第二级控制存储器就称为毫微存储器,直接控制硬件的是毫微微指令。
4. 硬布线和微程序控制器的特点
-
硬布线控制器的特点。硬布线控制器的优点是由于控制器的速度取决于电路延迟,所以速度快;缺点是由于将控制部件视为专门产生固定时序控制信号的逻辑电路,所以把用最少元件和取得最高速度作为设计目标,一旦设计完成,就不可能通过其他额外修改添加新功能。
-
微程序控制器的特点。微程序控制器的优点是同组合逻辑控制器相比,微程序控制器具有规整性、灵活性、可维护性等一系列优点;缺点是由于微程序控制器采用了存储程序原理,所以每条指令都要从控制存储器中取一次,影响速度。
为便于比较,下面以表格的形式对比二者的不同,见下表:
二、指令流水线
【总结】:
理想情况:各阶段花费时间相同;每个阶段结束后能立即进入下一阶段。
1. 指令流水线的基本概念
前面介绍的指令都是在单周期处理机中采用串行方法执行的,同一时刻 CPU 中只有一条指令在执行,因此各功能部件的使用率不高。现代计算机普遍采用指令流水线技术,同一时刻有多条指令在 CPU 的不同功能部件中并发执行,大大提高了功能部件的并行性和程序的执行效率。
可从两方面提高处理机的并行性:
-
时间上的并行技术,将一个任务分解为几个不同的子阶段,每个阶段在不同的功能部件上并行执行,以便在同一时刻能够同时执行多个任务,进而提升系统性能,这种方法被称为流水线技术。
-
空间上的并行技术,在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,这样的处理机被称为超标量处理机。
设取指、分析、执行 3 个阶段的时间都相等,用 t 表示 ,按以下几种执行方式分析 n 条指令的执行时间:
从上图看出,理想情况下,每个时钟周期都有一条指令进入流水线,每个时钟周期都有一条指令完成,每条指令的时钟周期数(即 CPI)都为 1 。
为了利于实现指令流水线,指令集应具有如下特征:
-
指令长度应尽量一致,有利于简化取指令和指令译码操作。否则,取指令所花时间长短不一,使取指部件极其复杂,且也不利于指令译码。
-
指令格式应尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取寄存器操作数,否则须译码后才能确定指令中各寄存器编号的位置。
-
采用 Load/Store 指令,其他指令都不能访问存储器,这样可把 Load/Store 指令的地址计算和运算指令的执行步骤规整在同一个周期中,有利于减少操作步骤。
-
数据和指令在存储器中“对齐”存放。这样,有利于减少访存次数,使所需数据在一个流水段内就能从存储器中得到。
2. 流水线的基本实现
1)指令流水线设计的原则
流水线设计的原则是:指令流水段个数以最复杂指令所用的功能段个数为准;流水段的长度以最复杂的操作所花的时间为准。
假设某条指令的 5 个阶段所花的时间分别如下。① 取指:200ps;② 译码:100ps;③ 执行:150ps;④ 访存:200ps;⑤ 写回:100ps ,该指令的总执行时间为 750ps 。
按照流水线设计原则,每个流水段的长度为 200 ps ,所以每条指令的执行时间为 1ns ,反而比串行执行时增加了 250ps 。假设某程序中有 N 条指令,单周期处理机所用的时间为 N×750ps ,而流水线处理机所用的时间为 (N+4)×200ps 。
由此可见,流水线方式并不能缩短单条指令的执行时间,但对于整个程序来说,执行效率得到了大幅增高。
2)流水线的逻辑结构
每个流水段后面都要增加一个流水段寄存器,用于锁存本段处理完的所有数据,以保证本段的执行结果能在下个时钟周期给下一流水段使用,如下图所示。
各种寄存器和数据存储器均采用统一时钟 CLK 进行同步,每来一个时钟,各段处理完的数据都将锁存到段尾的流水段寄存器中,作为后段的输入。同时,当前段也会收到前段通过流水段寄存器传递过来的数据。
一条指令会依次进入 IF、ID、EX、MEM、WB 五个功能段进行处理,第一条指令进入 WB 段后,各流水段都包含一条不同的指令,流水线中将同时存在 5 条不同的指令并行执行。
3)流水线的表示方法
通常用时空图来直观地描述流水线的执行情况。
只有大量连续任务不断输入流水线,才能充分发挥流水线的性能,而指令的执行正好是连续不断的,非常适合采用流水线技术。
3. 流水线的性能指标
1)吞吐率
2)加速比
3)效率
4. 流水线的冒险与处理
【总结】:
在指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿,这种现象称为流水线冒险。
根据导致冒险的原因不同主要有 3 种:结构冒险(资源冲突)、数据冒险(数据冲突)和控制冒险(控制冲突)。
1)结构相关(资源冲突)
由于多条指令在同一时刻争用同一资源而形成的冲突,也称为资源冲突,即由硬件资源竞争造成的冲突,有以下两种解决办法:
-
前一指令访存时,使后一条相关指令(以及其后续指令)暂停一个时钟周期。
-
单独设置数据存储器和指令存储器,使取数和取指令操作各自在不同的存储器中进行。事实上,现代计算机都引入了 Cache 机制,而 L1 Cache 通常采用数据 Cache 和指令 Cache 分离的方式,因而也就避免了资源冲突的发生。
2)数据相关(数据冲突)
在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突。当多条指令重叠处理时就会发生冲突,数据冒险可分为三类:
-
写后读(Read After Write, RAW)相关:表示当前指令将数据写入寄存器后,下一条指令才能从该寄存器读取数据。否则,先读后写,读到的就是错误(旧)数据。
-
读后写(Write After Read, WAR)相关:表示当前指令读出数据后,下一条指令才能写该寄存器。否则,先写后读,读到的就是错误(新)数据。
-
写后写(WriteAfterWrite, WAW)相关:表示当前指令写入寄存器后,下一条指令才能写该寄存器。否则,下一条指令在当前指令之前写,将使寄存器的值不是最新值。
解决的办法有以下几种:
-
把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为硬件阻塞(stall)和软件插入 “NOP” 指令两种方法。
-
设置相关专用通路,即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的 ALU 的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为数据旁路技术。
-
通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关。
3)控制相关(控制冲突)
指令通常是顺序执行的,但是在遇到改变指令执行顺序的情况,例如执行转移、调用或返回等指令时,会改变 PC 值,会造成断流,从而引起控制冒险。解决的办法有以下几种:
-
对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和动态预测。静态预测总是预测条件不满足,即继续执行分支指令的后续指令。动态预测根据程序执行的历史情况,进行动态预测调整,有较高的预测准确率。
-
预取转移成功和不成功两个控制流方向上的目标指令。
-
加快和提前形成条件码。
-
提高转移方向的猜准率。
5. 流水线的分类
6. 高级流水线技术
有两种增加指令级并行的策略:一种是多发射技术,它通过采用多个内部功能部件,使流水线功能段能同时处理多条指令,处理机一次可以发射多条指令进入流水线执行;另一种是超流水线技术,它通过增加流水线级数来使更多的指令同时在流水线中重叠执行。
1)超标量流水线技术
超标量流水线技术也称动态多发射技术,每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件,如下图所示。在简单的超标量 CPU 中,指令是按顺序发射执行的。为了更好地提高并行性能,多数超标量 CPU 都结合动态流水线调度技术,通过动态分支预测等手段,指令不按顺序执行,这种执行方式称为乱序执行。
2)超长指令字技术
超长指令字技术也称静态多发射技术,由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件。
3)超流水线技术
如下图所示,流水线功能段划分得越多,时钟周期就越短, 指令吞吐率也就越高, 因此超流水线技术是通过提高流水线主频的方式来提升流水线性能的。但是,流水线级数越多,用于流水寄存器的开销就越大,因而流水线级数是有限制的, 并不是越多越好。
超流水线 CPU 在流水线充满后,每个时钟周期还是执行一条指令, CPI = 1 ,但其主频更高;多发射流水线 CPU 每个时钟周期可以处理多条指令,CPI < 1 , 相对而言,多发射流水线成本更高,控制更复杂。
三、多处理器的基本概念
1. SISD、SIMD、MIMD 的基本概念
基于指令流的数量和数据流的数量,将计算机体系结构分为 SISD 、SIMD 、MISD 和 MIMD 四类。常规的单处理器属于 SISD ,而常规的多处理器属于 MIMD 。
1)单指令流单数据流(SISD)结构
SISD 是传统的串行计算机结构,这种计算机通常仅包含一个处理器和一个存储器,处理器在一段时间内仅执行一条指令,按指令流规定的顺序串行执行指令流中的若干条指令。
为了提高速度,有些 SISD 计算机采用流水线的方式,因此,SISD 处理器有时会设置多个功能部件,并且采用多模块交叉方式组织存储器。
2)单指令流多数据流(SIMD)结构
SIMD 是指一个指令流同时对多个数据流进行处理, 一般称为数据级并行技术。这种结构的计算机通常由一个指令控制部件、多个处理单元组成。每个处理单元虽然执行的都是同一条指令,但是每个单元都有自己的地址寄存器,这样每个单元就都有不同的数据地址,因此,不同处理单元执行的同一条指令所处理的数据是不同的。一个顺序应用程序被编译后,可能按 SISD 组织并运行于串行硬件上,也可能按 SIMD 组织并运行于并行硬件上。
SIMD 在使用 for 循环处理数组时最有效,比如,一条分别对 16 对数据进行运算的 SIMD 指令如果在 16 个 ALU 中同时运算,则只需要一次运算时间就能完成运算。SIMD 在使用 case 或 switch语句时效率最低,此时每个执行单元必须根据不同的数据执行不同的操作。
3)多指令流单数据流(MISD)结构
MISD 是指同时执行多条指令,处理同一个数据,实际上不存在这样的计算机。
4)多指令流多数据流(MIMD)结构
MIMD 是指同时执行多条指令分别处理多个不同的数据, MIMD 分为多计算机系统和多处理器系统。多计算机系统中的每个计算机节点都具有各自的私有存储器,并且具有独立的主存地址空间,不能通过存取指令来访问不同节点的私有存储器,而要通过消息传递进行数据传送,也称消息传递 MIMD 。
多处理器系统是共享存储多处理器(SMP)系统的简称,它具有共享的单一地址空间,通过存取指令来访问系统中的所有存储器,也称共享存储 MIMD 。
向量处理器是 SIMD 的变体,是一种实现了直接操作一维数组(向量)指令集的 CPU ,而串行处理器只能处理单一数据集。其基本理念是将从存储器中收集的一组数据按顺序放到一组向量寄存器中,然后以流水化的方式对它们依次操作,最后将结果写回寄存器。向量处理器在特定工作环境中极大地提升了性能,尤其是在数值模拟或者相似的领域中。
SIMD 和 MIMD 是两种并行计算模式,其中 SIMD 是一种数据级并行模式,而 MIMD 是一种并行程度更高的线程级并行或线程级以上并行计算模式。
2. 硬件多线程的基本概念
在传统 CPU 中,线程的切换包含一系列开销,频繁地切换会极大影响系统的性能,为了减少线程切换过程中的开销,便诞生了硬件多线程。在支持硬件多线程的 CPU 中,必须为每个线程提供单独的通用寄存器组、单独的程序计数器等,线程的切换只需激活选中的寄存器,从而省略了与存储器数据交换的环节,大大减少了线程切换的开销。
硬件多线程有 3 种实现方式:细粒度多线程、粗粒度多线程和同时多线程(SMT)。
1)细粒度多线程
多个线程之间轮流交叉执行指令,多个线程之间的指令是不相关的,可以乱序并行执行。在这种方式下,处理器能在每个时钟周期切换线程。例如,在时钟周期 i ,将线程 A 中的多条指令发射执行;在时钟周期 i + 1 ,将线程 B 中的多条指令发射执行。
2)粗粒度多线程
仅在一个线程出现了较大开销的阻塞时,才切换线程,如 Cache 缺失。在这种方式下,当发生流水线阻塞时,必须清除被阻塞的流水线,新线程的指令开始执行前需要重载流水线,因此,线程切换的开销比细粒度多线程更大。
3)同时多线程(SMT)
同时多线程(SMT)是上述两种多线程技术的变体。它在实现指令级并行的同时,实现线程级并行,也就是说,它在同一个时钟周期中,发射多个不同线程中的多条指令执行。
Intel 处理器中的超线程(Hyper-threading)就是同时多线程 SMT ,即在一个单处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件。
细粒度多线程 | 粗粒度多线程 | 同时多线程(SMT) | |
---|---|---|---|
指令发射 | 轮流发射各线程的指令(每个时钟周期发射一个线程) | 连续几个时钟周期,都发射同一个线程的指令序列,流水线阻塞时,切换另一个线程 | 一个时钟周期内,同时发射多个线程的指令 |
线程切换频率 | 每个时钟周期切换一次线程 | 只有流水阻塞时才切换一次线程 | NULL |
线程切换代价 | 低 | 高,需要重载流水线 | NULL |
并行性 | 指令级并行,线程间不并行 | 指令级并行,线程间不并行 | 指令级并行,线程间并行 |
3. 多核处理器的基本概念
多核处理器是指将多个处理单元集成到单个 CPU 中,每个处理单元称为一个核(core)。每个核可以有自己的 Cache ,也可以共享同一个 Cache 。所有核一般都是对称的, 并且共享主存储器,因此多核属于共享存储的对称多处理器。下图是一个不共享 Cache 的双核 CPU 结构。
在多核计算机系统中,如要充分发挥硬件的性能,必须采用多线程(或多进程)执行, 使得每个核在同一时刻都有线程在执行。与单核上的多线程不同,多核上的多个线程是在物理上并行执行的,是真正意义上的并行执行,在同一时刻有多个线程在并行执行。而单核上的多线程是一种多线程交错执行,实际上在同一时刻只有一个线程在执行。
4. 共享内存多处理器的基本概念
具有共享的单一物理地址空间的多处理器被称为共享内存多处理器(SMP)。处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问任何存储器的位置。注意,即使这些系统共享同一个物理地址空间,它们仍然可在自己的虚拟地址空间中单独地运行程序。
单一地址空间的多处理器有两种类型:
第一类,每个处理器对所有存储单元的访问时间是大致相同的,即访问时间与哪个处理器提出访存请求及访问哪个字无关,这类机器被称为统一存储访问(UMA)多处理器。
第二类,某些访存请求要比其他的快,具体取决于哪个处理器提出了访问请求以及访问哪个字,这是由于主存被分割并分配给了同一机器上的不同处理器或内存控制器,这类机器被称为非统一存储访问(NUMA)多处理器。
-
统一存储访问(UMA)多处理器:根据处理器与共享存储器之间的连接方式,分为基于总线、基于交叉开关网络和基于多级交换网络连接等几种处理器。
-
非统一存储访问(NUMA)多处理器:处理器中不带高速缓存时,被称为 NC-NUMA ;处理器中带有一致性高速缓存时,被称为 CC-NUMA 。
早期的计算机,内存控制器没有整合进 CPU ,访存操作需要经过北桥芯片(集成了内存控制器,并与内存相连),CPU 通过前端总线和北桥芯片相连,这就是统一存储访问(UMA)构架。随着 CPU 性能提升由提高主频转到增加 CPU 数量(多核、多 CPU),越来越多的 CPU 对前端总线的争用使得前端总线成为瓶颈。为了消除 UMA 架构的瓶颈,非统一存储访问(NUMA)构架诞生,内存控制器被集成到 CPU 内部,每个 CPU 都有独立的内存控制器。每个 CPU 都独立连接到一部分内存, CPU 直连的这部分内存被称为本地内存。CPU 之间通过 QPI 总线相连。CPU 可以通过 QPI 总线访问其他 CPU 的远程内存。与 UMA 架构不同的是,在 NUMA 架构下,内存的访问出现了本地和远程的区别,访问本地内存明显要快于访问远程内存。
由于可能会出现多个处理器同时访问同一共享变量的情况,在操作共享变量时需要进行同步,否则,一个处理器可能会在其他处理器尚未完成对共享变量的修改时,就开始使用该变量。常用方法是通过对共享变量加锁的方式来控制对共享变量互斥访问。在一个时刻只能有一个处理器获得锁,其他要操作该共享变量的处理器必须等待,直到该处理器解锁该变量为止。
四、小结
1、什么是微指令?它和指令有什么关系?
控制部件通过控制线向执行部件发出各种控制命令,通常把这种控制命令称为微命令,而一组实现一定操作功能的微命令的组合,构成一条微指令。许多条微指令组成的序列构成微程序,微程序完成对指令的解释执行。
指令,即指机器指令。每条指令可以完成一个独立的算术运算或逻辑运算操作。在采用微程序控制器的CPU 中,一条指令对应一个微程序,一个微程序由许多微指令构成,一条微指令会发出很多不同的微命令。
2、什么是指令流水线?指令流水线相对于传统体系结构的优势是什么?
指令流水线是把指令分解为若干子过程,通过将每个子过程与其他子过程并行执行,来提高计算机的吞吐率的技术。采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此成为计算机中普遍使用的一种并行处理技术,通过在同一个时间段使用各功能部件,使得利用率明显提高。
3、流水线越多,并行度就越高。是否流水段越多,指令执行越快?
错误,原因如下:
-
流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大。
-
流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增加而大增,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。
4、有关指令相关、数据相关的几个概念
-
两条连续的指令读取相同的寄存器时,会产生读后读(Read After Read, RAR)相关,这种相关不会影响流水线。
-
某条指令要读取上一条指令所写入的寄存器时,会产生写后读(Read After Write, RAW)相关,它称数据相关或真相关,影响流水线。按序流动的流水线只可能出现 RAW 相关。
-
某条指令的上条指令要读/写该指令的输出寄存器时,会产生读后写(Write After Read,WAR)和写后写(Write After Write, WAW)相关。在非按序流动的流水线中,既可能发生 RAW 相关,又可能发生 WAR 相关和 WAW 相关。
对流水线影响最严重的指令相关是数据相关。
异常和中断机制部分见操作系统。