第1章 量化设计与分析基础
1. 计算机的分类类别

2. 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素
- ISA(指令集结构): 硬件与软件之间的接口
用途:
开发者与硬件之间的接口
这代芯片与下一代芯片的合同

3. 实现技术的趋势:技术发展的趋势
- 摩尔定律(Moore Law)
1965年,他预测工业界集成在一个计算机芯片上的元件数量每年翻一番。 1975年,他更新预测为每两年翻一番 - 性能趋势: 带宽改进优于时延
带宽/吞吐量 : 在给定时间完成的工作总量
时延/响应时间: 一个事件从开始到完成的时间
4. 集成电路功耗的趋势:功耗的概念
- 定义一:功率的损耗,指设备、器件等输入功率和输出功率的差额。功率的损耗
- 定义二:功耗同样是所有的电器设备都有的一个指标,指的是在单位时间中所消耗的能源的数量,单位为W
5. 可靠性:提高可靠性的方法
- 冗余(Redundancy)
- 时间冗余:重复操作直到无错
- 资源冗余:配置另外的相同部件,有错时用于替代出错部件
6. 测量、报告和总结计算机性能:计算机主要性能指标
- CPU时间(设计者感觉到的CPU速度)
- 吞吐量(单位时间内完成的工作总量)
- MIPS(Millions of Instructions per Second,用不同的指令集来比较MIPS是不公平的)
7. 计算机设计的量化原则:Amdahl定律


第2章 指令系统原理与示例
1. 指令集系统结构的分类:指令集系统的不同结构
- 指令集体系结构按照处理器内部数据的存储类型不同,可以分为如下几种:
堆栈体系结构:操作数隐含地位于栈顶
累加器体系结构:累加器即为隐含的操作数
通用寄存器体系结构:明确指定操作数,要么是寄存器,要么是存储器地址
2. 存储器寻址:大小端模式及地址对齐
-
大端模式:数据的高字节保存在内存的低地址中,低字节保存在内存的高地址中
-
小端模式:数据的高字节保存在内存的高地址中,低字节保存在内存的低地址中
- 对于0x12345678:0x12属于高字节,0x78属于低字节

- 对于0x12345678:0x12属于高字节,0x78属于低字节
-
地址对齐
大小为 s 字节的数据,字节地址为 A,若满足 A mod s = 0,则该数据的寻址是对齐的。
3. MIPS系统结构:MIPS指令集结构
- MIPS
一种简单64位load-store系统结构
固定长度指令编码,译码简单,有利于实现高效率流水线。
使编译器更容易产生高效的目标代码。 - MIPS的寄存器
32 个 64bit 的通用寄存器(GPR),名称为 R0,R1,…,R31,也称为寄存器
32个 64bit 的浮点寄存器(FPR),名称为 F0,F1, …,F31,既可以作为 32 个单精度寄存器来使用(一半不使用),也可以作为 32 个双精度寄存器来使用
R0 的值永远置为 0 - 寻址方式
- 立即数寻址:直接在指令中放置 16 位的操作数,不需要按地址查找
- 基址寻址:存放在寄存器中的基地址,与相对该基址的一个 16 位移量相加获得。如:LW R2, 128(R3) => ((R3) + 128) -> R2
1、寄存器间接寻址:位移量置为 0
2、16 位绝对地址寻址:R0作为基址寄存器,因为 R0 恒为 0
- 指令格式
| 指令 | 31:26 | 25:21 | 20:16 | 15:11 | 10:6 | 5:0 |
|---|---|---|---|---|---|---|
| R型 | op(6) | rs(5) | rt(5) | rd(5) | shift(5) | funct(6) |
| I型 | op(6) | rs(5) | rt(5) | immediate(16) | immediate(16) | immediate(16) |
| J型 | op(6) | adress(26) | adress(26) | adress(26) | adress(26) | adress(26) |
-
R型
op:操作码,固定为 000000
rs:源操作数 1 寄存器,5bit
rt:源操作数 2 寄存器,5bit
rd:目的操作数寄存器,存储运算结果,5bit
shift:位移量,读写专用寄存器或者移位操作指定移动次数,5bit
funct:决定功能,6bit -
I型
op:操作码,决定功能,6bit
rs:源操作数寄存器,5bit
rt:目的操作数寄存器,存储运算结果,5bit
immediate:立即数/位移量,16bit,计算时要扩展到 32bit,按功能有零扩展和符号扩展 -
J型
op:操作码,决定功能,6bit
address:立即数表示的转移地址,会作为偏移量加到 PC 上,26bit
第3章 单周期MIPS处理器的设计
1. add, sub, addi, subi, lw, sw, beq, j 每条指令在单周期处理器中的执行逻辑
| 控制信号名称 | 含义 | 值为 0 | 值为 1 |
|---|---|---|---|
| RegWrite | 寄存器堆写信号 | 不写入寄存器 | 要写入寄存器 |
| RegDst | 选择目的寄存器 | rt 作为目的寄存器 | rd 作为目的寄存器 |
| M2Reg | 标识写入寄存器的数据来源 | 写入寄存器的内容来自 ALU | 写入寄存器的内容来自存储器 |
| MemRead | 存储器读信号 | 无操作 | 存储器读有效 |
| MemWrite | 存储器写信号 | 无操作 | 存储器写有效 |
| ALUSrc | ALU 源操作数选择 | 来自寄存器堆的第二个输入 | 指令低 16bit 符号扩展(immediate) |
| PCSrc | PC 源选择 | PC = PC + 4 | PC = 分支目标地址 |

