Chapter1

虚拟机

抽象的计算机,由软件实现,与实际机器一样有指令集并使用不同的存储区域

Flynn分类法

按照指令流和数据流的多倍性特征对计算机系统进行分类

指令流:机器执行的指令序列
数据累:由指令流调用的数据序列, 含输入数据和中间结果
多倍性:在系统性能瓶颈部件上同时处于同一执行阶段的指令或数据的最大可能数

冯氏分类法与最大并行度

最大并行度:计算机系统在单位时间能处理的最大二进制位数

Amdahl’s Law

系统中某一部件由于采用某种更快的执行方式后整个系统性能的提高,与这种执行方式的使用频率或占用总执行时间的比例有关
$$系统的加速比 = \frac{改进后性能}{改进前性能} = \frac{改进前总执行时间}{改进后总执行时间}$$
$$F_e = \frac{可改进部分占用的时间}{改进前总时间} < 1, S_e = \frac{改进前改进部分时间}{改进后改进部分时间} > 1 $$
改进后整个任务的执行时间为:$$T_n = T_0(1 - F_e + \frac{F_e}{S_e})$$
原因:改进后整个任务时间=未改进部分时间+改进部分时间,同时除以改进前总时间,则为$$1 - F_e + \frac{改进部分时间}{改进前总时间}$$, 分式上下同时除以可改进部分时间, 得$\frac{\frac{1}{S_e}}{\frac{1}{F_e}} = \frac{F_e}{S_e}$
则加速比为$$S_n = \frac{T_0}{T_n} = \frac{1}{(1 - F_e) + \frac{F_e}{S_e}}$$

CPU性能公式

$$T_{CPU} = N_c \times t = \frac{N_c}{f}$$
$$CPI = \frac{N_c}{I_c}$$
$$T_{CPU} = I_c \times CPI \times t = \frac{I_c \times CPI}{f}$$
即CPU性能与时钟频率$f$,$CPI$,$I_c$, 因此提升CPU性能的两种方式即提升$CPI$或提升$I_c$

性能评测

执行时间和吞吐率作为重要因素

并行性

并行处理分为数据处理的并行与指令执行的并行
途径包括

  • 时间重叠——多处理过程轮流重叠使用设备的各个部分,加快硬件周转
  • 资源重复——重复设置硬件资源
  • 资源共享——使多个任务按照一定时间顺序轮流使用同一套设备

紧耦合

又叫直接耦合,物理连接频带高,总线/高速开关互联,可共享主存

松耦合

又叫间接耦合,可共享外存/外设,机器的相互作用在文件或数据集一级上进行

RISC MIPS 指令系统 PowerPC

流水寄(锁)存器

流水线每个功能部件后有一个缓冲寄存器或锁存器,在相邻的两端之间传输数据

定向传送技术

定向硬件检测到前面某条指令的结果寄存器就是当前指令的源寄存器时,控制逻辑会将前面那条指令的结果直接从其产生的地方定向到当前指令所需的位置

RISC结构特征

  • 大多数指令在单周期内完成
  • LOAD/STORE结构
  • 硬布线控制逻辑
  • 减少指令和寻址方式种类
  • 固定指令格式
  • 注重编译优化

MIPS指令格式

  • 指令均为32位
  • 操作码占6位
  • 3类基本指令
    • I类指令: OP(6) + RS(10) + RT(15) + immediate(32)
    • R类指令: OP(6) +
    • J类指令: OP(6) + OFFSET

Chapter 3

保持异常行为

无论怎么改变指令的执行顺序,都不能改变程序中异常的发生。

数据流

指数据值从其生产者指令到其消费者指令的实际流动。

动态调度

在程序的执行过程中,依靠专门硬件对代码进行调度,减少数据相关导致的停顿。

记分牌方法

记分牌硬件维护三张表,分别用于记录指令的执行状态、功能部件状态,寄存器状态以及数据相关关系。
把ID段分成两个段: 流出和读操作数;允许多条指令同时处于执行段。记分牌全面负责和管理这指令的流出和执行,也包括检测所有的冲突。
在没有资源冲突时,尽可能早地执行没有数据冲突的指令。如果某条指令被暂停,而后面的指令与流水线中正在执行或被暂停的指令都不相关,那么这些指令就可以跨越它们,继续流出和执行下去。
流出: 如果存在结构相关或WAW冲突,那么指令不流出,解决了WAW冲突。
读操作数: 如果所有前面已流出且还在执行的指令都不对该寄存器写操作,则该寄存器的数据是可用的,
执行: 取到操作数后,功能部件开始执行。当产生结果后,通知记分牌。
写结果: 记分牌一旦指定执行部件完成,检测是否存在WAR冲突

  • 如果不存在不存在WAR冲突,或者原有的WAR冲突已消失,记分牌就通知功能部件把结果写入目的寄存器,并释放该指令所使用的所有资源。
  • 如果检测到WAR冲突,就不允许该指令将结果写到目的寄存器,这发生在以下情况。

