一.指令集结构

1.基本知识

一个指令的组成 = 操作码 + 寻址方式 + 操作数 → 指令由CPU直接执行
操作码:一些操作的编码
寻址方式:访问寄存器或存储器的方法
操作数:存储单元的地址








指令集

源程序

优化编译器

目标代码

指令译码

指令编码

CPI和数据通路复杂度


指令集系统可以说是硬件与操作系统之间的桥梁





CPU

指令集

操作系统

应用程序


2.分类

RISC和CISC指令集
RISC:最著名的ARM指令集,固定长度指令集
CISC:X86指令集,可变长度指令集

3.寻址方式

1) 寄存器寻址

Add R4, R3
Regs[R4] <- Regs[R4]  + Regs[R3]
R3寄存器中的值与R4寄存器中的值相加,并将结果存储在R4寄存器中

2)偏移寻址

Add R4, 100(R1)
Regs[R4] <- Regs[R4]  + Mem[100 + Regs[R3]]
R3寄存器中保存的是某一个地址,100是偏移量

3)寄存器间接寻址

Add R4, (R1)
Regs[R4] <- Regs[R4]  + Mem[Regs[R1]] 
可以看作偏移寻址的一个特例

4)索引寻址

Add R3, (R1 + R2)
Regs[R3] <- Regs[R3]  + Mem[Regs[R1] + Regs[R2]]
R1和R2寄存器的值是两个地址

5)直接寻址

Add R1, (1000)
Regs[R3] <- Regs[R3]  + Mem[1000]
1000是立即数,表示这个位置的地址是1000,在存储器中取出地址1000所指向的值,与R3寄存器
中的值相加,把结果存储在R3中

6)自增寻址

Add R1, (R2)+

Regs[R1] <- Regs[R1]  + Mem[Regs[R2]]
Regs[R2] <- Regs[R2]  + d

RISC指令集功能设计原则:
1.从CISC中选取使用频率最高的指令,并补充一些最有用的指令
2.每条指令功能应尽可能简单,并在一个机器周期内完成
3.所有指令长度相同
4.只有load,store两个指令访问存储器,其余指令只能访问寄存器
5,简单高效支持高级语言

二.MIPS指令集结构

1.基本知识

1)具有一个简单的load/store指令集
2)注重指令流水效率
3)简化了指令的译码
4)高效支持编译器
5)32个32位通用寄存器,32个32位浮点寄存器
6)支持的寻址方式:寄存器寻址,立即数寻址,偏移寻址,寄存器间接寻址

2.指令格式

1)I类型

6        5     5          16
 操作码     RS1   RS2        立即数

RS2 <- RS1 OP 立即数
数据的载入和存储

2)R类型

6        5     5     5     11
 操作码     RS1   RS2   RD    FUNC
RD <- RS1  FUNC RS2
函数对数据的操作

3)J类型

6         26
 操作码    与PC相加的偏移量
 用于跳转,返回,系统陷入

3.操作类型

几种符号标记:

<- 数据传送操作
引入指令集架构 好处 指令集架构实例_R3

引入指令集架构 好处 指令集架构实例_R3 表示选择寄存器R4中内容的符号位(第零位)
引入指令集架构 好处 指令集架构实例_寄存器_03 表示选择寄存器R4中内容的24位到31位
引入指令集架构 好处 指令集架构实例_引入指令集架构 好处_04 得到一个24位全零的一个值,用于符号扩展
“##” 拼接运算符

如:

引入指令集架构 好处 指令集架构实例_指令集_05
表示R8所指的寄存器内容为地址的存储器的内容的符号位扩展到8位,然后拼接上R8寄存器所指的内容为地址的存储器内容的前8位

三.流水线结构

1.基本概念

将一个时序过程分解为若干的子过程,而且这些子过程可以并行执行的技术
虽然流水线技术并没有提高单个指令的执行速度,但增加了整个系统的吞吐率。

2.流水线的分类

有五种分类方法:

静态流水线
动态流水线
单功能的
多功能的
部件级的(处理基本运算操作)
处理机级的(指令流水线)
处理机间的(宏流水线)
线性的
非线性的(在线性基础上加反馈的)
标量处理机
向量处理机

3. MIPS流水线

