现代的通用处理器从实现方式上看,可以分为标量(Scalar)和超标量(Superscalar)这两种。其中,标量处理器每周期最多只能执行一条指令,顺序执行(in-order);而超标量处理器每周期内执行多条指令,可以顺序执行也可以乱序执行(out-of-order)。相比于标量处理器而言,超标量处理器提高了程序执行效率,但也增加了处理器及其流水线的设计复杂度。
《超标量处理器设计》一书以Superscalar RISC处理器设计作为重点,同时以其流水线作为贯穿的主线,按流水线阶段、部件分章节展开介绍。
系列文章目录
【读书笔记】《超标量处理器设计》开篇:我的动机杂谈
【读书笔记】《超标量处理器设计》第1章 超标量处理器概览
【读书笔记】《超标量处理器设计》第2章 Cache
1 为什么需要超标量
-
问题:如何让一个程序执行更快?
-
程序执行时间: Total Instructions × Cycles Instructions × Seconds Cycle \text{Total Instructions} \times \frac{\text{Cycles}}{\text{Instructions}} \times \frac{\text{Seconds}}{\text{Cycle}} Total Instructions×InstructionsCycles×CycleSeconds
-
程序执行时间影响因素
-
加速处理器执行程序速度的策略
- 减少程序中指令数量
- 减少每条指令在处理器中执行所需周期数
- 减少处理器的周期时间(cycle time)
-
利弊权衡(Tradeoff):IPC和运行频率是互相制约的。
-
思考:每周期执行多指令的实现?
- 超标量处理器(硬件决定)
- 超长指令字(VLIW,编译器和程序员自身决定)
-
整书规划:按照重播篮球处理器流水线的各个部件展开讲解
2 普通处理器的流水线
2.1 流水线的概述
- 流水线作用:降低处理器的周期时间,以获得更高执行频率
- 实施流水线优化效果分析
-
性能: Performance = 1 D n + S \text{Performance}=\frac{1}{\frac{D}{n}+S} Performance=nD+S1
D:不使用流水线时的周期时间
n:使用n级流水线
S:流水线寄存器延迟 -
硬件面积消耗: Cost = G + n × L \text{Cost}=G+n\times L Cost=G+n×L
G:不使用流水线时消耗的硬件面积
n:使用n级流水线
L:每个流水线寄存器及其附带控制逻辑消耗硬件面积 -
朴素目标:消耗比性能尽可能小(即获得同样性能时,消耗硬件面积越小越好)
-
2.2 流水线的划分
-
理想情况需满足条件
- 流水线中每个阶段
所需时间近似相等
- 流水线中每个阶段操作被
重复执行
- 流水线中每个阶段操作和其他段
互相独立
、互不相干
- 流水线中每个阶段
-
典型RISC流水线(五阶段)
- 流水线阶段流程图
- 流水线各阶段说明
-
为满足理想情况条件1(
所需时间近似相等
)可采用方法-
合并(将多个短的流水线阶段合并为一个长的。深度浅,功耗低)
-
拆分(将一个长的流水线阶段拆分为多个小的。深度深,功耗高)
-
2.3 指令间的相关性
- 数据相关性
-
先写后读(Read After Write, RAW),true dependence
-
先读后写(Write After Read,WAR),anti-dependence
-
先写后写(Write After Write,WAW),output dependence
-
- 其他相关性:存储器数据相关性,控制相关性,结构相关性
详见7.1寄存器重命名概述
3 超标量处理器的流水线
超标量处理器有两种执行指令方式:顺序执行(in-order) 和 乱序执行(out-of-order)
- 辨析:个人认为“乱序执行”和“乱序执行超标量处理器”是需要区分的概念。
从指令执行方式划分:
顺序执行
与乱序执行
从超标量处理器类型划分:顺序执行超标量处理器与乱序执行超标量处理器。
对于顺序执行超标量处理器,其各个阶段指令都是顺序执行
的。
对于乱序执行超标量处理器,其部分阶段指令执行是乱序执行
的;另一部分指令执行是顺序执行
的。
3.1 顺序执行
- 要求:指令的执行必须遵守程序中指定的顺序
- n-way超标量处理器:流水线每周期可从I-Cache读取n条指令,即为n-way的超标量处理器
- FU的行为
- 要求:保证流水线的写回阶段是
顺序执行
的 - 解决:所有 FU 须经历同样周期数的流水线
- 解释:以最长周期数的 FU 看齐,哪怕其他 FU 提前算完了也只能空闲等待
- 要求:保证流水线的写回阶段是
- 流水线执行样例
- 要点说明
- 假设流水线的写回阶段才能对计算结果进行 旁路(bypass)
- 顺序执行,后面指令只有等前面指令都 发射(Issue)了才能送 FU 执行
- 所有 FU 必须保持相同周期数
- 存在问题
- 部分指令因前面指令而阻塞
- 不相关指令必须等前面指令都 发射(Issue)了才可送 FU 执行
3.2 乱序执行
-
要求:指令在流水线中不再遵循程序中指定的顺序执行
即:一旦某条指令的操作数准备好了,就可送到 FU 执行
-
区别差异:这里各个 FU 无需再保持相同的周期数
-
流水线阶段说明
超标量处理器流水线相较RISC经典五阶段流水线的主要差异区别说明
流水线阶段 | 说明 |
---|---|
发射(Issue)阶段 | 流水线从顺序执行 到乱序执行 的分界点 |
写回(Write Back)阶段 | 指令只要计算完,结果即存PRF |
提交(Commit)阶段 | 结果从PRF搬ARF ROB配合完成对 异常(exception)的处理 |
退休(Retire)阶段 | 指令离开流水线 完成对处理器状态更改 注:一条指令一旦退休,则再也无法回到之前状态 |
- 需求:解决 WAW 和 WAR
- 解决: 寄存器重命名(register renaming)
解码(Decode)阶段完成,单独使用流水段完成
- 增设硬件:物理寄存器堆(PRF)
配合对指令集中的ARF进行重命名
注:PRF个数多余ARF
- 解决: 寄存器重命名(register renaming)
- 需求:保证程序串行结果,即乱序执行后把结果拉回到程序原始串行顺序
- 解决:重排序缓存(ROB)
流水线中指令按顺序存ROB,ROB实现程序对处理器状态更新。即 提交(Commit)
- 解决:重排序缓存(ROB)
- 流水线执行样例
- 要点说明
- 不同于顺序执行, 这里 FU 不必保持相同时钟周期数,算完即可写回
- 不相关的指令可在前面指令之前 发射(Issue)
个人小结
本书开篇第一章以终为始,从提高处理器执行效率的经典公式出发,分析其影响因素,进而引出本书所述对象——超标量处理器。接着介绍了引入流水线的设计,分析了实施流水线后为什么能提高处理器执行效率的原因分析,并以超标量处理器的流水线为纲,布局了整本书的撰写脉络顺序——即以超标量处理器流水线的流程和部件,分章节进行展开讲述。
关于第一章,我认为有如下一些概念需要重点了解:
- 影响程序执行效率的因素(动机思考,或者说讲故事hhh)
- 超标量处理器的概念理念
- 标量处理器与超标量处理器在流水线的设计上的差异