Bootstrap

计算机组成原理笔记(王道考研) 第五章:中央处理器

内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记。

感谢LY,他帮我做了一部分笔记。由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些。

 

西电的计算机组织与体系结构课讲法和王道考研的课不太一样,要应付校内考试建议还是跟着老师学比较好。以下是20年西电计科院车向泉老师这门课的录播下载链接(请勿将录像上传到B站等网站!!):

链接:https://pan.baidu.com/s/1bFs3ajhy8ZcbHopS9izGsw

提取码:fdez

期中考试占20分,一般只考前两章内容,期末考试占60分,一般前两章内容不考,考察内容一般考前的复习课都会讲清楚,请务必认真听复习课。

 

其他各章节的链接如下:

计算机组成原理笔记(王道考研) 第一章:计算机系统概述

计算机组成原理笔记(王道考研) 第二章:数据的表示和运算1

计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2

计算机组成原理笔记(王道考研) 第三章:存储系统

计算机组成原理笔记(王道考研) 第四章:指令系统

计算机组成原理笔记(王道考研) 第五章:中央处理器

计算机组成原理笔记(王道考研) 第六章:总线

计算机组成原理笔记(王道考研) 第七章:输入输出系统

其他各科笔记汇总

中央处理器

image-20210508212036642

CPU的功能和基本结构

image-20210508213749042
CPU的功能
image-20220915220025139

每一种操作信号对应一种微操作

运算器和控制器的功能
image-20220915220059585

现代计算机当中每执行完一条指令之后,CPU都会检查是否有中断信号需要处理

运算器的基本结构
image-20210508212700338

操作系统会给每一个当前正在运行的程序管理一个堆栈,记录当前运行的程序相应的一些数据,比如一些局部变量的值,还有函数返回的地址等等。而SP指明了当前运行进程的栈顶位置

 

 

image-20210508212727466

虽然只画了一条线,但事实上寄存器里各个比特的数据是通过很多根线并行地送到A、B端口

image-20210508212824661 image-20210508212845168

 

 

image-20210508212906216

R i o u t Ri_{out} Riout —— 寄存器输出控制信号, R i i n Ri_{in} Riin —— 寄存器输入控制信号

image-20210508213035825 image-20210508213156106
控制器的基本结构
image-20210508213257987

M D R i n E MDR_{in}E MDRinE —— 从外部的数据总线输入数据的通路是否有效

M D R i n MDR_{in} MDRin —— 从CPU内部总线输入数据的通路是否有效

M D R o u t MDR_{out} MDRout —— 从MDR输出数据到CPU内部总线上

M D R o u t E MDR_{out}E MDRoutE —— 当这个信号有效时会从MDR当中输出数据到外部数据总线上

CPU的基本结构
image-20220915225942040

用户可见 —— 程序员可以通过汇编语言改变某一些寄存器的值

image-20210508213649531 image-20210508213736446

 

指令执行过程

image-20210508214659922
指令周期
image-20210510213339048 image-20210510213404048

取指令会涉及访问主存,访存很慢。把指令取到IR之后,对指令的译码是CPU内部的快速运算,比起访存只需要花费很短的时间

image-20210510214158060

主频3.0GHz —— CPU每秒钟能够发出3.0G次的时钟周期,会有个3.0G个节拍

取指令的操作需要分为几个微操作执行,每个微操作需要消耗一个时钟周期

 

image-20210508213917464

间址周期 —— 通过形式地址得到有效地址的一段时间,这段时间内也需要进行一次访存

除非此时CPU处于关中断的状态,否则正常来说每一条指令执行快结束时都会留一个周期用来检查中断信号检查是否有中断信号需要处理。比如鼠标的单击,键盘的输入这些信号就需要在中断周期进行处理

指令周期流程
image-20210508214037924

 

控制单元通过设置几个触发器的值表示当前处于哪个周期

image-20210508214056594
指令周期的数据流-取指周期
image-20210508214152840

1 → R 1\to R 1R —— 发出读信号

指令周期的数据流-间址周期
image-20210508214233824

也可以直接把MDR的数据送到MAR

指令周期的数据流-执行周期
image-20220916115321410
指令周期的数据流-中断周期
image-20210508214405372

在实际的操作系统当中,堆栈区域通常地址空间从高到低,栈顶指针指向低地址部分

指令执行方案
image-20210508214434163 image-20210508214458406

单指令周期规定所有指令的指令周期长度都相同,多指令周期允许不同指令的指令周期长度不相同

