目录
1. MIPS 指令系统和 MIPS 体系结构
实验目的
- 了解熟悉 MIPSsim 模拟器
- 熟悉 MIPS 指令系统及其特点
- 熟悉 MIPS 体系结构
实验平台
- 指令级和流水线操作级模拟器 MIPSsim
MIPS64 指令系统介绍
MIPS 的寄存器
- 32 个 64 位通用寄存器 GPRs (整数寄存器):
R0
-R31
。R0
的值永远是 0 - 32 个 64 位浮点数寄存器 FPRs:
F0
-F31
。它们可以存放 32 个单精度(32位)或双精度(64位)浮点数
- MIPS 提供了单精度和双精度操作的指令,而且还提供了在 FPRs 和 GPRs 之间传送数据的指令
MIPS 的数据表示
- (1) 整数:字节 (8 位)、半字 (16 位)、字 (32 位)和双字 (64 位)
- (2) 浮点数:单精度浮点数(32位)和双精度浮点数(64位)
- MIPS64 的操作是针对 64 位整数以及 32 位或 64 位浮点数进行的
- 字节、半字或字在装入 64 位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们按照 64 位整数的方式进行运算
- 因此需要注意:在更改寄存器值的时候,需要手动进行符号位扩展
MIPS 的数据寻址方式
- MIPS 的数据寻址方式只有立即数寻址和偏移量寻址两种,立即数字段和偏移量字段都是 16 位
- 寄存器间接寻址是通过把 0 作为偏移量来实现的
- 16 位绝对寻址是通过把
R0
作为基址寄存器来完成的
- MIPS 的存储器是按字节寻址的,地址是 64 位
- 由于 MIPS 是 load-store 结构,寄存器和存储器之间的数据传送都是通过 load 指令和 store 指令来完成的。所有存储器访问都必须边界对齐
MIPS 的指令格式
- 指令格式简单,其中操作码 6 位。按不同类型的指令设置不同的格式,共有 3 种格式,分别对应
I
I
I 指令、
R
R
R 指令和
J
J
J 指令。在这 3 种格式中,同名字段的位置固定不变
-
I
I
I 类指令: 包括所有的
load
和store
指令、立即数指令、分支指令、寄存器跳转指令、寄存器链接跳转指令。其中立即数字段位 16 位,用于提供立即数或偏移量
load
指令: 访存有效地址为Regs[rs] + immedicate
,从存储器取来的数据放入寄存器rt
中store
指令: 访存有效地址位Regs[rs] + immedicate
,需要存入存储器的数据放在寄存器rt
中- 立即数指令:
Regs[rt] ← Regs[rs] op immedicate
(使用立即数的 ALU 指令) - 分支指令: 转移目标地址为
Regs[rs] + immedicate
,rt
无用 - 寄存器跳转、寄存器跳转并链接: 转移目标地址为
Regs[rs]
-
R
R
R 类指令: 包括 ALU 指令、专用寄存器读、写指令、
move
指令
-
J
J
J 类指令: 包括跳转指令、跳转并链接指令、自陷指令、一场返回指令。在这些指令中,指令字的低 26 位时偏移量,它与 PC 值相加形成跳转的地址
-
I
I
I 类指令: 包括所有的
MIPS 的部分指令介绍
Notation:
Regs
表示寄存器组;Mem
表示主存,按字节寻址;[ ]
表示内容,Mem[ ]
表示存储器的内容,Regs[ ]
表示寄存器的内容x
← n ←_n ←ny
表示从y
传送n
位到x
。x,y
← ← ←z
表示把z
传送到x
和y
- 用下标表示字段中具体的位。对于指令和数据按从最高位到最低位的顺序依次进行编号,最高位为 0 位。下标也可以表示一个范围;上标表示对字段进行复制的次数。例如 0 32 0^{32} 032 表示一个 32 位长的全 0 字段
- 符号
##
用于两个字段的拼接
load
和 store
指令
ALU 指令
- ALU 指令都是寄存器—寄存器型或立即数型的。所有指令都支持立即数寻址模式,参与运算的立即数是由指令中的 immedicate 字段(低16位)经符号位扩展后生成的
控制指令
除了以寄存器的内容作为目标地址进行跳转以外,所有其他的控制指令的跳转地址都是相对于 PC 的
浮点指令
- 对浮点寄存器中的数据进行操作,并由操作码指出操作数是单精度还是双精度。在指令助记符中,用后缀
S
和D
分别表示单精度和双精度
MIPSsim 使用说明
启动模拟器
- 双击 MIPSsim.exe 即可启动模拟器
- 所有通用寄存器和浮点寄存器为全 0;内存清零;流水寄存器为全 0;清空时钟图、断点、统计数据;内存容量为 4096B;载入起始地址 0;浮点加法、乘法、除法部件的个数均为 1;浮点加法、乘法、除法运算延迟分别为 6、7、10 个时钟周期;采用流水方式;不采用定向机制;不采用延迟槽;采用符号地址;采用绝对周期计数
MIPSsim 的窗口
- 在流水方式下,模拟器主界面共有 7 个窗口,分别是“代码”窗口、“寄存器”窗口、“流水线”窗口、“时钟周期图”窗口、“内存”窗口、“统计” 窗口和“断点”窗口
- 在非流水方式下只有“代码”窗口、“寄存器” 窗口、 “内存”窗口和“断点”窗口
“代码” 窗口
- 给出内存中代码的列表,每条指令占一行,按地址顺序排列;在该窗口中选择某行,然后再右击,在弹出的快捷菜单中可以选择“设置断点”和“清除断点”命令
- 不同颜色的行代表相应的指令所处的执行段。黄色代表 IF 段,绿色代表 ID 段,红色代表 EX 段,青色代表 MEM 段,棕色代表 WB 段
- 地址:以 16 进制的形式给出。内存是按字节寻址的,每条指令占 4 个字节。当采用符号地址时,会在相应的位置给出汇编程序中出现的标号
- 断点标记:如果在该指令处设有断点,则显示相应的标记。断点标记的形式为
B.X
(X
为段名),表示该断点是设置在该指令的X
段。当模拟器在非流水方式下工作,断点标记为B
- 机器码:该行对应指令的 16 进制机器码。若该行无指令,则仅仅显示 4 字节数据
- 流水段标记:当该指令正在执行时,它表示在当前周期该指令所在的流水段。当模拟器在非流水方式下工作,它没有意义
- 符号指令:机器代码所对应的符号指令。
“寄存器”窗口
特殊寄存器
PC
—程序计数器,32 位LO
—乘法寄存器的低位;HI
—乘法寄存器的高位PCSR
—浮点状态寄存器
流水寄存器
IF/ID.IR
流水段 IF 与 ID 之间的指令寄存器IF/ID.NPC
流水段 IF 与 ID 之间的下一指令程序计数器ID/EX.A
流水段 ID 与 EX 之间的第一操作数寄存器ID/EX.B
流水段 ID 与 EX 之间的第二操作数寄存器ID/EX.Imm
流水段 ID 与 EX 之间的立即数寄存器ID/EX.IR
存放从IF/ID.ID
传过来的指令EX/MEM.ALU0
流水段 EX 与 MEM 之间的 ALU 计算结果寄存器EX/MEM.IR
存放从IF/EX.IR
传过来的指令MEM/WB.LMD
流水段 MEM 与 WB 之间的数据寄存器,用于存放从存储器读出的数据MEM/WB.ALU0
存放从EX/MEM.ALU0
传过来的计算结果MEM/WB.IR
存放从MEM/WB.IR
传过来的指令
除了流水寄存器外,其他寄存器都可以修改
“流水线”窗口
- 每个矩形方块代表一个流水段,它们用不同的颜色进行识别。窗口左侧是 IF 段到 WB 段,右边是浮点部件
- 浮点部件有加法部件(fadd)、浮点乘法部件(fmul)和浮点除法部件(fdiv)3 种。可以在菜单“配置”中的“常规配置”中修改浮点部件个数
- 双击某矩形方块时会弹出窗口显示该段出口处的流水寄存器的内容
“时钟周期图”窗口
- 显示程序执行的时间关系,画出各条指令执行时所用的时钟周期. 在由指令轴和周期轴组成的二维空间中,坐标
(
n
,
i
)
(n,i)
(n,i) 对应的矩形区域表示指令
i
i
i 在第
n
+
1
n+1
n+1 周期时所经过的流水段
- 横坐标有相对周期计数和绝对周期计数两种不同的表示形式
- 在默认的绝对周期计数下,按照 0、1、2… 依次递增的顺序计数
- 在相对周期计数下,当前周期记为第 0 个周期,其余周期按其相对于当前周期的位置,分别记为 -1、-2、-3…
- 双击某行时,会弹出一个窗口显示该指令在各流水段所进行的处理 (流水寄存器之间的数据传输)
- 横坐标有相对周期计数和绝对周期计数两种不同的表示形式
“内存”窗口
- 显示模拟器内存中的内容,可以进行内存修改 (双击某个数据即可修改)
“统计”窗口
- 该窗口显示模拟器统计的各项数据,在非流水方式下,没有该窗口
“断点”窗口
- “断点”窗口列出当前已经设置的所有断点。可以对断点进行添加、删除、全部删除和修改;并且断点设置可以精细到某个流水段
- 在模拟器中断点可以设定在某条指定的某一个流水段上。当该指令执行到相应的流水段时,会中断执行
- 在模拟器中断点可以设定在某条指定的某一个流水段上。当该指令执行到相应的流水段时,会中断执行
实验内容和步骤
- (1) 启动 MIPSsim
- (2) 选择 “配置” → \rightarrow → “流水方式” 选项,使模拟器工作在非流水方式
- (3) 参照使用说明,熟悉 MIPSsim 模拟器的操作和使用方法
- 可以先载入一个样例程序(在本模拟器所在的文件夹下的 “样例程序”文件夹中),然后分别以单步执行一条指令、执行多条指令、连续执行、设置断点等的方式运行程序,观察程序的执行情况,观察 CPU 中寄存器和存储器的内容的变化
- (4) 选择 “文件” → \rightarrow → “载入程序” 选项,加载样例程序 alltest.asm,然后查看“代码”窗口,查看程序所在的位置(起始地址为 0x00000000)
- (5) 查看“寄存器”窗口
PC
寄存器的值:[PC] = 0x00000000
- (6) 按 F7 单步执行
load
、store
、算术运算、逻辑运算、控制转移等指令,观察指令执行前后寄存器、内存中值的变化
2. 流水线及流水线的冲突
实验目的
- 理解计算机流水线基本概念
- 理解 MIPS 结构如何用 5 段流水线来实现,理解各段的功能和基本操作
- 加深对数据冲突、结构冲突的理解,理解这两类冲突对 CPU 性能的影响
- 进一步理解解决数据冲突的方法,掌握如何应用定向技术来减少数据冲突引起的停顿
实验平台
- 指令级和流水线操作级模拟器 MIPSsim
实验原理和内容
- 为提高指令的执行效率,充分挖掘指令级并行,可以采用流水线技术,将同一条指令划分为多个段。在理想情况下,每一段都可以流出一条指令。本实验以经典的 5 段流水线为例,将指令的执行过程分为取指令周期(IF)、指令译码/读寄存器周期(ID)、执行/有效地址计算周期(EX)、存储器访问(MEM)、写回周期(WB)
- 值得一提的是,为了降低控制冲突的影响,该 5 段流水线在 ID 段就判断分支是否执行并计算相应的转移地址
- 同时,为了解决对同一个通用寄存器的访问冲突问题,把写操作安排在时钟周期的前半拍完成,把读操作安排在后半拍完成
- 相关: 相关是指两条指令之间存在某种依赖关系。如果指令之间没有任何关系,那么当流水线有足够的硬件资源时,它们就能在流水线中顺利地重叠执行,而不会引起任何停顿。但如果两条指令相关,那么它们也许就不能在流水线中重叠执行或者只能部分重叠。相关的3种类型:数据相关、名相关和控制相关
- 流水线冲突: 对于具体的流水线来说,由于相关的存在,使指令流中的下一条指令不能在指定的时钟周期执行。流水线冲突有以下3种冲突:结构冲突、数据冲突和控制冲突。在设计流水线时需要很好地解决冲突问题:否则,就可能影响流水线的性能,甚至导致错误的执行结果出现。当发生冲突时,往往需要使某些指令推后执行,从而使流水线出现停顿,这会降低流水线的效率和实际的加速比;可能发生的数据冲突有:1)写后读冲突(RAW)、2)写后写冲突(WAW)、3)读后写冲突(WAR)
实验内容和步骤
- (1) 启动 MIPSsim
- (2) 根据预备知识中关于流水线各段操作的描述,进一步理解流水线窗口中各段的功能,掌握各流水寄存器的含义
- (3) 参照 MIPsim 模拟器使用说明,熟悉 MIPSsim 模拟器的操作和使用方法。
- (4) 选择配置菜单中的“流水方式”选项,使模拟器工作于流水方式下
- (5) 载入程序,观察程序在流水线中的执行情况
3. 指令调度和延迟分支
实验目的
- 加深对指令调度技术的理解
- 加深对延迟分支技术的理解
- 熟练掌握用指令调度技术解决流水线中的数据冲突的方法
- 进一步理解指令调度技术对 CPU 性能的改进
- 进一步理解延迟分支技术对 CPU 性能的改进
实验平台
- 指令级和流水线操作级模拟器 MIPSsim
实验原理和内容
- 为了减少停顿,对于无法使用定向技术解决的数据冲突,可以通过在编译时让编译器重新组织指令顺序来消除冲突,这种技术称为指令调度或流水线调度
- 在流水线中,控制冲突可能会比数据冲突造成更多的性能损失,所以控制冲突同样需要得到很好的处理。执行分支指令的结果有两种,一种是分支“成功”,PC 值改变为分支转移的目标地址。另一种是“失败”,这是 PC 的值保持正常递增,指向顺序的下一条指令。对分支指令“成功”的情况来说,在条件判定和转移地址计算都完成之后,才改变 PC 值
- 处理分支指令最简单的方法是**“冻结”或“排空“流水线**。即一旦在流水线的译码段 ID 检测到分支指令,就暂停其后指令的取指令,直到分支指令,确定是否成功并计算出新的 PC 值为止。这种方法简单,但给流水线带来了一个时钟周期的延迟(称为分支延迟)
- 为了减少分支延迟,可以采用延迟分支技术。这种技术的主要思想是从逻辑上“延长“分支指令的执行时间,把延迟分支看成由原来的分支指令和若干个延迟槽构成。不管分支是否成功,都要按顺序执行延迟槽中的指令。MIPSsim 模拟器的延迟槽的数量为 1 个。在这种情况下,只要分支延迟槽中的指令是有用的,流水线就不会出现停顿,此时延迟分支的方法能够很好地减少分支延迟
- 放入延迟槽中的指令是由编译器来进行选择的。实际上延迟分支能否带来好处完全取决于编译器能否把有用的指令调度到延迟槽中。 这也是一种指令调度技术。常用的调度方法的有 3 种:从前调度、从目标处调度和从失败处调度
- 处理分支指令最简单的方法是**“冻结”或“排空“流水线**。即一旦在流水线的译码段 ID 检测到分支指令,就暂停其后指令的取指令,直到分支指令,确定是否成功并计算出新的 PC 值为止。这种方法简单,但给流水线带来了一个时钟周期的延迟(称为分支延迟)
实验内容和步骤
- (1) 启动 MIPSsim
- (2) 根据前面的相关知识中关于流水线各段操作的描述,进一步理解流水线窗口中各段的功能,掌握各流水寄存器的含义
- (3) 选择“配置”->“流水方式”选项,使模拟器工作于流水方式下
- (4) 用指令调度技术解决流水线中的数据冲突
- (5) 用延迟分支减少分支指令对性能的影响
4. Cache性能分析
实验目的
- 加深对 Cache 的基本概念、基本组织结构以及基本工作原理的理解
- 掌握 Cache 容量、相联度、块大小对 Cache 性能的影响
- 掌握降低 Cache 不命中率的各种方法以及这些方法对提高 Cache 性能的好处
- 理解 LRU 与随机法的基本思想以及它们对 Cache 性能的影响
实验平台
- 实验平台采用 Cache 模拟器 MyCache
MyCache 模拟器的使用方法
- (1) 启动模拟器,双击 MyCache.exe 即可
- (2) 系统打开一个操作界面,左边为设置模拟参考区域,右边为模拟结果显示区域
- (3) 可以设置的参数包括是同一Cache 还是分离 Cache,Cache 的容量,块大小,相联度,替换算法,预取策略,写策略,写不命中时的调块策略。可以直接从列表中选择
- (4) 访问地址可以选择来自地址流文件,也可以选择手动输入
- (5) 模拟结果包括:
- (1) 访问总次数,总的不命中次数,总的不命中率
- (2) 读指令操作的次数,其不命中次数及其不命中率
- (3) 读数据操作的次数,其不命中次数及其不命中率
- (4) 写数据操作的次数,其不命中次数及其不命中率
- (5) 手动输入单次访问的相关信息
实验原理和内容
- Cache 映像规则:全相连映像、直接映像、组相连映像
- 替换算法:随机法、先进先出法 FIFO、最近最少使用法 LRU
- 降低不命中率的方法:增加 Cache 块大小、增加 Cache 容量、提高相联度
实验内容和步骤
- (1)启动 MyCache
- (2)用鼠标单击“复位”按钮,把各参数设置为默认值
- (3)选择一个地址流文件。方法:选择“访问地址”—>“地址流文件”选项,然后单击“浏览”按钮,从本模拟器所在文件夹下的“地址流”文件夹中选取
- (4) 实验不同 Cache 容量、相联度、块大小、替换算法对不命中率的影响
5. Tomasulo算法
6. 再定序缓冲(ROB)工作原理
7. 多 Cache 一致性—— 监听协议
8. 多 Cache 一致性—— 目录协议
实验目的
- 加深对指令级并行性及开发的理解
- 加深对 Tomasulo、再定序(ROB)、多 Cache 一致性的理解
- 掌握指令在流出、执行、写结果和确认阶段所进行的操作
- 掌握保留站、ROB 缓冲器的结构、监听协议和目录协议
实验平台
- 实验平台采用相应模拟器
实验原理和内容
Tomasulo 算法
- 基本思想:记录和检测指令的相关,操作数一旦就绪就立即执行,把
RAW 冲突降为最小。通过寄存器换名来消除 RAW 和 WAW 冲突
- 各符号的意义:
- r r r:分配给当前指令的保留站或者缓冲器单元编号;
- r d rd rd:目标寄存器编号;
-
r
s
rs
rs、
r
t
rt
rt:操作数寄存器编号;
- 与 r s rs rs 对应的保留站字段: V j V_j Vj, Q j Q_j Qj
- 与 r t r_t rt 对应的保留站字段: V k V_k Vk, Q k Q_k Qk
- i m m imm imm:符号扩展后的立即数;
- R S RS RS:保留站;
- r e s u l t result result:浮点部件或 load 缓冲器返回的结果;
-
Q
i
Q_i
Qi:寄存器状态表;
- Q i Q_i Qi、 Q j Q_j Qj、 Q k Q_k Qk 的内容或者为 0,或者是一个大于 0 的整数; Q i Q_i Qi 为 0 表示相应寄存器中的数据就绪。 Q j Q_j Qj、 Q k Q_k Qk 为 0 表示保留站或缓冲器单元中的 V j V_j Vj 或 V k V_k Vk 字段中的数据就绪。当它们为正整数时,表示相应的寄存器、保留站或缓冲器单元正在等待结果
- R e g s [ ] Regs[ ] Regs[]:寄存器组;
再定序缓冲(ROB)
- 再定序缓冲 ROB 的硬件结构跟 Tomasulo 算法的很像(前者是在后者的基础上改进),但主要思想还是很不一样的,解决的问题也不太一样。
Tomasulo 算法主要解决 RAW,WAW,WAR 冲突,而 ROB 主要解决控制相关的问题。ROB 结合了动态分支预测,前瞻执行,动态跨基本块调度三种思想。所以 ROB 结构中 CPU 效率更高
ROB 结构图
- 为实现前瞻执行,增设ROB缓冲器。在指令操作完成后到指令被确认这段时间,为指令保存数据。正在前瞻执行的指令之间也是通过 ROB 传送结果的。因为前瞻执行的指令在确认前是不能写寄存器的
多 Cache 一致性-监听协议
- 当存储器中的数据块被调入 Cache 时,其共享状态信息与该数据块一起
放在该 Cache 中。当 Cache 要访问存储器时,它会把请求广播到总线上,其他 Cache 监听来判断是否执行相应操作- 写贯穿 Cache:
- 写回法 Cache:
- 写贯穿 Cache:
多 Cache 一致性-目录协议
- 采用一个集中的数据结构–目录实现 Cache 的一致性。对于存储器中的每一个可以调入 Cache 的数据块,在目录中设置一条目录项,用来记录该块的状态及哪些 Cache 中有副本等相关信息
- 在目录协议中存储块的状态有 3 种: 未缓冲, 共享, 独占; 存储数据节点有 3 种: 本地:发地址为
K
K
K 的访存请求; 宿主:
K
K
K 存储单元和目录; 远程:含
K
K
K 的副本
- 本地、宿主(目录)、宿主、远程节点消息
- 本地节点发给宿主节点(目录)的消息:
RdMiss(P, K)
,WtMiss(P, K)
,Invalidate(K)
- 宿主节点(目录)发给远程节点的消息:
Invalidate(K)
,Fetch(K)
,Fetch&Inv(K)
- 宿主发给本地节点的消息:
DReply(D)
- 远程节点发给宿主节点的消息:
WtBack(K, D)
- 本地节点发给被替换块的宿主节点的消息:
MdSarer(P, K)
- 远程节点发给宿主节点的消息:
WtBack(K, D)
,WtBack2(P, K, D)
- 本地节点发给宿主节点(目录)的消息:
- 响应宿主节点的请求
- 目录状态的转换
- 目录状态的转换