组成
中央处理器(CPU)由运算器和控制器组成。
控制器的功能是负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令和执行指令;
运算器的功能是对数据进行加工
功能
运算器
控制器
基本架构图
用户可见寄存器:通用寄存器组、程序状态字寄存器、程序计数器;可对这类寄存器编程
用户不可见的寄存器:存储器地址寄存器、存储器数据寄存器、指令寄存器、暂存寄存器;不可对这类寄存器编程
概念
指令周期:CPU从主存中取出并执行一条指令的时间称为指令周期,不同指令的指令周期可能不同。
机器周期:也称节拍或T周期,指令周期常用若干机器周期来表示,它是CPU操作的最基本单位。
时钟周期:一个机器周期包含若干时钟周期。
图(a)为定长的机器周期,每个机器周期包含4个节拍(T);图(b)所示为不定长的机器周期,每个机器周期包含的节拍数可以为4个,也可以为3个。
每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。
指令周期流程
一个完整的的指令周期应包括取指、间址、执行和中断4个周期。
上述4个工作周期都有CPU访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。
为了区别不同的工作周期,在CPU内设置4个标志触发器FE、IND、EX和INT,它们分别对应取指、间址、执行和中断周期,并以“1”状态表示有效,分别由1→FE、1→IND、1→EX和1→NT这4个信号控制。
取指周期
任务:取指周期的任务是根据PC中的内容从主存中取出指令代码并存放在IR中
数据流:
PC-①->MAR-②->地址总线-③->主存
CU发出读命令-④->控制总线-⑤->主存
主存-⑥->数据总线-⑦->MDR-⑧->IR (存放指令)
将MAR所指主存内容经数据总线送入MDR,记做:M(MAR)→MDR
将MDR中的内容(此时是指令)送入IR,记做:(MDR)→IR
CU发出控制信号-⑨->PC内容加1
间址周期
任务:间址周期的任务是取操作数有效地址。
数据流:
Ad(IR) (或MDR)-①->MAR-②->地址总线-③->主存
CU发出读命令-④->控制总线-⑤->主存
主存-⑥->数据总线-⑦->MDR (存放有效地址)
将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR)→ MDR
将有效地址送至指令的地址码字段,记做:(MDR)→ Ad(IR)
其中,Ad(IR)表示取出IR中存放的指令字的地址字段
执行周期
执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。
不同指令的执行周期操作不同,因此没有统一的数据流向。
中断周期
任务:处理中断请求。暂停当前任务去完成其他任务,为了能够恢复当前任务,需要保存断点。
一般使用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针,后存入数据。
数据流:
CU控制将SP减1,SP-①->MAR-②->地址总线-③->主存
CU控制将SP减1,修改后的地址送入MAR记做:(SP)-1 → SP,(SP)→ MAR
本质上是将断点存入某个存储单元,假设其地址为a,故可记做:a→MAR
CU发出写命令-④->控制总线-⑤->主存
PC-⑥->MDR-⑦->数据总线-⑧->主存 (程序断点存入主存)
CU (中断服务程序的入口地址) -⑨->PC
一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。
单指令周期
特点:对所有指令都选用相同的执行时间来完成,指令之间串行执行。
指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。
时钟周期:时钟周期取决于执行时间最长的指令的执行时间。
对于那些本来可以在更短时间内完成的指令,要使用较长的周期来完成,会降低整个系统的运行速度。
多指令周期
流水线方案
数据通路:数据在功能部件之间传送的路径。
数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都需要加以控制。
构成:包括数据通路上流经的部件,如ALU、通用寄存器、状态寄存器、异常和中断处理逻辑等。
数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号。
功能:实现CPU内部的运算器与寄存器及寄存器之间的数据交换。
基本结构类型
CPU内部单总线数据通路
寄存器之间的数据传送
寄存器之间的数据传送可通过CPU 内部总线完成。
上图中,以PC寄存器为例,把PC内容送至MAR,实现传送操作的流程及控制信号为
(PC)→Bus PCout有效,PC内容→总线
Bus→MAR MARin有效,总线→MAR
主存与CPU之间的数据传送
主存与CPU之间的数据传送也要借助CPU内部总线完成。
以CPU从主存读取指令为例,实现传送操作的流程及控制信号为
(PC)→Bus→MAR PCout和MARin有效,现行指令地址→MAR
1→R CU发读命令(过控制总线发出,图中未画出)
MEM(MAR)→MDR MDRin有效
MDR→Bus→IR MDRout和IRin有效,现行指令→IR
执行算术或逻辑运算
执行算术或逻辑操作时,由于ALU本身是没有内部存储功能的组合电路,因此如要执行加法运算,相加的两个数必须在ALU的两个输入端同时有效。
以一条加法指令为例,微操作序列及控制信号为:
Ad(IR)→Bus→MAR MDRout和MARin有效
1→R CU发读命令
MEM(MAR)→MDR MDRin有效
MDR→Bus→Y MDRout和Yin有效,操作数→Y
(ACC)+(Y)→Z ACCout和ALUin有效,CU向ALU发送加命令
Z→ACC Zout和ACCin有效,结果→ACC
控制器的结构
下图介绍了计算机硬件系统的五大功能部件及其连接关系。它们通过数据总线、地址总线和控制总线连接在一起,其中点画线框内的是控制器部件。
控制的功能
硬布线控制器的基本原理是根据指令的要求、当前的时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号。它由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器。
硬布线控制单元图
指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从CU分离出来,便可得到简化的控制单元图,如下图所示。
输入:
输出:
CPU内部的控制信号:寄存器之间的数据传输、PC的修改、控制ALU进行相应的运算
到控制总线的控制信号:
到存储器:访存控制信号MREQ、读命令RD、写命令WR
到I/O设备:访问I/O设备的控制信号IO
中断响应信号INTA、总线响应信号HLDA
硬布线控制器的微操作
微操作命令分析。控制单元具有发出各种操作命令(控制信号)序列的功能。这些命令与指令有关,而且必须按一定次序发出,才能使机器有序地工作。
执行程序的过程中,对于不同的指令,控制单元需发出各种不同的微操作命令。一条指令分为3个工作周期:取指周期、间址周期和执行周期。下面分析各个子周期的微操作命令。
取指周期的微操作命令。无论是什么指令,取指周期都需有下列微操作命令:
(PC)→MAR 现行指令地址→MAR
1→R 命令存储器读
M(MAR)→MDR 现行指令从存储器中读至MDR
(MDR)→IR 现行指令→IR
OP(IR)→IR 指令的操作码→CU译码
(PC)+1→PC 形成下一条指令的地址
间址周期的微操作命令。间址周期完成取操作数地址的任务,具体微操作命令如下:
Ad(IR)→MAR 将指令字中的地址码(形式地址)→MAR
1→R 命令存储器读
M(MAR)→MDR 将有效地址从存储器读至MDR
执行周期的微操作命令。执行周期的微操作命令视不同指令而定。
a.非访存指令。
CLA 清ACC
COM 取反
SHR 算术右移
CSL 循环左移
STP 停机指令
b.访存指令
ADD X 加法指令
Ad(IR)→MAR,1→R
M(MAR)→MDR
(ACC)+(MDR)→ACC
STA X 存数指令
Ad(IR)→MAR,1→W
(ACC)→MDR
LDA X 取数指令
c.转移指令
JMP X 无条件转移指令
BAN X 条件转移指令(负则转)
CPU的控制方式:产生不同微操作命令序列所用的时序控制方式。
同步控制方式。所谓同步控制方式,是指系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号。通常以最长的微操作序列和最烦琐的微操作作为标准,采取完全统一的、具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令。
同步控制方式的优点是控制电路简单,缺点是运行速度慢。
异步控制方式。异步控制方式不存在基准时标信号,各部件按自身固有的速度工作,通过应答方式进行联络。
异步控制方式的优点是运行速度快,缺点是控制电路比较复杂。
联合控制方式。联合控制方式是介于同步、异步之间的一种折中。这种方式对各种不同的指令的微操作实行大部分采用同步控制、小部分采用异步控制的办法。
硬布线控制器设计步骤
微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
微程序控制的基本概念
微程序设计思想就是将每条机器指令编写成一个微程序,每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。
这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令。
微程序控制器组成和工作过程
微程序控制器的基本组成
微程序控制器的工作过程
微程序和机器指令
一条机器指令对应一个微程序。由于任何机器指令的取指令操作都是相同的,因此可将取指令操作的微命令统一编成一个微程序,这个微程序只负责将指令从主存单元中取出并送至指令寄存器。
微指令的编码方式
微指令的编码方式又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。
直接编码(直接控制)方式
微指令的直接编码方式如下图所示。
字段直接编码方式
优点:可以缩短微指令字长
缺点:因为要通过译码电路后再发出微命令,因此比直接编码方式慢
分段原则:
①互斥性微命令分在同一段内,相容性微命今分在不同段内。
②每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间
③一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作
字段间接编码方式
编码方式:一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,因此称为字段间接编码,又称隐式编码。
优点:可进一步缩短微指令字长
缺点:但因削弱了微指令的并行控制能力,因此通常作为字段直接编码方式的一种辅助手段。
微指令的地址形成方式
后继微地址的形成主要有以下两大基本类型:
直接由微指令的下地址字段指出。微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后维微指令的地址,这种方式又称断定方式。
根据机器指令的操作码形成。机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成
其他方式:
①增量计数器法,即(CMAR)+1→CMAR,适用于后继微指令的地址连续的情况
②根据各种标志决定微指令分支转移的地址。
③通过测试网络形成。
④由硬件直接产生微程序入口地址,
微指令的格式
微指令格式与微指令的编码方式有关,通常分水平型微指令和垂直型微指令两种。
水平型微指令。
从编码方式看,直接编码、字段直接编码、字段间接编码和混合编码都属于水平型微指令。一条水平型微指令定义并执行几种并行的基本操作,指令字中的一位对应一个控制信号,有输出时为1,否则为0。
垂直型微指令。
垂直型微指令的特点是采用类似机器指令操作码的方式,在微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能。一条垂直型微指令只能定义并执行一种基本操作。
混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。
微指令较短,仍便于混合型微指令编写;微程序也不长,执行速度加快。
水平型微指令和垂直型微指令的比较
比较 | 水平微指令 | 垂直微指令 |
---|---|---|
并行能力 | 强 | 弱 |
执行时间 | 长 | 长 |
微指令字长短 | 指令字较长;微程序短 | 微指令字较短;微程序长 |
编程难易程度 | 难 | 简单 |
微程序控制单元的设计步骤
硬布线和微程序控制器的特点
对比 | 微程序控制器 | 硬布线控制器 |
---|---|---|
工作原理 | 微操作控制信号以微程序的形式存放在控制存储器中,执行指令时读出即可 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生 |
执行速度 | 慢 | 快 |
规整性 | 较规整 | 烦琐、不规整 |
应用场合 | CISC CPU | RISC CPU |
易扩充性 | 易扩充修改 | 困难 |
异常:由CPU内部产生的意外事件被称为异常,有些教材中也称内中断。
是CPU执行一条指令时,由CPU在其内部检测到的、与正在执行的指令相关的同步事件;
中断:由来自CPU外部的设备向CPU发出的中断请求被称为中断,通常用于信息的输入和输出,有些教材中也称外中断。
是一种典型的由外部设备触发的、与当前正在执行的指令无关的异步事件。
异常的分类
故障(Fault)
定义:指在引起故障的指令启动后、执行结束前被检测到的异常事件。
例:指令译码时,出现“非法操作码”;取数据时,发生**“缺段”或“缺页"**;执行整数除法指令时,发现“除数为0”等。
处理:内核程序修复后会把CPU使用权还给应用程序,让它继续执行。(如缺页中断)
对于“非法操作码”和“除数为0”等,因为无法通过异常处理恢复故障,必需终止程序。
自陷(Trap)
故障和自陷异常属于软件中断(程序性异常);终止和外中断属于硬件中断
终止(Abort)
中断的分类
中断是指来自CPU外部、与CPU执行指令无关的事件引起的中断,包括IO设备发出的IO中断(如键盘输入、打印机缺纸等),或发生某种特殊事件(如用户按Esc键、定时器计数时间到)等。
外部I/O设备通过特定的中断请求信号线向CPU提出中断请求,CPU每执行完一条指令就检查中断请求信号线,如果检测到中断请求,则进入中断响应周期。
可屏蔽中断
指通过可屏蔽中断请求线INTR向CPU发出的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,被屏蔽的中断请求将不被送到CPU。
不可屏蔽中断
指通过专门的不可屏蔽中断请求线NMI向CPU发出的中断请求,通常是非常紧急的硬件故障,如电源掉电等。这类中断请求信号不可被屏蔽,以让CPU快速处理这类紧急事件。
中断和异常的不同点
CPU对异常和中断响应的过程可分为:关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序。
关中断
在保存断点和程序状态期间,不能被新的中断打断,因此要禁止响应新的中断,即关中断。
通常通过设置**“中断允许”(IF)触发器**来实现,
保存断点和程序状态
为了能在异常和中断处理后正确返回到被中断的程序继续执行,必须将程序的断点(返回地址)送到栈或特定寄存器中。通常保存在栈中,这是为了支持异常或中断的嵌套。
异常和中断处理后可能还要回到被中断的程序继续执行,被中断时的程序状态字寄存器PSWR的内容也需要保存在栈或特定寄存器中,在异常和中断返回时恢复到PSWR中。
识别异常和中断并转到相应的处理程序
异常和中断源的识别有软件识别和硬件识别两种方式。
可从两方面提高处理机的并行性:
①时间上的并行技术,将一个任务分解为几个不同的子阶段,每个阶段在不同的功能部件上并行执行,以便在同一时刻能够同时执行多个任务,进而提升系统性能,这种方法被称为流水线技术。
②空间上的并行技术,在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,这样的处理机被称为超标量处理机。
指令流水的定义
一条指令的执行过程可以分为以下5个阶段:
把k+1条指令的取指阶段提前到第k条指令的译码阶段,从而将第k+1条指令的译码阶段与第k条指令的执行阶段同时进行,如图所示。
理想情况下,每个时钟周期都有一条指令进入流水线,每个时钟周期都有一条指令完成,每条指令的时钟周期数(即CPI)都为1。
为了利于实现指令流水线,指令集应具有如下特征:
流水线的表示方法
通常用时空图来直观地描述流水线的执行情况。
在时空图中,横坐标表示时间,它被分割成长度相等的时间段T;纵坐标为空间,表示当前指令所处的功能部件。
只有大量连续任务不断输入流水线,才能充分发挥流水线的性能,而指令的执行正好是连续不断的,非常适合采用流水线技术。对于其他部件级流水线,如浮点运算流水线,同样也仅适合于提升浮点运算密集型应用的性能,对于单个运算是无法提升性能的。
在单周期实现中,这5个功能段是串连在一起的,如下图所示。
虽然不是所有指令都必须经历完整的5个阶段,但只能以执行速度最慢的指令作为设计其时钟周期的依据,单周期CPU的时钟频率取决于数据通路中的关键路径(最长路径),因此单周期CPU指令执行效率不佳。
流水线的数据通路
一个5段流水线数据通路如下图所示。
每个流水段后面都需要增加一个流水寄存器,用于锁存本段处理完成的数据和控制信号,以保证本段的执行结果能在下个时钟周期给下一流水段使用。
流水线的控制信号
每个流水寄存器中保存的信息包括:
流水线的执行过程
由于流水线的特殊结构,所有指令都需要完整经过流水线的各功能段,只不过某些指令在某些功能段内没有任何实质性的操作,只是等待一个时钟周期,这也就意味着单条指令的执行时间还是5个功能段时间延迟的总和。
取指(IF)
从存储器中根据程序计数器PC的值取出一条指令,并将其放入指令寄存器IR中,同时更新PC的值为下一条指令的地址。
译码/读寄存器(ID)
对IR中的指令进行译码,确定指令的类型、操作码和操作数,以及要使用的寄存器或立即数。如果是转移指令,还要计算转移目标地址和判断转移条件。
执行/计算地址(EX)
根据指令的类型和操作码,对ID阶段读出的操作数进行相应的运算或操作,如加减乘除、逻辑运算、移位等。运算结果暂存在ALU输出寄存器中。
访存(MEM)
如果指令需要访问存储器,如加载或存储指令,那么在这个阶段用EX阶段计算出的有效地址从存储器中读出或写入数据。如果是分支指令,还要判断是否需要更新PC的值为转移目标地址。
写回(WB)
将EX或MEM阶段得到的结果写回到目标寄存器中,完成一条指令的执行。
在指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿,这种现象称为流水线冒险。
结构冒险(资源冲突)
由于多条指令在同一时刻争用同一资源而形成的冲突,又称结构相关。
解决办法:
数据冒险(数据冲突)
在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突。
解决办法:
把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。
可分为硬件阻塞(stall) 和软件插入“NOP”两种方法。
数据旁路技术(转发机制):从执行阶段结果出来后送回ALU输入端
编译优化:通过编译器调整指令顺序来解决数据相关。
控制冒险(控制冲突)
当流水线遇到转移指令和其他改变PC值的指令,必需等待分支处理结果而造成断流时,会引起控制相关。
解决办法:
流水线的吞吐率(TP)
吞吐率是指在单位时间内流水线所完成的任务数量,或是输出结果的数量。其公式如下:
T P = n T k TP=\frac {n} {T_k} TP=Tkn
式中, n n n是任务数, T K T_K TK是处理完n个任务所用的总时间。
设k为流水段的段数,Δt为时钟周期,在输入流水线任务连续的情况下,一条k段流水线能在k+n-1个时钟周期完成n个任务。流水线吞吐率为
T P = n ( k + n − 1 ) Δ t TP=\frac {n} {(k+n-1)Δt} TP=(k+n−1)Δtn
连续输入的任务数 n → ∞ n\to\infty n→∞时,得到最大吞吐率为 T P m a x = 1 / Δ t TP_{max}=1/Δt TPmax=1/Δt。
流水线的加速比(S)
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。
流水线加速比的基本公式为
S = T 0 T k S=\frac{T_0}{T_k} S=TkT0
式中, T 0 T_0 T0表示不使用流水线的总时间; T k T_k Tk表示使用流水线的总时间。
一条k段流水线完成n个任务所需的时间为 T k = ( k + n − 1 ) Δ t T_k=(k+n-1)Δt Tk=(k+n−1)Δt。顺序执行n个任务时,所需的总时间为 T 0 = k n Δ t T_0=knΔt T0=knΔt。将 T 0 T_0 T0和 T k T_k Tk代入上式,得到流水线加速比为
S = k n Δ t ( k + n − 1 ) Δ t = k n k + n − 1 S=\frac{knΔt}{(k+n-1)Δt}=\frac{kn}{k+n-1} S=(k+n−1)ΔtknΔt=k+n−1kn
连续输入的任务数 n → ∞ n\to\infty n→∞时,得到最大加速比为 S m a x = k S_{max}=k Smax=k。
效率
流水线的设备利用率称为流水线的效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。
超标量流水线技术
也称动态多发射技术,每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行。
要配置多个功能部件
指令是按顺序发射执行,不能调整指令的执行顺序
通过编译优化技术,把可并行执行的指令搭配起来
超长指令字技术
也称静态多发射技术,由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件
超流水线技术
在流水线一个时钟周期再划分多个功能段,通过提高流水线主频的方式来提升流水线性能。
但是流水线级数越多,用于流水寄存器的开销就越大,因而流水线级数是有限制的,并不是越多越好。
单指令流单数据流(SISD)结构
特性:在一段时间内仅执行一条指令,按指令流规定的顺序串行执行指令流中的若干条指令。
各指令序列只能并发、不能并行,每条指令处理一两个数据;不是数据级并行技术
硬件构成:传统的串行计算机结构,一个处理器和一个存储器;若采用指令流水线,需设置多个功能部件,采用多模块交叉存储器
前面介绍的内容多属于SISD结构
单指令流多数据流(SIMD)结构
特性:一个指令流同时对多个数据流进行处理,一般称为数据级并行技术。
各指令序列只能并发、不能并行,但每条指令可同时处理很多个具有相同特征的数据
硬件组成:一个指令控制部件(CU)+多个处理单元/执行单元(如ALU)+多个局部存储器+一个主存储器
每个处理单元虽然执行的都是同一条指令,但是每个单元都有自己的地址寄存器,这样每个单元就都有不同的数据地址。不同处理单元执行的同一条指令所处理的不同数据。
SIMD在使用for循环处理数组时最有效,比如,一条分别对16对数据进行运算的SIMD指令,如果在16个ALU中同时运算,则只需要一次运算时间就能完成运算。
SIMD在使用case或switch语句时效率最低,此时每个执行单元必须根据不同的数据执行不同的操作。
多指令流单数据流(MISD)结构
多条指令并行执行,处理同一个数据。现实中不存在这种计算机。
多指令流多数据流(MIMD)结构
MIMD是指同时执行多条指令分别处理多个不同的数据,MIMD分为多计算机系统和多处理器系统。
向量处理器:向量处理器是SIMD的变体,是一种实现了**直接操作一维数组(向量)**指令集的CPU,而串行处理器只能处理单一数据集。
为了减少线程切换过程中的开销,便诞生了硬件多线程。在支持硬件多线程的CPU中,必须为每个线程提供单独的通用寄存器组、单独的程序计数器等,线程的切换只需激活选中的寄存器,从而省略了与存储器数据交换的环节,大大减少了线程切换的开销。
硬件多线程有3种实现方式:细粒度多线程、粗粒度多线程和同时多线程(SMT)。
细粒度多线程
多个线程之间轮流交叉执行指令,多个线程之间的指令是不相关的,可以乱序并行执行。
处理器能在每个时钟周期切换线程。
粗粒度多线程
仅在一个线程出现了较大开销的阻塞时,才切换线程,如Cache 缺失。
阻塞时,新线程的指令开始执行前需要重载流水线,线程切换的开销比细粒度多线程更大。
同时多线程
同时多线程(SMT)在同一个时钟周期中,发射多个不同线程中的多条指令执行。
Intel 处理器中的超线程(Hyper-threading)就是同时多线程SMT,即在一个单处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件。
细粒度多线程 | 粗粒度多线程 | 同时多线程(SMT) | |
---|---|---|---|
指令发射 | 各个时钟周期,轮流发射多个线程的指令 | 连续几个时钟周期,都发射同一线程的指令序列,流水线阻塞时,切换另一个线程 | 一个时钟周期内,同时发射多个线程的搭令 |
线程切换频率 | 每个时钟周期切换一次线程 | 只有流水线阻塞时才切换一次线程 | |
线程切换代价 | 低 | 高,需要重载流水线 | |
并行性 | 指令级并行,线程间不并行 | 指令级并行,线程间不并行 | 指令级并行,线程级并行 |
三种硬件多线程方式的调度示例:
多核处理器是指将多个处理单元集成到单个CPU中,每个处理单元称为一个核(core)。
每个核可以有自己的Cache,也可以共享同一个Cacheo所有核一般都是对称的,并且共享主存储器,因此多核属于共享存储的对称多处理器。下图是不共享Cache的双核CPU结构。
在多核计算机系统中,如要充分发挥硬件的性能,必须采用多线程(或多进程)执行,使得每个核在同一时刻都有线程在执行。
多核上的多个线程是在物理上并行执行的,是真正意义上的并行执行,在同一时刻有多个线程在并行执行。而单核上的多线程是一 种并发的多线程交错执行,实际上在同一时刻只有一个线程在执行。
定义
具有共享的单一物理地址空间的多处理器被称为共享内存多处理器(SMP)。
处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问任何存储器的位置。注意,即使这些系统共享同一个物理地址空间,它们仍然可在自己的虚拟地址空间中单独地运行程序。
分类
统一存储访问(UMA)多处理器
定义:每个处理器对所有存储单元的访问时间是大致相同的,即访问时间与哪个处理器提出访存请求及访问哪个字无关。
结构:CPU通过前端总线和北桥芯片相连,越来越多的CPU对前端总线的争用使得前端总线成为瓶颈。
分类:根据处理器与共享存储器之间的连接方式,分为基于总线、基于交叉开关网络和基于多级交换网络连接等几种处理器。
非统一存储访问(NUMA)多处理器
定义:某些访存请求要比其他的快,具体取决于哪个处理器提出了访问请求以及访问哪个字,这是由于主存被分割并分配给了同一机器上的不同处理器或内存控制器。
结构:内存控制器被集成到CPU内部,每个CPU都有独立的内存控制器。每个CPU都独立连接到一部分内存,CPU直连的这部分内存被称为本地内存。
分类:处理器中不带高速缓存时,被称为NC-NUMA;处理器中带有一致性高速缓存时,被称为CC-NUMA。
在NUMA架构下,内存的访问出现了本地和远程的区别,访问本地内存明显要快于访问远程内存。