数据通路的功能 单总线结构

image-20210508215828363

单总线结果意味着同一时刻只能有一组部件通过总线进行数据传送

指令周期的数据流
image-20210508214921600

无论执行什么指令,在指令执行的整个过程当中,数据流动只有寄存器与寄存器之间、 寄存器与主存之间、寄存器与ALU之间三种类型

数据通路
image-20210508215125813

对于各种类型的寄存器无非就是两种控制信号,第一种控制信号控制数据的输入,第二种控制信号控制数据是否可以从寄存器流出。无论是数据的输入信号还是数据的输出信号都由控制器发出,这里提到的 A C C i n , A C C o u t ACC_{in},ACC_{out} ACCin,ACCout这些控制信号都和微操作信号发生器有对应的连线,微操作信号发生器发出不一样的控制信号就可以使得各个寄存器之间有数据的流动

 

image-20210508215148044
数据通路-CPU内部单总线方式

数据传送过程中CU需要发出一些控制信号,通过发出不一样的控制信号就可以让微操作一步步执行下去

每一个微操作的执行至少要消耗一个时钟周期,每一个时钟周期内CU都会发出一组相应的控制信号来完成其中的某一个微操作,指令的执行本质上就是通过一个个微操作完成的

image-20210508215402401

P C o u t PC_{out} PCout控制信号有效 —— 让CU与 P C o u t PC_{out} PCout相连接的这条线发出一个有效的电信号,PC的输出线路就会被导通,数据会被送到总线上

 

image-20210508215454155

地址信息准备完成之后应该撤销刚才的两个控制信号让总线空闲

MDR和MAR与主存之间的数据通路会用专门的控制信号控制

要读的地址存放在MAR当中,通过地址总线传送给主存,事实上这个地方也应该有一个控制信号控制MAR的信息送到地址总线,只是课本里的例子没有画出这个控制信号

接下来主存根据MAR指示的地址读出相应的数据通过数据总线传送到MDR当中,现在想让MDR的这个输入通路畅通无阻,因此在这个输入通路这也会有一个控制信号 M D R i n E MDR_{in}E MDRinE控制这条通路是否接通

 

image-20210508215615672 image-20210508215730858

ALU的两个输入信号必须同时有效,而内部总线同一时刻只能传送一个输入信号,因此只能先把其中一个加数放到Y里,Y与ALU之间有一个专用的数据通路,它们之间的数据传送不会占用内部总线,另一个被加数存放在ACC里,可以通过单总线直接输送给ALU

运算结果会被输出到Z当中,当输出数据稳定之后就可以撤销刚才的两个控制信号让内部总线恢复空闲

如果系统采用双内部总线或者多内部总线,也可以不设置Y,通过另一个内部总线直接把要进行运算的操作数送给ALU

例题
image-20210508215934275 image-20210508220114526

(R0) 表示要进行一次间接寻址,R0里面存放这个操作数在主存当中的存储地址

 

image-20210508220202104

 

image-20210508220237671

数据通路 专用数据通路

image-20210508221148632

但凡两个部件之间需要有数据的流动,都需要在这两个部件之间有一个专门的数据通路,因此造价成本会比较高。但是由于各个部件之间的数据传送通路都相互独立,因此如果当前执行的指令中间的某几个数据流通的过程可以并行执行,就可以让多个专用的数据通路同时工作,这样就可以提升指令的执行速度,比单总线结构效率更高

每一个部件采用专用数据通路就意味着有可能会有多个输入,到底要让哪个输入信号通过?可以连接一个多路选择器或者给每一个输入的线路都连一个三态门

专用数据通路方式
image-20210508220406994

c i c_i ci指的是控制信号,当控制信号有效时就意味着它所控制的数据通路可以进行数据的流通

专用数据通路方式-取指周期
image-20220916194518986
例题
image-20220916195642107 image-20220916211604669 image-20220916211530137

ALU并不是寄存器,没有数据存储的功能。ALU想要使用的数据会被放到ACC当中

所以这个问题虽然问的是运算器和主存之间存取的数据通路,但事实上它想问的是ACC和主存之间数据存取的数据通路

ALU支持把一个输入的数据原封不动地传出

image-20220916211457969 image-20220916211850791 image-20220916212119520

硬布线控制器设计

内容回顾
image-20210508231654932

有的指令间接寻址可能会涉及多级间接寻址,间址周期会重复多次

微命令指的就是与这个微操作对应的一些控制信号

每发出一条微命令就意味着会完成一个与之对应的微操作

