Skip to content

Commit 263c021

Browse files
committed
第五章 指令级并行
1 parent b637d41 commit 263c021

10 files changed

+112
-5
lines changed
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

计算机系统结构.md

+112-5
Original file line numberDiff line numberDiff line change
@@ -383,13 +383,13 @@ TP、S、E 关系:
383383

384384
**指令集并行(ILP)**是指令间存在的一种并行性,使计算机可以并行执行两条及以上的指令。
385385

386-
开发 ILP 的途径:① 资源重复(重复设置多个部件同时执行多条指令)② 采用流水线技术使指令重叠并行执行。
386+
<u>开发 ILP 的途径:① 资源重复(重复设置多个部件同时执行多条指令)② 采用流水线技术使指令重叠并行执行。</u>
387387

388388
开发 ILP 的方法:分为硬件方法和软件方法。本章为硬件方法。
389389

390390
流水线处理机的实际 CPI:$CPI_{流水线} = CPI_{理想}+停顿_{结构冲突}+停顿_{数据冲突}+停顿_{控制冲突}$。减少停顿以提高降低 CPI、提高 IPC。
391391

392-
基本程序块:一串连续的代码除了入口和出口之外,没有其他的分支指令和转入点,称为一个**基本程序块**
392+
<u>基本程序块</u>:一串连续的代码除了入口和出口之外,没有其他的分支指令和转入点,称为一个**基本程序块**
393393

394394
循环并行性:循环的不同迭代之间存在的并行性。本章不讨论。
395395

@@ -419,9 +419,9 @@ TP、S、E 关系:
419419

420420
### 记分牌算法
421421

422-
记分牌的目标:尽早执行没有结构冲突和数据冲突的指令。
422+
<u>记分牌的目标:尽早执行没有结构冲突和数据冲突的指令。</u>
423423

424-
每条指令的执行过程分为 4 段IS 流出、RO 读操作数、EX 执行、WB 写结果。(主要考虑浮点操作,运算在浮点寄存器之间进行,不涉及 MEM 段)
424+
指令执行的步骤:每条指令的执行过程分为 4 段——IS 流出、RO 读操作数、EX 执行、WB 写结果。(主要考虑浮点操作,运算在浮点寄存器之间进行,不涉及 MEM 段)
425425

426426
- 流出:若流出指令所需的功能部件空闲,并且所有其他执行中的指令的目的寄存器与该指令不同,记分牌就向功能部件流出该指令,并修改记分牌内部的记录表。如果存在结构相关或 WAW 冲突,则该指令不流出。(<u>在流出段解决了 WAW 冲突</u>)
427427
- 读操作数:记分牌检测源操作数的可用性。一旦数据可用,它就通知功能部件从寄存器中读出源操作数并开始执行。否则就等待写完成之后再读出(锁定)(<u>读操作数段动态地解决了 RAW 冲突,并可能导致指令乱序执行</u>)
@@ -457,15 +457,122 @@ TP、S、E 关系:
457457

458458
又称公共数据总线法。通过<u>分散控制</u>,处理数据相关和乱序执行。
459459

460+
基于 Tomasulo 算法的 MIPS 处理器浮点部件主要结构:
461+
462+
- 指令队列:存放部件送来的指令,FIFO、顺序流出。
463+
- 保留站:保存流出到本功能部件执行的指令信息(包括操作码、操作数、解决冲突的信息)。每个保留站有一个标识字段,唯一地标识了该保留站。
464+
- 访存部件缓冲器:load 缓冲器和 store 缓冲器存放读/写存储器的数据或地址(类似保留站)。
465+
- 公共数据总线 CDB:重要的数据通路。所有计算结果都送到 CDB,它直接播送到各个需要的地方。多个执行部件且采用多流出的流水线中有多条 CDB。计算结果先送到 CDB 再传送到功能部件,不需要经过寄存器。
466+
- 浮点寄存器 FP:通过总线连接到各功能部件,通过 CDB 连接到 store 缓冲器。
467+
- 运算部件:浮点加法器和浮点乘法器。
468+
460469
核心思想:
461470

