《计算机系统结构》 课程复习 Note

image-20230606020658635

计算机系统结构基本概念

image-20230606015654723

image-20230612010839685

image-20230612010848209

提高并行性的技术途径时间重叠 资源重复 资源共享

程序执行的极大值影响算术平均值极小值影响调和平均值

image-20230612011200470

指令系统的设计

image-20230606021704584

区别不同指令系统的主要因素 CPU用来存储操作数的存储单元类型

image-20230606124530049

image-20230606124539376

image-20230606124550087

表示操作数类型 / 寻址方式① 编码到操作码中 ② 设置额外字段硬件标识 / 地址描述符

image-20230606125203483

image-20230606024539351

流水线技术

定位方式直接定位方式装入主存之前静态定位装入主存时动态定位执行过程中

image-20230606163105726

时空图横轴纵轴通过时间排空时间T=(n+k-1)t

连接图输入->流水段1->流水寄存器->流水段2->流水寄存器->输出

静态与动态流水线都是多功能流水线分类标准为在同一时间内多功能流水线中的各段是否可以按照不同的方式连接同时执行多种功能

吞吐率单位时间内流水线完成的任务数量TP = n个任务/完成n个任务的时间T

image-20230606184811141

解决瓶颈问题细分瓶颈段或者重复设置瓶颈段

加速比完成同样一批任务不使用流水线所用的时间与使用流水线所用的时间之比表面上看流水线级数越多越好

image-20230606185149575

效率是指流水线的设备利用率在时空图上流水线的效率定义为n个任务占用的时空区与m个功能段总的时空区之比

做分析题的时候Slides 两道例题注意是静态流水还是动态流水线


线性与非线性流水线根据流水线中是否存在反馈回路前者可以被连接图唯一表示后者需要被连接图和预约表共同表示单功能非线性流水线的调度预约表横向向右是时间一般用时钟周期表示纵向向下是流水线的段引起非线性流水线冲突的启动距离称为禁止启动距离向一条非线性流水线的输入端顺序输入两个任务之间的时间间隔称为启动距离/等待时间 不发生冲突的启动距离一般是一个循环数列称为非线性流水线的启动循环记作17 启动距离5也可以认为是一个循环数列称为非线性流水线的恒定循环记作5 流水线调度目的找出一个最小启动循环按照这周期向流水线输入新任务流水线的各个功能段都不会发生冲突而且流水线的吞吐率和效率最高

image-20230606191658288

image-20230606192137601

下面是单功能非线性流水线调度算法

①由预约表得到禁止集合将预约表中的每一行中任意两个×之间的距离都计算出来去掉重复的由这些数形成禁止集合 如 {2,4,6}

② 由禁止集合得到冲突向量 冲突向量用一个m位的二进制数表示其中m是禁止向量中的最大值一般格式为 C=CmCm-1…Ci…C2C1

③ 由冲突向量构造调度流水线的状态图将冲突向量C作为初始冲突向量送入一
个m位逻辑右移移位器移位m次n 若移出的是0用移位器中的值与初始冲突向量作按位或运算得到一个新的冲突向量n 若移出的是1不作任何处理将中间形成的每一个新的冲突向量同样处理画出状态图

④ 在状态图中找出可用启动距离并计算平均启动距离在状态图中从初始状态出发能构成一种间隔拍数呈周期性重复的方案就是可用启动距离

⑤找出平均启动距离最小的启动循环或恒定循环

流水线最小平均启动距离的限制范围① 下限是预约表中任意一行里×的最多个数理想最小平均启动距离理想最小启动循环一般恒定循环作为最小启动循环 最小平均启动距离的上限是冲突向量中1的个数再加上1

采用预留算法来调度非线性流水线可以达到最优调度核心思想通过插入非计算延迟段——修改预约表实现最小启动循环每一行中与第1个×的距离为2的倍数的位置都要预留出来


指令相关两条指令之间存在某种依赖关系分为数据相关真数据相关RAW名相关反相关 WAR输出相关 WAW控制相关

流水线冲突结构冲突Stall+Bubble数据冲突bypassing 定向技术编译器调度控制冲突3种通过软件编译器来减少分支延迟的方法对分支的处理方法在程序的执行过程中始终是不变的是静态的保证分支结果出来之前不能改变处理机的状态①预测分支失败 ②预测分支成功 ③ 延迟分支