一个机器周期由若干个节拍组成,而每一个节拍里面可以并行地完成某一些互相不冲突的微操作

硬布线控制器
image-20210508231749469

节拍发生器接收到时钟部件发来的脉冲信号之后都会选择让其中的某一根输出线导通,CU根据这些线哪根线输入了高电平信号判断当前处于第几个节拍

image-20210508231827525

LDA —— 取数指令,把数据从主存取到ACC当中

硬布线控制器的设计

image-20210508231911263
分析每个阶段的微操作序列
image-20210508232029096

BAN X —— 当ACC里面存放的数据为负时会转移到X所指明的地址

A 0 A_0 A0 —— ACC里面的符号位

安排微操作时序的原则
image-20220917094247716
安排微操作时序-取指周期
image-20210508232154329 image-20210508232217384
安排微操作时序-间址周期
image-20210508232300987
安排微操作时序-执行周期
image-20210508232439342
安排微操作时序-中断周期
image-20210508232628784
组合逻辑设计
image-20220917095256371

 

 

image-20220917095343733

后面这几条指令可能会涉及访存操作。如果包含的地址码并没有采用间接寻址也有可能直接进入执行阶段

image-20220917095921066

有可能会进行多级间接寻址,所以只有当 I N D ‾ \overline{IND} IND标志信息等于0时才意味着已经完成了最后一级的间接寻址,此时才可以进入执行周期

而如果 I N D ‾ \overline{IND} IND标志信息等于1就意味着还需要进行再下一级的间接寻址,因此接下来的一个机器周期同样还会再重复一遍间接寻址

image-20220917100026880
微操作信号综合
image-20220917100812460
画出逻辑图
image-20220917101041521
硬布线控制器的设计
image-20220917101641516

微程序控制器的基本原理

image-20210508233813868
硬布线控制器的设计思路
image-20220917101935699
微程序控制器的设计思路
image-20210508233600916
微程序控制器的基本结构
image-20210508233707070
微程序控制器的工作原理
image-20210508233743841 image-20210508233801292

CM中微程序段的个数至少是n+1个

微指令的设计

image-20210508234701057
微程序控制器的工作原理
image-20210508233915594
微指令的格式
image-20210508233941935
微指令的编码方式
image-20220917144906076

 

 

image-20220917145033070 image-20220917151019005

 