462471
- 记录和检测指令相关,把发生 WR 冲突的可能性减到最小。
463-
- 通过<u>寄存器换名</u>技术消除 RW 冲突和 WW 冲突。
472+
- 通过<u>寄存器换名</u>技术消除 RW 冲突和 WW 冲突:寄存器换名通过保留站和流出逻辑共同完成。当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识。当指令流出到保留站之后,其操作数寄存器号要么换成了数据本身(已就绪状态),要么换成了保留站标识,而不再与寄存器相关。这样消除了 WAR 冲突。
473+
474+
指令执行的步骤:三步。
475+
476+
- 流出:从指令队列头部取指。如果该指令操作所要求的的保留站有空闲的,则把该指令送到该空闲保留站(设为 r)。如果操作数未就绪,则进行寄存器换名。另外,进行目的寄存器预约,将其设置为接收保留站 r 的结果(相当于提前完成了写操作)。由于指令顺序流出,同一个结果寄存器的预约结果肯定是最后一条指令的,消除了 WAW 冲突。如果没有空闲保留站,指令不能留出(发生结构冲突)。
477+
- 执行:如果某个操作数未被计算出来,保留站监视 CDB,结果产生保留站立刻从 CDB 获取数据。操作数都就绪后保留站用相应的功能部件开始执行指令操作。(靠推迟执行的方法解决 RAW 冲突)load 指令执行条件是存储器部件就绪,而 store 指令执行的条件是要存入存储器的数据到达并且存储器部件就绪。
478+
- 写结果:功能部件计算完毕后将结果放到 CDB 上,等待该结果的寄存器和保留站同时从 CDB 获取数据。
479+
480+
保留站字段:
481+
482+
- Op:对源操作数进行的操作。
483+
- $Q_j,Q_k$:将产生源操作数的保留站号。0 表示操作数已就绪且在$V_j/V_k$中,或者不需要操作数。
484+
- $V_j,V_k$:源操作数的值,如`Reg[F4]​`。对于每一个操作数来说,V 或 Q 字段只有一个有效。
485+
- Busy:“yes”表示本保留站或缓冲单元正忙。
486+
- A:仅 load 和 store 缓冲器有该字段。开始先存放指令中的立即数字段,地址计算后存放有效地址。
487+
488+
![image-20210621200752388](计算机系统结构.assets/image-20210621200752388.png)
489+
490+
![image-20210621200740644](计算机系统结构.assets/image-20210621200740644.png)
491+
492+
Tomasulo 算法的优点:
493+
494+
- 冲突检测逻辑和指令执行控制是分布的(通过保留站和 CDB 实现)。
495+
- 通过寄存器换名和预约,消除了 WW 冲突和 RW 冲突导致的停顿。
496+
- 通过延迟执行解决 WR 冲突。
497+
- 保留站、寄存器组均有附加信息,用于检测和消除冲突。
464498

465499
## 动态分支预测技术
466500