流水线最佳段数的选择平衡流水线深度与造价PCR=最大吞吐量 / 流水线价格求极大值点

数据级并行 向量处理机

image-20230607135733233

向量平衡点为了使向量硬件设备和标量硬件设备利用率相等一个程序中向量代码所占的百分比向量代码:标量代码运算速度比

存储器-存储器型结构纵向处理方式采用利用几个独立的存储器模块来支持向对独立的数据并发访问解决数据访问冲突① 将存储器个数选为质数且大于等于向量长度 ② 在运算流水线的输入端和输出端增加可变缓冲器

寄存器-寄存器型结构分组处理方式采用构造一个具有所要求带宽的高速寄存器实现高速寄存器与主寄存器之间的快速数据交换

image-20230607161526564

CRAY-1 向量处理冲突并行工作的各向量指令的源向量或结果向量使用了相同的Vi或并行工作的各向量指令要使用同一个功能部件

下面是一些提高向量处理机性能的常用技术① 设置多个功能部件. ② 向量流水线冲突分析指令不相关时可以并行执行功能部件冲突源寄存器冲突结果寄存器冲突都需要避免③ 向量流水线链接技术具有先写后读相关的两条指令不出现功能部件冲突和源向量冲突的情况下可以把功能部件链接起来进行流水处理结果寄存器可作为后继指令的操作数寄存器

image-20230607163536126image-20230607163548423

image-20230607163749897

image-20230607163758252

④ 分段开采技术当向量的长度大于向量寄存器的长度时必须把长向量分成长度固定的段然后循环分段处理每一次循环只处理一个向量段先处理余数部分然后对剩下的部分分组处理

⑤ 向量的条件执行可以使用屏蔽向量的方式来完成条件执行

下面介绍衡量向量处理机性能的主要参数

① 向量指令的处理时间 Tvp如果不考虑Ts定义启动时间 Tstart = Tvf - 1

image-20230607164945744

进而我们考虑一组向量指令的处理时间把能在同一个时钟周期内一起开始执行的几条向量指令称为一个编队同一个编队中的向量指令之间一定不存在流水向量功能部件的冲突和数据的冲突编队后这个向量指令序列的总的执行时间为各编队的执行时间的和编队时考虑无冲突如果可链接则链接

编队后单个编队的启动时间为编队内所有指令的启动时间的最大值记为 $T^{i}_{\text{start}}$所有编队的总运行时间为 $\sum_i T^{i}_{\text{start}} + m n$这里 m 表示 m 个编队n 是向量长度

image-20230607171010474

然后我们再进一步考虑支持分段开采下的一组向量指令的处理时间设 n = p * MVL + q这里 MVL 为向量寄存器长度p 为商 q 为余数由于我们需要对分段开采时引入额外的处理操作我们假设这个额外的处理时间为 Tloop于是余数处理的时间为

image-20230607172532619

image-20230607172549901

② 最大性能 $R_{\infin}$表示当向量长度为无穷大时向量处理机的最高性能也称为峰值性能.

image-20230607174800240

③ 半性能向量长度 $n_{1/2}$半性能向量长度是指向量处理机的性能为其最大性能的一半时所需的向量长度评价向量流水线的建立时间对性能影响

④ 向量长度临界值 $n_v$对于某一计算任务而言向量方式的处理速度优于标量串行方式处理速度时所需的最小向量长度

降低指令延迟 存储系统

image-20230607183641564

先注意一手每条指令 1+m 次存储器访问其中 m 是给 L/S 指令的

性能参数① 命中率 H = N1 / (N1 + N2)平均访问时间 T = H x T1 + (1-H) x T2② 访问效率 e = T1 / (H * T1 + (1-H) * T2) 提升效率的方法提高命中率 H降低阶差 T2/T1③ 缺失开销 $T_M = T_2 + T_B$从下层访存时间 + 数据传输时间$T_A = T_1 + (1-H) T_M$.

image-20230607185746736

image-20230607185736329

Cache 所要研究的内容映像规则查找算法替换算法写策略

Cache 的性能分析

$$T_\text{CPU} = \text{IC} \times (\text{CPI}_\text{exec.} + 每条指令的平均访存次数 \times (1-H) \times T_M) \times T_\text{cycle} $$