image-20220917151101432 image-20220917151227988
微指令的地址形成方式
image-20210508234313478

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZaImRQh-1663675993178)( https://xdu-cslee-blog.oss-cn-hangzhou.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20220917151718281.png)]

例题-断定方式
image-20220917152301909

 

微程序控制单元的设计

微程序控制单元的设计
image-20220917154311737 image-20220917154252833 image-20210508234808979 image-20210508234845840

把问题简化,假设这个指令系统当中取指周期结束之后会直接进入到执行周期

 

image-20210508234920015

 

 

image-20210508235341847
微程序设计分类
image-20210508235404357

Intel的处理器基本采用动态微程序设计

硬布线与微程序的比较
image-20210508235433230

 

 

 

微程序控制器回顾
image-20210508235448351

 

指令流水线基本概念 性能指标

image-20210509000529114
指令流水的定义
image-20210509000044110

指令不一定从主存取,也有可能从Cache取

操作数有可能存放在寄存器,Cache或者主存里

image-20210509000211193
流水线的表示方法
image-20210509000239902
流水线的性能指标
image-20210509000328548

一条指令的执行被分为多个阶段,每一个阶段理论上对应一个机器周期,而一个机器周期可能包含多个节拍。这里探讨的是最理想的情况

image-20210509000347708 image-20210509000409821

指令流水线的影响因素和分类

image-20220918010022043
机器周期的设置
image-20210509000922460

IF —— Instruction Fetch

ID —— Instruction Decode

EX —— Execute

M —— Memory

WB —— Writeback

这种五段式的指令流水线是经典的MIPS架构提出的,MIPS是世界上第一个RISC处理器

为了方便指令流水线的安排,MIPS架构下所有的指令一定都是五个机器周期,即便有的指令有可能在实际运行时不需要进行中间某个阶段的处理

对于大部分RISC系统,通常都会规定每一条指令所包含的机器周期数都相同,并且每一个机器周期的长度也都相同,这样可以方便安排流水线

在各个阶段中间添加一些暂存寄存器,先把准备好的数据存放在暂存寄存器里面,下一阶段想要数据时再送出去

之前一直说从主存里取指令,但是在大多数情况下主存里当前需要使用到的指令还有数据会在Cache当中保存一个副本。Cache的命中率一般很高,所以这里IF阶段画了一个Instruction Cache,大部分情况下都可以从Cache里面直接找到现在想要的指令而不需要进行访存。后面W阶段里的Data Cache原理也类似

CPU内部的Cache会被分为两个独立的模块,Instruction Cache和Data Cache。分别专门用来存储指令和数据,对这两个模块的访问可以并行进行

如果Cache没有命中就必须去访问主存,这种情况下指令流水线会出现断流,这种复杂情况先不考虑

ID阶段除了完成指令译码的工作,还会完成取数操作,要把指令所需要用到的操作数从通用寄存器里面取出然后放到锁存器A和B里

这点和之前学习的指令不太一样,之前学习的指令如ADD X指令可以直接指明需要的操作数来自于主存。但是在RISC系统下想要进行运算的操作数一定直接来自于通用寄存器,不可能直接来自于主存,如果要来自于主存一定需要先把数据放到通用寄存器

Imm锁存器用于存立即数,因为有的指令可能使用立即寻址,可以直接从指令当中取出接下来EX阶段需要的立即数放到Imm里面

运算结果有可能需要写回主存,也有可能不需要写回主存直接写回某一个通用寄存器

影响流水线的因素
image-20220918004250126 image-20220918002952302 image-20220918003038700

把指令和数据分别放到不同的Cache或者存储体当中

 

 

image-20220918003213693 image-20220918003245877 image-20220918003556681

编译器负责插入空指令,每一条空指令的执行也会经过完整的五个机器周期。最底层的机器语言程序员或者汇编语言程序员也可以手动插入空指令

 

image-20220918003646202

 

image-20220918003733455

有关分支预测可参考:https://blog.csdn.net/hanzefeng/article/details/82893317

 

 

Screen Shot 2022-08-01 at 15.49.27
流水线的分类
image-20210509001213001 image-20210509001234422
流水线的多发技术
image-20210509001311709

指令的排列由编译器确定

支持指令乱序发射的CPU可以调整指令顺序

image-20210509001324968 image-20210509001341597

 

五段式指令流水线

机器周期的设置
image-20210509001522326
五段式指令流水线
image-20210509001542349
运算类指令的执行过程
image-20210509001601568

对于RISC系统所有的这些运算类指令运算的两个操作数一定直接来自于某一个寄存器或者是立即数,运算结果一定存回某一个寄存器而不可能直接存回主存,所以在M阶段什么也不用做

LOAD 指令的执行过程
image-20210509001630892

LOAD Rd,996(Rs)

在Rs寄存器的值基础上加上996,然后将相加结果作为有效地址取出对应主存单元里存放的数据到Rd寄存器当中

每一个进程在内存里面存放的起始地址都不一样,所以当要访问这个进程里面的某一个变量时通常会采用基址寻址,用Rs寄存器指明这个进程在内存当中的起始地址,相对于起始地址往后偏移996才是想要找的数据

数据Cache没有命中才会进行访存

STORE 指令的执行过程
image-20210509001715211
条件转移指令的执行过程
image-20210509001739885

b —— branch eq —— equal ne —— not equal

PC不属于通用寄存器,对PC值的修改并不会放到WB阶段

无条件转移指令的执行过程
image-20210509001803877

偏移量通常用补码表示

例题
image-20210509001823128

多处理器基本概念

image-20220918190625701 image-20220918190558586
SISD
Screen Shot 2022-08-01 at 18.15.11

单指令流 —— CPU同一时间段内只能处理一个指令序列

单数据流 —— 每一条指令只能处理特定的一两个数据

SIMD
Screen Shot 2022-08-01 at 18.17.18

每一个时刻同样只能执行一条指令,但是一条指令的执行可以同时处理很多个具有相同特征的数据,对这些数据的处理都是相同的

MIMD —— 共享存储多处理器系统
Screen Shot 2022-08-01 at 18.17.43

所有处理器共享最低一级的Cache。 i 7 i7 i7处理器的Cache通常分为L1、L2、L3三级,L1和L2这种更高级更快的Cache专属于某一个特定的核,而L3这级的Cache被所有的核心共享

MIMD —— 多计算机系统
image-20220918193011603
向量处理器
image-20220918193358721

硬件多线程基本概念

image-20220918193750913
一个不太严谨的示意图
image-20220918194010828
三种硬件多线程
image-20220918193932189 image-20220918193946703
;