- ALUop字段
| 指令 | 操作码 |
|---|---|
| 数据传输(lw、sw) | 00 |
| 分支(beq) | 01 |
| R 型指令(add、sub) | 10 |
2. 上述指令的指令编码、代码、功能以及在单周期中的数据通路,条件分支指令的地址计算、单周期各功能部件的控制信号值判断
3. 中断和异常的处理时机
-
中断
在运行过程中,如果发生某种随机事件,导致 CPU 暂停执行当前程序,转去执行为该随机事件的处理程序,处理完毕后再自动恢复原程序的执行。 -
中断的时机
中断的发生(任意性):即随机事件(外部 IO,内部故障)可能在任意时间点发生
中断的处理(完整性):当执行某条指令出现中断时,中断在指令执行过程中就可以被检测到,但会等到该指令执行完毕后(一个或者数个时钟周期),处理器才会跳转异常事件处理程序 -
中断与异常的区别
- 中断:属于系统的正常现象,系统暂停当前正在运行的程序,转向其它服务,可能是其优先级更高或者程序主动安排。这是 CPU 硬件支持的功能
- 异常:由软件错误引起的意料之外的情况,通常是开发过程中没有考虑到的程序错误
-
中断响应条件
当前发生的中断未被屏蔽
CPU 处于开中断模式
中断源优先级比当前程序优先级更高
第4章 流水线技术及指令级并行
1. 流水线的概念、分类
流水线
- 一种实现多条指令重叠执行的技术,通常包含多个流水段(Pipeline Stage,流水级、流水线),流水段之间并行使用系统中的不同组件,以最大化系统效率。
- 流水线带来的性能提高,是通过增加指令的吞吐率,而不是减少单条指令的执行时间实现的。实际应用程序通常由成千上万条指令,因此指令的吞吐率是一个很重要的参数。理想情况下(流水线各阶段操作平衡,指令数量很大),那么在流水线系统上的指令执行时间约为:
流水线指令执行时间 = 单周期系统指令执行时间 流水线级数 流水线指令执行时间 = \frac{单周期系统指令执行时间}{流水线级数} 流水线指令执行时间=流水线级数单周期系统指令执行时间
流水线分类
- 流水线按各过程段用时是否相等可分为均匀流水线和非均匀流水线两种。
- 按处理的数据类型可分为标量流水处理机和向量流水处理机两种
- 按流水线的规模可分为操作流水线、指令流水线和宏流水线。
- 按流水线完成的功能是否单一,流水线可分为单功能流水线与多功能流水线两种。
- 流水线按工作方式可分为静态流水线和动态流水线两种。
- 静态流水线:在同一时间,多功能流水线的各段按照同一种功能的连接方式工作。通常只有输入是一串相同运算任务时,才能发挥流水线的效率。如同时支持加法和乘法的流水线,不能在同一时间既运行加法任务又运行乘法任务,即使使用流水线中的空闲部件也不行,需要等流水线中加法任务完毕后再执行乘法任务
- 动态流水线:在同一时间,多功能流水线的各段可以按照不同的连接方式,同时执行多种功能
- 按照流水线的各个功能段之间是否有反馈信号,可将流水线分为线性流水线和非线性流水线。
2. 流水线的时空图及性能指标计算
- 不是所有流水线各段的时间都是相等的,我们把这种流水线中时间最长的段称为流水线的瓶颈段
吞吐率:
T
P
=
任务数
处理完
n
个任务用时
=
n
T
k
TP = \frac{任务数}{处理完n个任务用时} =\frac{n }{Tk }
TP=处理完n个任务用时任务数=Tkn
效率:
S
=
n
个任务占用的时空区
k
个流水段总时空区
=
T
0
k
∗
T
k
S = \frac{n个任务占用的时空区}{k个流水段总时空区} =\frac{T0 }{k*Tk }
S=k个流水段总时空区n个任务占用的时空区=k∗TkT0
加速比:
S
=
不使用流水线(顺序执行)所用时间
使用流水线用时
T
k
=
非流水线指令的平均执行时间
流水线指令的平均执行时间
S = \frac{不使用流水线(顺序执行)所用时间}{使用流水线用时Tk} =\frac{非流水线指令的平均执行时间 }{流水线指令的平均执行时间 }
S=使用流水线用时Tk不使用流水线(顺序执行)所用时间=流水线指令的平均执行时间非流水线指令的平均执行时间