指令状态表: 记录正在执行的各执令到达哪一段
功能部件表: 记录各个功能部件的状态

  • Busy: 忙标志
  • Op: 该功能正在执行或将要执行的操作
  • Fi: 目的寄存器编号
  • Fj/Fk: 源寄存器编号
  • Qj/Qk: 指出向源寄存器Fj/Fk写数据的功能部件
  • Rj/Rk: 标志位

Tomasulo

核心思想: 记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小,通过寄存器换名来消除WAR冲突和WAW冲突。
保留站: 保存一条已经流出并等待到本功能部件执行的指令。
公共数据总线CDB: 所有功能部件的计算结果都是送到CDB上
寄存器换名: 通过保留站和流出逻辑来共同完成,当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识。
指令流出到保留站后,其操作数寄存器号或者换成了数据本身,或者换成了保留站的标识,不再与寄存器有关系。
特点:

  • 冲突检测和指令执行控制是分布的。
  • 计算结果通过CDB直接从产生它的保留站传送到所有需要它的功能部件,而不用经过寄存器。

优点:

  • 冲突检测逻辑是分布的
  • 消除了WAW冲突和WAR冲突导致的停顿

动态分支预测技术:

在程序运行时,根据分支指令过去的表现来预测其将来的行为
分支历史表BHT: 采用两位二进制来记录历史,11,10分支预测成功,01,00分支预测不成功
分支目标缓冲器BTB: 将分支成功的分支指令的地址和分支目标地址都放到缓存区中保存

基于硬件的前瞻执行

对分支指令的结果进行猜测,并假设总是对的,按猜测结果继续取、流出、执行。执行结果不写回到寄存器或存储器,而是放到一个称为ROB的队列缓冲器,等到相应指令得到确认后才写入寄存器或存储器。
关键思想: 允许指令乱序执行,但必须顺序确认
ROB主要由: 指令类型,目标地址,数据值字段,就绪字段组成。

熔断和幽灵漏洞

如果处理器猜错了,被错误抓取的数据也会存储在Cache中,也称为"旁路分析利用"漏洞,利用乱序/前瞻执行技术,破坏了内存隔离机制,使恶意程序可越权访问操作系统内存数据,造成敏感信息泄露。

多指令流出技术

一个时钟周期内流出多条指令
两种基本风格:

  • 超标量
    • 在每个时钟周期流出的指令条数不固定
    • 可用通过编译器进行静态调度,也可通过基于Tomasulo算法动态调度
  • 超长指令字VLIW
    • 在每个时钟周期流出固定数量指令,指令构成一条长指令或者指令包
    • 指令包中,指令之间的并行性通过指令显式表示
    • 指令调度是由编译器静态完成的。

基于动态调度的多流出技术

扩展Tomasulo算法,支持双流出超标量。每个时钟周期流出两条指令,一条是整数,另一条是浮点。
性能受限因素:

  • 整数部件和浮点部件的工作负载不平衡,没有充分发挥浮点部件作用
  • 每个循环迭代中的控制开销太大
  • 控制相关使得处理机必须等到分支指令的结果出来才能开始下一条L.D指令执行。

流水的异常处理

精确异常: 如果发生异常时,处理机的现场跟严格按程序顺序执行时指令i的现场相同。
不精确异常: 当执行指令i导致发生异常时,处理机的现场与严格按程序顺序执行时指令i的现场不同。
乱序会大大增加异常处理的复杂度,对于一条会产生异常的指令,只有当处理机确切知道该指令将被执行时,才允许它产生异常。

超长指令字技术(VLIW)

存在的问题:

  • 代码长度增加
  • 采用锁步机制
  • 机器代码不兼容性

超流水线处理机

将每段流水进一步细分,在一个时钟周期内能够分时流出多条指令。
对于一台一台每个时钟周期能流出n条指令的超流水线计算机来说,这n条指令不是同时流出的,而是每隔1/n个时钟周期流出一条指令。