Cache 对于低 CPI高时钟频率的 CPU 来说更加重要

$T_A = T_1 + (1-H) T_M$ 分析可知提高 Cache 性能可以 (a) 降低缺失率 (b) 减少缺失开销 © 减少命中时间

三种缺失类型强制性缺失大的 Cache block容量缺失冲突缺失Higher associativity

容量为 N 的直接映象 Cache 的缺失率和容量为 N/2 的两路组相联Cache的缺失率差不多相同

使用两级 Cache减少缺失开销

  • 平均访存时间 = 命中时间L1+缺失率L1×命中时间L2+缺失率L2×缺失开销L2
  • 局部缺失率=该级Cache的缺失次数/到达该级Cache的访问次数
  • 全局缺失率=该级Cache的缺失次数/CPU发出的访存的总次数
  • 每条指令的平均访存停顿时间= 每条指令的平均缺失次数L1×命中时间L2+每条指令的平均缺失次数L2×缺失开销L

image-20230612123723477

image-20230612123730890

image-20230612123738715

然后是如何编写 Cache 友好的代码缺失率分析交换顺序分组

指令级并行 硬件方法

image-20230608172414539

指令集并行的硬件方法或者软件方法都是围绕着提升理想 CPI解决数据冲突与控制冲突这些事情而展开的

image-20230608153303759

代码变换与指令调度必须保持的两个关键属性数据流和异常行为不变

动态调度中将译码阶段分成发射检测结构冲突读操作数检测数据冲突两个阶段进入动态调度后会存在 WAW 和 WAR 相关的问题同时动态调度还需要考虑异常是否精确的问题下面介绍两种动态调度算法

① **记分牌调度算法**我们需要维护三张表指令执行状态表功能部件状态表结果寄存器状态表

image-20230608160415896

下面是算法的流程

  • 发射阶段当 功能部件可用 且 不存在 WAW 冲突 时可以发射发射需要修改指令状态表的单元格部件状态表的一整行Rj Rk 表示是否 ready如果不 ready 需要在 Qj Qk 填写等待的功能部件的名字Fi 表示目的寄存器和结果寄存器的单元格填写部件名字
  • 读操作数阶段当 两个操作数都已经就绪Rj == yes & Rk == yes时读取修改操作数就绪状态为 no并且清空对应的 Qj 和 Qk只修改功能部件状态表
  • 执行阶段等待功能部件执行结束
  • 写结果阶段当 不存在 WAR 冲突对于其它功能部件中的指令Rj/Rk 为 yes且 Fj/Fk 为待写入的 Fi 时可以进入此时需要清空结果寄存器状态表中结果寄存器和功能部件的对应关系清除功能部件状态表中的对应行将 Busy 置为 no并通过广播将等待该功能部件结果的结果就绪状态 Rj/Rk 设为 yes检查功能部件表的其他行将 Qj/Qk 为本部件的 Rj/Rk 设置为 yes

我们还可以通过寄存器重命名的方式来解决 WAR 相关和 WAW 相关引入显式动态寄存器重命名机制设置 ARF 和 PRF 并维护它们之间的映射表这就有了显式动态寄存器重命名的记分牌调度算法修改结果寄存器状态表为 ARF - PRF 映射表

image-20230608171844980

② **Tomasulo 调度算法**我们首先介绍一些这个调度算法引入的硬件架构

(a) 保留站每个保留站中保存若干条已经发射并等待到本功能部件执行的指令的相关信息在一条指令发射到保留站的时候如果该指令的源操作数已经在寄存器中就绪则将之取到该保留站中如果操作数还没有计算出来则在该保留站中记录将产生这个操作数的保留站的标识功能部件我们引入公共数据总线CDB来承接所有功能部件的计算结果由这条总线将结果广播到所有等待操作数的保留站中

(b) Load/Store 缓冲器Load 缓冲器记录有效地址分量正在进行的 Load 访存地址和已经完成的 Load 结果等待广播Store 缓冲器记录有效地址分量正在进行的 Store 目标地址保存地址和数据直到存储部件接收

在 Tomasulo 算法中寄存器换名是通过保留站和发射逻辑共同完成当指令发射时如果其操作数还没有计算出来则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识使用一个寄存器状态表来记录某个寄存器是否正在等待被某个执行部件写不然直接换成数据本身和寄存器脱离了关系因此称为隐式寄存器重命名这使得 Tomasulo 算法的冲突检测和指令执行控制是分布的