MIPS指令流水线分为五个阶段:

----取指
----指令译码/读寄存器周期
----执行指令
----存储器访问
----写回

下面是MIPS的数据通路图

引入指令集架构 好处 指令集架构实例_寄存器_06


下面逐条分析:

  1. 取指(IF)

根据PC值从寄存器中取出指令,送入指令寄存器IR,然后PC值增加4,这是的PC指向了下一条指令,将这条指令的地址放入临时寄存器NPC中。
引入指令集架构 好处 指令集架构实例_R3_07
引入指令集架构 好处 指令集架构实例_寄存器_08

  1. 指令译码/读寄存器周期
    读IR寄存器,按照寄存器号读取寄存器文件,并将读出的结果放入两个临时寄存器A,B中。同时对IR寄存器的低16位进行符号扩展,将扩展后的立即数保存在临时寄存器Imm中。

引入指令集架构 好处 指令集架构实例_寄存器_09
引入指令集架构 好处 指令集架构实例_寄存器_10
引入指令集架构 好处 指令集架构实例_寄存器_11

  1. 执行/有效地址计算周期(EX)
    寄存器访问: ALU <- A + Imm
    寄存器-寄存器ALU: ALU <- A op B
    寄存器-寄存器ALU: ALU <- A op Imm
    分支操作: ALU <- NPC + Imm
    Cond <- (A op 0)
  2. 访存/分支操作完成周期(MEM)
    访存操作:
    LOAD: LMD <- LMDMEM[ALU]
    STORE: Mem[ALU] <- B
    分支操作:

if (Cond)PC <- ALU
else
PC <- NPC

  1. 写回(WB)
    寄存器-寄存器型ALU指令:
    引入指令集架构 好处 指令集架构实例_引入指令集架构 好处_12
    寄存器-寄存器型ALU指令:
    引入指令集架构 好处 指令集架构实例_指令集_13
    寄存器-寄存器型ALU指令:
    引入指令集架构 好处 指令集架构实例_R3_14

4. 流水线性能分析

(1)吞吐率
定义:单位时间内流水线完成的指令个数或输出的数据数量
设实际吞吐率TP,m段流水线,已经完成n个任务

最大吞吐率TPmax,指流水线达到稳定状态的吞吐率。
如果每段的流水线执行时间相同,设时间△t0:
引入指令集架构 好处 指令集架构实例_指令集_15
如果各段时间不等,设最大的段执行时间t0,则
引入指令集架构 好处 指令集架构实例_寄存器_16
可以得出结论:流水线的最大吞吐率与流水线中执行时间最慢的一段时间有关,这一段成为流水线的瓶颈

消除瓶颈的方法:
-----细分瓶颈段

将耗时最长的段继续分段

-----重复设置瓶颈段

对这个瓶颈段重复并行的设置,如第一个周期进入第一个段,第二个周期
进入第二个段,依次类推
设置流水段3为瓶颈段



时钟周期1


时钟周期2


时钟周期3


流水段1

流水段3

流水段3

流水段4

流水段3

流水段3


实际吞吐率
设各段执行时间相同△t0,完成时间
引入指令集架构 好处 指令集架构实例_指令集_17
引入指令集架构 好处 指令集架构实例_指令集_18

(2)加速比
定义:实现相同功能的流水线速度与非流水线速度的比
按照流水段的运行时间等长计算:
引入指令集架构 好处 指令集架构实例_引入指令集架构 好处_19

引入指令集架构 好处 指令集架构实例_R3_20

引入指令集架构 好处 指令集架构实例_指令集_17

引入指令集架构 好处 指令集架构实例_指令集_17

引入指令集架构 好处 指令集架构实例_寄存器_23

(3)效率
定义:流水线的利用率,涉及两个时间:通过时间和排空时间。
通过时间:第一条指令通过流水线的时间
排空时间:最后一条指令通过流水线的时间
整个流水线的效率:
引入指令集架构 好处 指令集架构实例_R3_24
当n远大于m时,E趋近于零。

5. 限制流水线性能的几个相关

数据相关:需要数据的定向,编译器的调配
结构相关:需要增加更多的硬件资源,如寄存器资源
控制相关:分支操作,判断,转向