501+
开发的 ILP 越多,控制相关的制约就越大:① 在 n 流出(每个时钟周期流出 n 条指令)处理机中,遇到分支指令的可能性增加 n 倍。② 根据 Amdahl 定律,机器 CPI 越小,控制停顿的相对影响越大。
502+
503+
动态分支预测技术目的:① 预测分支是否成功。② 尽快找到分支目标地址或指令。
504+
505+
动态分支预测技术需要解决的问题:① 如何记录分支的历史信息。② 如何根据这些信息预测分支去向,甚至提前取出分支目标指令。
506+
507+
### 分支历史表 BHT
508+
509+
记录分支指令最近几次的执行情况(成功或失败),并据此预测。使用两个 bit 存储历史分支信息。
510+
511+
<img src="计算机系统结构.assets/image-20210621201952952.png" alt="image-20210621201952952" style="zoom:50%;" />
512+
513+
BHT 两个步骤:
514+
515+
- 分支预测:当分支指令到达 ID 时,从 BHT 读出的信息进行分支预测。若正确就继续处理后续指令。若错误就作废预取指令,恢复现场,并从另一条分支路径重新取指。
516+
- 状态修改:修改 BHT 状态。
517+
518+
### 分支目标缓冲器 BTB
519+
520+
分支目标缓冲器 Branch-Target Buffer 作用:
521+
522+
- 将分支成功的分支指令的地址,和它的分支目标地址都放到一个缓冲区中保存。
523+
- 缓冲区以分支指令的地址作为标识,得到转移目标指令地址信息。
524+
- 在 IF 段访问 BTB,将分支的开销降为 0。
525+
526+
<img src="计算机系统结构.assets/image-20210621202833308.png" alt="image-20210621202833308" style="zoom: 50%;" />
527+
528+
<img src="计算机系统结构.assets/image-20210621202935476.png" alt="image-20210621202935476" style="zoom:50%;" />
529+
530+
| 指令在 BTB 中? | 预测 | 实际情况 | 延迟周期 |
531+
| --------------- | ---- | -------- | -------- |
532+
|| 成功 | 成功 | 0 |
533+
|| 成功 | 不成功 | 2 |
534+
|| | 成功 | 2 |
535+
|| | 不成功 | 0 |
536+
537+
(延迟两个周期:预测失败需要更新 BTB 的项,花费 1 个周期。对 BTB 项进行更改时需要停止取值,又花费 1 个周期)
538+
539+
### 基于硬件的前瞻执行(略)
540+
541+
基本思想:对分支结果预测,按预测结果继续取指、流出、执行后续指令,但结果不写回寄存区或存储器,而是写入**再定序缓冲器 ROB**,等到指令“确认”之后再写回寄存器或存储器。
542+
543+
前瞻执行机制下指令的执行步骤:流出——执行——写结果到 ROB——确认。
544+
467545
## 多流出技术
468546

547+
在每个时钟周期内流出多条指令,CPI<1。
548+
549+
<img src="计算机系统结构.assets/image-20210621204809703.png" alt="image-20210621204809703" style="zoom:50%;" />
550+
551+
两种多流出处理机:
552+
553+
- 超标量:
554+
- 每个时钟周期流出的指令条数<u>不固定</u>,但有上限 n。这种处理机称为 n 流出(n 发射)处理机。
555+
- 可以通过编译器静态调度,也可以基于 Tomasulo 算法进行动态调度。
556+
- 超长指令字 VLIW(Very Long Instruction Word):
557+
- 单一的流或控制器:在每个周期流出指令条数固定,这些指令构成一个长指令(指令包),通常大于 100 位。
558+
- 指令包中的指令之间并行性通过指令显式地表示出来。
559+
- 大量的数据通路和功能部件:设置多个功能部件。
560+
- 超长指令字包含多个控制字段:指令字被分割成一些字段,每个字段称为一个**操作槽**,直接独立控制一个功能部件。
561+
- 超长指令字的生成由编译器完成:指令调度由编译器静态完成,流出时无需复杂冲突检测。
562+
563+
<img src="计算机系统结构.assets/image-20210621210007044.png" alt="image-20210621210007044" style="zoom: 33%;" />
564+
565+
静态调度的多流出技术:
566+
567+
- 每个时钟周期流出 n 条指令。称为流出包。
568+
- 指令按序流出,在流出时由流出部件进行冲突检测:
569+
- 第一阶段:进行流出包内的冲突检测,选出初步判定可以流出的指令。
570+
- 第二阶段:检测选出的指令与正在执行的指令是否冲突。
571+
572+
超流水线处理机:每 1/n 个时钟周期流出一条指令。
573+
574+
<img src="计算机系统结构.assets/image-20210621210238347.png" alt="image-20210621210238347" style="zoom: 33%;" />
575+
469576
# 第四章 向量流水处理机
470577

471578
> 向量处理方法:横向处理、纵向处理、纵横处理

0 commit comments

Comments
 (0)