image-20230608174827286

我们再详细展开一下 Tomasulo 调度算法的过程与上面的记分牌算法作对比我们共有三个阶段

  • 发射阶段指令在 有空闲保留站 时可以发射修改指令状态表保留站记录行如果值 Ready 直接放入 Vj / Vk不然在 Qj / Qk 中记录功能部件名目标寄存器状态表对于 Load 和 Store 指令将保留站的 A 字段设置为偏移立即数
  • 执行阶段如果 Qj / Qk 均为空则可进入执行阶段Load / Store 命令除了这个条件之外还需要在处于缓冲队列头部时才进入执行阶段将 A 此时替换成有效地址
  • 写回阶段将结果广播到 CDB 进而影响 (a) 所有的保留站对任意 Qj / Qk 为当前 FU将 Qj / Qk 置空并将结果填入到 Vj / Vk (b) 目标寄存器将值写入目标寄存器并释放目标寄存器状态表的表项 © 释放当前保留站的该指令记录项

由于这两种动态调度方式都是顺序发射乱序执行乱序提交很难实现精确异常因此我们再引入 ROB 设计以允许顺序提交的出现

image-20230608182632174

我们用 ROB 表来替换指令运行状态表注意这里原来在保留站中记录的部件名在寄存器结果状态中记录的部件名全都换成了 ROB_IDX

image-20230608182727962

指令级并行 软件方法

image-20230608134402068

基本的指令调度使用 delay slot调换指令顺序注意修改偏移量

上述基本的指令调度不能跨越基本块分支指令不能提升有效操作非控制循环和解决数据相关等待用比例因此我们采取循环展开的方式这是开发循环级并行的有效方法具体来说我们把循环体的代码复制多次并按顺序排放然后进一步消除名相关进而调整循环的结束条件

image-20230608134928763

全局展开① 注意原来 else 分支的数据相关 ② 将分支汇总的指令可以复制两份到两个不同分支中然后删除原来的指令或是调度到分支之前

静态多指令流出VLIW技术把同时流出的或者满足特定约束的一组操作打包在一起得到一条更长的指令在VLIW处理器中相关检测和指令调度工作全部由编译器完成

互连网络

image-20230606211636255

互连网络开关元件按一定拓扑结构控制方式构成的网络以实现计算机系统内部多个处理机或多个功能部件间的相互连接三大要素互连结构开关元件控制方式

互连函数置换函数或排列函数通过数学表达式建立输入端号与输出端号的连接关系即在互连函数f的作用下输入端x连接到输出端f(x)$n =\log_2N$ 位二进制来表示N个输入端和输出端的二进制地址

介绍几种常用的基本互连函数及其主要特征

① 恒等函数 $I(x_3x_2x_1x_0) = x_3x_2x_1x_0$.

② 交换函数 $\text{Cube}_1 (x_2x_1x_0) = x_2 \overline x_1 x_0$.

③ 均匀洗牌函数 $\sigma$即把输入端的二进制编号循环左移一位超函数和子函数分别用 $\sigma^{(k)}$$\sigma_{(k)}$ 表示表示对高 $k$ 位或者低 $k$ 位做一次循环左移逆均匀洗牌函数 $\sigma^{-1}$

② 与 ③ 可以组成混洗交换函数

④ 蝶式函数 $\beta$把输入端的二进制编号的最高位与最低位互换位置超函数与子函数

⑤ 反位序函数 $\rho$将输入端二进制编号的位序颠倒过来求得相应输出端的编号

⑥ 移数函数 $\alpha_{±k}(x) = (x ± k) \mod N$.

⑦ PM2I 函数$\text{PM2}_{±i} = (x ± 2^i ) \mod N$.

互连网络的结构参数网络规模网络中结点的个数N结点度 d结点距离两个结点间距离的最小值网络直径 D最大结点距离等分宽度 b

评估互连网络性能的两个基本指标时延和带宽

互连网络通常可以分为两大类① 静态互连网络各结点之间有固定的连接通路且在运行中不能改变的网络 ② 动态互连网络由交换开关构成可按运行程序的要求动态地改变连接状态的网络

下面介绍几种静态互连网络