例题:考虑一个非流水线机器。假设时钟周期是1ns,ALU操作和转移操作需要4个时钟周期,存储器需要5个时钟周期。以上操作的比例相应为40%,20%和40%。
若改为流水化,时钟周期需增加0.2ns,那么该流水线的加速比为多少?
解:先求指令平均执行时间
非流水线:指令的平均执行时间=时钟周期*平均CPI
= 1ns * ((40%+20%) * 4 + 40% * 5)
= 1 ns * 4.4 = 4.4 ns
流水线: 时钟周期变慢为1.2ns,流水线CPI=1。1.2 * 1 = 1.2ns
S = 4.4 n s 1.2 n s = 3.7 S = \frac{4.4~ns~}{1.2~ns~} = 3.7 S=1.2 ns 4.4 ns =3.7
3. add, sub, addi, subi, lw, sw, beq每条指令在5级流水线的执行过程
4. 结构冒险、数据冒险和控制冒险的判断,以及需要暂停的时钟周期数的判断(控制冒险的解决性能依赖于分支地址计算阶段和分支条件判断阶段)
结构冒险:某些指令组合在流水线中重叠执行时出现了资源冲突
- 插入暂停周期:即让流水线在完成前一条指令对存储器的访问时,暂停取后一条指令(指令存储器)的操作
- 硬件冗余:设置相互独立的指令存储器和数据存储器或设置相互独立的指令Cache和数据Cache
- 预取指令技术:在重叠操作中,在前一条指令的执行过程中,就提前取出后面的指令进行相应处理
数据冒险:指令想要的数据值还没有完成,或者值没有在正确的地方
- 暂停流水线
- 数据前推:使用专用数据通路,如转发/旁路技术(在指令未结束时,即可提前将缺少的运算项,交付给需要的指令)
- 编译优化调度,即静态调度(编译程序通过调整指令的顺序,减少流水线的冲突)
- 动态调度(用硬件方法在运行过程中调度指令的执行,以减少流水线冲突)
控制冒险:转移指令会使后续指令不能进入流水线执行
- 阻塞:效率太低
- 分支决策提前:加入足够多的硬件使得在流水线的第二级ID级能测试寄存器、计算分支地址并更新PC,可以将分支预测错误的代价减少到只有一条指令(即分支执行时正在取的那条指令)
- 预测分支不发生:默认按照流水线方式执行,如果最终发生了分支,则移除流水线中的指令,重新执行
- 动态分支预测技术:根据程序已执行的指令,进行动态预测,并根据历史预测记录调整当前预测结果,使得准确率足够高
- 延迟转移:延迟分支指令顺序执行下一条指令,在一条指令延迟之后再开始执行分支
5. 结构冒险、数据冒险和控制冒险的解决办法
- 见上文
6. 流水线中处理中断和异常的方法
| 阶段 | 可能产生的异常类型 |
|---|---|
| IF | 取指时发生缺页;存储器访问边界未对齐;违反了存储器访问权限 |
| ID | 未定义的或非法操作码 |
| EX | 算术异常 |
| MEM | 存取数据时缺页;存储器访问边界未对齐;违反了存储器访问权限; |
| WB | 无 |
处理方法
- 第一步:强制一个trap指令进入流水线
- 第二步:关掉出错指令及后面指令的所有写操作,直到trap指令开始执行
这避免了后续指令改变机器出错时的状态 - 第三步:当trap指令开始执行,唤醒OS ,OS保存出错指令的PC值
- 第四步:OS试图修复异常,然后重新执行出错指令
重新取出错指令的地址送给PC
重新执行出错指令
7. 记分牌动态调度算法、Tomasulo动态调度算法
第5章 存储系统
1、存储器的分类和主要特点
存储器分类
- 半导体存储器
静态随机存储器 — SRAM
动态随机存储器 — DRAM
闪存 — Flash Memory - 磁表面存储器
- 光盘存储器
2、Cache的三种映像关系:全相联、直接映像、组相联
- 直接映像 Direct mapped
块只能放在Cache中唯一的位置 - 全相联 Fully associative
块可以放在Cache中的任意位置 - 组相联 Set associative
块能够放在Cache一组中任意一块位置,如果一组有n块,则Cache称为n路组相联
3、主存地址Tag、Index、块内偏移三个字段的计算