① 线性阵列端节点 d=1其余结点 d=2直径 D=N-1等分宽度 b=1

② 环d=2b=2, 单向环 D=N双向环 D=N/2带弦环度为 k 就隔 k 个位置全连接d=N-1D=1

③ 循环移数网络一般地如果 $| j-i|=2^r, r= 0,1,\cdots, \log_2 N$则结点i与结点j连接这里结点度 d = 2n -1直径 D=n/2网络规模 $N=2^n$

⑥ 网格形一个由 $N=n^k$ 个结点构成的 $k$ 维网格形网络每维 $n$ 个结点的内部结点度 $d=2k$网络直径 $D=k(n-1)$如果 k =2则平面网格 d=4, D=2n-2, b=n规模为n×n的Illiac网络d=4, D=n-1, b=2n环网形d=4, D=2*floor(n/2), b=2n.

⑦ 超立方体n-立方体中结点的度都是n直径也是n等分宽度为 $b=2^{n-1}$.

image-20230606225658604

动态互连网络总线网络交叉开关网络多级互联网络n输入 x n输出的开关合法状态 $n \times n$置换连接 $n!$

image-20230606232915782

多级立方体网络 N 输入$\log_2 N$ 级别每级有 N/2 个 2x2 开关需要 $\log_2 N \times N /2$ 个 2x2 开关STARAN 网络 / Omega 网络(a) 4 组 2 元交换 (b) 2 组 4 元交换 © 1 组 8 元交换.

image-20230606233150199

消息传递机制当源结点和目的结点之间没有直接的连接时消息需要经过中间的结点进行传递寻径就是用来实现这种传递的通信方法和算法有的称之为路由

多处理机

根据存储器的组织结构 把现有的 MIMD 机器分为两类

  • 集中式共享存储器结构SMPUMA
  • 分布式存储器多处理机NUMA

我们介绍两种存储器系统结构

  • 共享地址空间适用于分布式共享存储器系统物理上分离的所有存储器作为一个统一的共享逻辑空间进行编址
  • 独立地址空间

然后是通信机制

  • 共享存储器通信机制共享地址空间的计算机系统采用
  • 消息传递通信机制显式地传递消息分为同步和异步

对称式共享存储器系统结构采用两种方法来解决 Cache 一致性问题针对写监听协议

  • 写作废协议在处理器对某个数据项进行写入之前保证它拥有对该数据项的唯一的访问权
  • 写更新协议当一个处理器对某数据项进行写入时通过广播使其它Cache中所有对应于该数据项的副本进行更新

写作废是针对 Cache 块进行操作而写更新则是针对字或字节进行写更新协议的延迟时间较小

分布式共享存储器系统结构寻找替代监听协议的一致性协议 —— 目录协议目录一种集中的数据结构对于存储器中的每一个可以调入Cache的数据块在目录中设置一条目录项用于记录该块的状态以及哪些Cache中有副本等相关信息特点对于任何一个数据块都可以快速地在唯一的一个位置中找到相关的信息

目录协议的映像方式分为 3 类

  • 全映像目录每一个目录项都包含一个 N 位N 为处理机的个数的位向量其每一位对应于一个处理机目录项的数目与处理机的个数 N 成正比而目录项的大小位数也与 N 成正比因此目录所占用的空间与 $N^2$ 成正比
  • 有限映像目录限制同一数据块在所有 Cache 中的副本总数$O(N \log N)$
  • 链式目录用一个目录指针链表来表示共享集合当一个数据块的副本数增加或减少其指针链表就跟着变长或变短

多线程有两种实现方法

  • 细粒度fine-grained多线程在每条指令之间都能进行线程的切换从而使得多个线程可以交替执行
  • 粗粒度coarse-grained多线程线程之间的切换只发生在时间较长的停顿出现时例如第二级Cache不命中缺点减少吞吐率损失的能力有限特别是对于较短的停顿来说更是如此原因由粗粒度多线程的流水线建立时间开销造成的

同时多线程技术一种在多发射动态调度的处理器上同时开发线程级并行和指令级并行的技术在同一个时钟周期中可以发射多个线程理想情况下发射槽的利用率只受限于多个线程对资源的需求和可用资源间的不平衡同时多线程只有在细粒度的实现方式下才有意义

image-20230614012119460