4、Cache块的替换策略
- 先进先出
- LRU
- FIFO
5、Cache的读写过程
写策略
- 写直达(write-through cache):数据写cache的同时也写主存
Cache中的数据可以随时丢弃——主存中有最新的数据
Cache 控制位:只需要一位 valid bit- 优点: 主存(或其他处理器)总是有最新的数据,保持了数据一致性,实现简单。
- 写回(write-back cache):数据写cache时不写主存
不能丢弃cache中的数据——可能需要写回到主存
Cache 控制位:需要 valid位 (是否包含有效信息)和dirty 位(是否被修改过)- 优点: 写cache的速度更快,主存带宽更低,因为对同一块的多次写仅需要对主存写一次
写缺失策略
对cache进行写时,如果要写的块不在cache,有两种策略选择:
- 写分配(Write allocate)
写失效时,把所写单元所在的块调入Cache,然后再进行写命中操作。这与读失效类似。 - 不按写分配 Write around (no write allocate)
写失效时,直接将值写入下一级存储器而不将相应的块调入Cache。
写的值不在cache中。
通常
写直达caches采用不按写分配。
写回caches采用写分配;
6、平均访存时间和CPU时间的计算
平均访存时间

- 注意混合cache在访问(命中)数据时多加一个时钟周期就好。

CPU时间

7、Cache失效率的类别,以及每种失效率的解决方法有哪些
- 强制性失效(首次访问失效):当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效。这种失效也称为首次访问失效。
解决方法- 可以增加块的大小
- 容量失效(Capacity Miss):如果Cache容纳不了一个程序执行所需要的所有块,将会发生容量失效(还会发生强制失效),某些块将被丢弃,随后再被调入。
解决方法- 增大cache容量
- 冲突失效(Conflict Miss):在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则某一个块被放弃,之后再重新调入,这时发生了冲突失效。
解决办法- 组相联,增加相联度,如从2路增大到8路组相联,采用相联度超过8的方法实际意义不大
- 只要采用全相联,就不会发生冲突失效
- 采用编译器优化来统一降低失效率:无需修改硬件、利用编译器对指令程序、数据重排序就可以减小缺失率
本文介绍了计算机的分类、设计任务与发展趋势,重点讨论了指令集结构,包括MIPS指令系统。此外,文章涵盖了功耗、可靠性提升方法、计算机性能测量以及单周期处理器的设计。还深入探讨了流水线技术、指令级并行,以及存储系统的概念,如Cache的工作原理和存储器分类。
2180

被折叠的 条评论
为什么被折叠?



