导图社区 计算机体系结构
量化设计与分析基础包括计算机的分类,计算机体系结构的定义,技术趋势,集成电路中的功率和能耗,成本趋势,可信任度,性能的测量、报告和汇总,计算机设计的量化的原理。
编辑于2022-11-03 01:44:24 陕西第1章 量化设计与分析基础
1. 引言
计算机性能的快速发展
高级语言降低了对目标代码兼容性要求
独立于厂商的标准化操作系统降低了引入新体系结构的成本和风险
开发出了一组指令更简单的新体系结构——RISC体系结构
设计时主要关注两种关键性能技术
指令级并行的开发
最初通过流水线
后来通过多指令发射
缓存的使用
最初采用一些很简单的形式
后来使用了更为复杂的组织与优化方式
抬高了性能指标,旧体系结构要么跟上,要么被淘汰
Intel在内部将x86指令转换为类似于RISC的指令,使其能采用许多最初有RISC设计倡导的新技术
随着晶体管数目的飞速增长,转换更复杂x86体系结构时的硬件开销可以忽略不计
在低端应用如手机中,x86转换开销的功耗和成本,促使一种RISC体系结构成为主流—— ARM
体系结构与组织方式的发展一起促成了计算机性能以超过50%的年增长率持续增长17年
但这一持续17年的硬件复兴结束了,Intel也从提高单处理器性能转向增加一个芯片上的核心数目
主要由于两大孪生瓶颈
风冷芯片最大功耗
无法有效开发更多指令级并行
标志着历史性转折的里程碑信号,处理器性能提高不再单纯依赖ILP
处理器性能提高
指令集并行(ILP)
数据级并行(DLP)
线程级并行(TLP)
仓库级计算机(WSC)
请求级并行(RLP)
2. 计算机的分类
个人移动设备(PMD)
台式机(桌面计算机)
服务器
可用性
可扩展性
具有很高的吞吐能力
集群/仓库级计算机
软件即服务(SaaS)应用的发展推动了集群的发展
集群是指一组桌面计算机或服务器通过局域网连接在一起, 运转方式类似于一个更大型的计算机
最大规模的集群成为仓库级计算机(WSC)
与服务器/超级计算机的区别联系
与服务器区别:WSC以很多廉价组件为构建模块,依靠软件层来捕获和隔离再这一级别进行计算时发生的许多故障
与超级计算机
超级计算机强调浮点性能,会运行大型的、通信密集的批程序,可能依次运行几个星期,这种紧耦合性决定了超级计算机要使用非常快速的内部网络
WSC重视互动应用程序、大规模存储、可靠性和很高的因特网带宽
嵌入式
并行度与并行体系结构的分类
应用程序中主要有两种并行
数据级并行(DLP)
任务级并行(TLP)
计算机硬件用4中方式来开发上述两种应用并行
指令级并行(ILP)
用流水线之类的思想适度开发DLP
用推理执行之类的思想以中等水平开发DLP
向量体系结构 & 图形处理器(GPU)
将单条指令并行应用于一个数据集,以开发DLP
线程级并行(TLP)
再一种紧耦合硬件模型中开发DLP或TLP,允许在线程间进行交互
请求级并行(RLP)
将计算机分为4类
这种分类很粗略,事实上许多处理器都是SISD、SIMD、MIMD的混合类型
单指令流、单数据流(SISD)
单处理器,但可以用指令级并行
单指令流、多数据流(SIMD)
向量体系结构、标准指令集的多媒体扩展、GPU
多指令流、单数据流(MISD)
目前还没有这种类型的商用多处理器
多指令流、多数据流(MIMD)
针对的是任务级并行,比SIMD更灵活、适用性更强
还能开发数据级并行、线程级并行等
3. 计算机体系结构的定义
指令集体系结构(ISA)
分类
现今几乎所有ISA都划分到通用寄存器体系结构中。 这种类别有右侧两种主流版本
寄存器-存储器ISA
如80x86,可以在许多指令中访问存储器
载入-存储ISA
所有最新ISA都采用载入-存储版本
如arm和MIPS,只能用载入或存储指令来访问存储器
存储器寻址
几乎都用字节寻址类访问存储器操作数,有些如ARM和MIPS必须要求对齐
寻址模式
寄存器寻址
操作数存储在寄存器中
立即数寻址
操作数直接存储在指令中
位移量寻址
操作数存储在存储器中,地址存储在寄存器中
操作数类型和大小
操作指令
常见类别有
数据传输指令
算数逻辑指令
控制指令
浮点指令
控制流指令
ISA的编码
固定长度
所有ARM和MIPS指令长度都是32位,简化了指令译码
可变长度
x86为可变长度,范围1~18个字节,可以缩小程序规模
真正的计算机体系结构:设计满足目标和功能需求的组成和硬件
组成(微体系结构)
包含计算机设计的高阶内容, 如存储器系统,存储器互联,设计内部处理器/CPU
硬件
指一个计算机的具体实现,包括计算机的详尽逻辑设计和封装技术
本书的体系结构涵盖了计算机设计的所有三个方面
指令集体系结构(ISA)
组成(微体系结构)
硬件
4. 技术趋势
技术分类
集成电路逻辑技术
摩尔定律:一个芯片上的晶体管数目每年大约增长40%~55%,或者说每18~24个月翻番
半导体DRAM
近几年,单个DRAM芯片的容量每年增加大约25%~40%,大约每2~3年翻番
半导体闪存
近几年,单个闪存芯片容量以每年大约50%~60%的速度增长,大约每2年翻番
磁盘技术
1990年前磁盘密度每年提高约30%,3年翻番;之后每年增长60%,1996年增速为100%;2004年开始,已经回落到约40%,3年翻番。
网络技术
取决于交换机性能和传输系统的性能
性能趋势:带宽胜过延迟
带宽/吞吐量:在给定时间内完成的总工作量
如在进行磁盘传送时每秒完成的MB数
延迟/响应时间:一个事件从开始到完成所经历的时间
如一次磁盘访问需要的毫秒数
带宽的增长速度至少是延迟改进速度的平方
晶体管性能于连线的发展
特征尺寸:一个晶体管或一条连线在x方向或y方向的最小尺寸
用来衡量集成电路的制造工艺
特征尺寸↓,晶体管性能↑,晶体管数目以平方曲线增长
与晶体管性能相比,连线延迟方面改进非常小
已成为除功耗外大型集成电路的主要设计限制
5. 集成电路中的功率和能耗
功率和能耗:系统观点
处理器需要的最大功率?
持续功耗是多少?
用热设计功耗(TDP)度量
比较两种处理器对于给定任务哪个更高效时,应比较执行该任务的能耗,而非功率
微处理器内部的功率和能耗
能耗 ∝ 1/2×容性负载×电压²
功率 ∝ 1/2×容性负载×电压²×开关频率
6. 成本趋势
时间、产量、大众化影响
学习曲线:制造成本随时间的推移而降低
推动成本走低的基础原理
成品率加倍能使成本减半
产量加倍,成本下降约10%
大众化商品使得竞争激烈,会缩小成本与售价的距离,还会降低成本
集成电路的成本
可以通过影响晶片大小,影响成本
决定晶片上包含/排除哪些功能
确定I/O管脚数目
7. 可信任度
两种主要度量
模块可靠性
平均无故障时间(MTTF)是一种度量
其倒数就是故障率(FIT),通常以运行10亿小时发生的故障数来表示
服务中断用平均修复时间(MTTR)度量
平均故障间隔时间(MTBF)=MTTF+MTTR
模块可用性
8. 性能的测量、报告和汇总
X速度是Y的n倍:
9. 计算机设计的量化原理
充分利用并行
单处理器级别,充分利用指令间并行非常关键,实现其最简单的方法之一就是流水线
局域性原理
程序常常重复使用它们最近用过的数据和指令 一个程序90%的执行时间花费在仅10%的代码中
时间局域性
最近访问过的内容很可能会在短期内被再次访问
空间局域性
地址相互临近的项目很可能会在短时间内都被用到
重点关注常见情形
设计权衡时,常见情形优先于非常见情形
Amdahl定律
阐述了回报递减规律:如果仅改进一部分计算的性能,在增加改进时,所获得的加速比增量会逐渐减小
重要推论:若某一升级仅对一项任务的一部分适用,则该任务的总加速比不会超过
处理器性能公式
每条指令时钟周期数(CPI)=
CPU时间 = IC × CPI × 时钟周期时间
第2章 存储器层次结构设计
1. 引言
根据局域性原理
“给定实现技术和功率预算下,硬件越小,速度越快”准则
产生存储器层次结构
PMD
laptop or desktop
server
包含性质:低层级存储器中的数据是其上一级存储器数据的超集
随着高端处理器从单核转向多核,进一步提高了带宽需求。高带宽通过3种方法实现
实现缓存的多端口和流水线
利用多级缓存
为每个核心使用独立的L1缓存,有时也使用独立的L2缓存
在L1使用独立的指令与数据缓存
设计存储器层次结构
平均访问时间
传统设计优化的重点
缓存访问时间
缺失率
确实代价
共同决定
功率
已成为设计人员主要考虑事项
大容量的L2、L3缓存会消耗大量功率
没有操作时泄露功率(静态功率)
执行读取or写入时的活动功率(动态功率)
需要更多考虑性能与功率之间的权衡
存储器层次结构基础知识回顾
若缓存中找不到某个字,就必须从较低层级种提取。处于效率原因,会一次移动多个字,称为块(或行)。每个缓存块都有一个标记,指明其与哪个存储器地址对应
哪些块可以放在缓存中?
组相联
一个块首先被映射到一个组上,然后可以将这个块放到这个组中的任意位置。 要查找一个块,首先将这个块的地址映射到这个组,然后再搜索这个组(通常为并行搜索),以找到此块。 这个组是根据数据地址选择的: (块地址)MOD(缓存中的组数)
n路组相联
一个组中有n个块
直接映射缓存
每组中只有1个块
全相联缓存
只有一个组(故块可以放在任何地方)
缓存只读数据很容易,因为缓存和存储器中的副本相同
缓存写入难一些
缓存和存储器中的副本如何保持一致?
直写(write-through)缓存
更新缓存中的项目,并直接写入主存储器,对其进行更新
回写(write-back)缓存
仅更新缓存中的副本,在马上要替换这个块时,再复制回存储器
都用了写缓冲区
数据放入这个缓冲区后,马上就可以进行缓存操作,不需要等待将数据写入存储器的全部延迟时间
衡量不同缓存组织方式优劣的指标
缺失率
未能找到预期目标的缓存访问所占的比例,即未找到目标的访问数÷总访问数
缺失情况
强制(Compulsory)
对一个数据块第一次访问,这个块不可能在缓存中,所以必须将这个块调入缓存。 即使有无限大缓存,也会发生强制缺失
容量(Capacity)
如果缓存不能包含程序运行期间所需要的全部块,就会因为有些块被放弃,之后再被调入而导致容量缺失(还有强制缺失)
冲突(Conflict)
如果块放置策略不是全相联的,这时如果多个块映射又到一个块的组中,对不同块的访问混杂在一起,一个块可能会被弃置,之后再被调入,从而发生冲突缺失(还有强制缺失和容量缺失)
致性(Coherency)
因为缓存刷新导致
多线程、多核都增加了缓存的复杂性,增加了出现容量缺失的可能
每条指令的缺失次数
存储器平均访问时间
存储器平均访问时间仍然是一个间接性能测量指标,尽管比缺失率好一些,但不能代替执行时间。 如推理处理器可以在缺失期间执行其他指令,从而降低实际缺失代价 再如多线程的使用也允许一个处理器容忍一些缺失,而不会被强制转入空闲状态
存储器平均访问时间 = 命中时间 + 缺失率 × 缺失代价
命中时间:在缓存中命中目标花费的时间 缺失代价:从内存中替代块的时间(即缺失成本)
优化方法
增大块以降低缺失率
增大缓存以降低缺失率
提高相联程度以降低缺失率
采用多级缓存以降低缺失代价
为读取缺失指定高于写入操作的优先级,以降低缺失率
在缓存索引期间避免地址转换,以缩短命中时间
这6种方法都有自己潜在的弱点,可能会导致存储器平均访问时间延长而非缩短
2. 缓存性能的10种高级优化方法
缩短命中时间
小而简单的L1 Cache
路预测
增加缓存带宽
流水化缓存
无阻塞缓存
多组缓存
降低缺失代价
关键字优化和提前重启动
合并写缓冲区
降低缺失率
编译器优化
通过并行降低缺失代价或缺失率
对指令和数据进行硬件预取
用编译器控制预取
3. 存储器技术与优化
SRAM
DRAM
提高DRAM芯片内部的存储器性能
降低SDRAM中的功耗
闪存
EEPROM(电可擦可编程只读存储器)
能在没有任何供电的情况下保存其内容
与DRAM区别
改写内存前必须对其进行擦除
闪存是静态的,未进行读写时只消耗非常低的功率
对任何块来说,闪存提供有限数目的写入周期,通常至少为100000个
高密度闪存比SDRAM便宜,但比磁盘贵
闪存速度比SDRAM慢得多,但比磁盘快得多
提高存储器系统的可靠性
软错误/动态错误
奇偶校验位检测
纠错码(ECC)检测和纠正
Chipkill
硬错误
4. 保护:虚拟存储器和虚拟机
通过虚拟存储器提供保护
通过虚拟机提供保护
对虚拟机监视器的要求
虚拟机的指令集体系结构支持
虚拟机对虚拟存储器和I/O的影响
VMM实例:Xen虚拟机
5. 交叉问题:存储器层次结构的设计
保护和指令集体系结构
缓存数据的一致性
第3章 指令级并行及其开发
1. 指令级并行:概念与挑战
指令级并行ILP
约1985年后所有处理器都用流水线来重叠指令的执行过程,以提高性能。 由于指令可以并行执行,所以指令间可能实现的这种重叠称为 指令级并行(ILP)
ILP大体有两种开发方法
依靠硬件来帮助动态发现和开发并行
包括Intel Core系列,在桌面、服务器市场占主导地位
依靠软件技术在编译时静态发现并行
之前在PMD市场占主导地位(为了提高能耗效率,采用较低级别指令级并行,故采用静态方法),但未来的处理器将趋向采用动态方法
流水线CPI = 理想流水线CPI + 结构化停顿 + 数据冒险停顿 + 控制停顿
理想化流水线CPI:可以用来度量能够实现的最佳性能。 通过缩短式子中右侧各项,可以降低总流水线CPI,也就是提高IPC。
基本块
一段顺序执行代码,除入口外没有其他转入分支,除出口外没有其他转出分支
可利用的并行数非常有限
为了真正地提高性能,必须跨越多个基本块开发ILP
循环级并行
在循环的各次迭代之间开发并行
是提高ILP最简单、最常见的方法
重要替代方法:使用向量处理器和图形处理器(GPU)中的SIMD
SIMD指令:并行处理少量到中等数量的数据项(通常2~8项)
向量指令:使用并行执行单元和深流水线,并行处理许多数据项
数据相关与冒险
相关
相关是程序的一种属性。某种给定的相关是否会导致检测到实际冒险,这一冒险又是否会实际导致停顿,这都属于流水线结构的性质。 这一区别对于理解如何开发指令级并行至关重要。
数据相关(真数据相关)
条件1:指令i 生成的结果可能会被 指令j 用到
条件2:指令j 数据相关于 指令k,指令k 数据相关于 指令i
任一条件成立,则称 指令j 数据相关于 指令i
如果两条指令数据相关,那它们必须按顺序执行,不能同时执行或不能完全重叠执行
数据相关传递了3点信息
冒险的可能性
计算结果必须遵循的顺序
可开发并行度的上线
克服相关性的2种方法
保护相关性但避免冒险
通过转换代码来消除相关性
名称相关
当两条指令使用相同的寄存器或存储器位置(称为名称),但与该名称相关的指令之间没有数据流动时,就会发生名称相关
指令i 和 指令j ( i 在 j 前)之间存在两种类型的名称相关
反相关:当 指令j 对 指令i 读取的寄存器或存储器位置执行写操作时就会在 指令i 和 指令j 之间发生反相关
输出相关:当 指令i 和 指令j 对同一个寄存器或存储器位置执行写操作时,发生输出相关
都是名称相关
由于没有在指令间传递值,所以名称相关不是真正的相关。如果改变这些指令中使用的名称(寄存器号或存储器位置),使这些指令不在冲突,那么名称相关涉及的指令就可以同时执行
控制相关
控制相关决定了 指令i 相对于分支指令的顺序,使 指令i 按正确程序顺序执行,而且只会在应当执行时执行。
除了程序中第一基本块中的指令之外,其他所有指令都与某组分支存在控制相关。
控制相关一般会施加2个约束条件
如果一条指令与一个分支控制相关,那就不能把这个指令移到这个分支之前,使它的执行不再受控于这个分支。
如果一条指令与一个分支没有控制相关,那就不能把这个指令移到这个分支之后,使它的执行受控于这个分支
数据冒险
只要指令间存在名称相关或数据相关,而且它们非常接近,足以使执行期间的重叠顺序改变对相关操作数的访问顺序,那就会存在冒险。
RAW(写后读)
j 试图在 i 写入一个源位置之前读取它,所以 j 会错误地获得旧值
这一冒险时最常见的类型,与真数据相关相对应。为了确保 j 会收到来自 i 的值,必须保持程序顺序
WAW(写后写)
j 试图在 i 写一个操作数之前写该操作数
这种冒险与输出相关相对应。只有允许在多个流水级进行写操作的流水线中,或者在前一指令停顿时允许后一指令继续执行的流水线中,才会存在WAW冒险
WAR(读后写)
j 尝试在 i 读取一个目标位置之前写入该位置,所以 i 会错误地获取新值
这一冒险源于反相关(或名称相关)。在大多数静态发射流水线中,由于所有读取操作都较早进行,所有写操作都晚一些,所以不会发生WAR冒险。如果又一些指令在指令流水线中提前写出结果,而其他指令在流水线的后期读取一个源位置,或者对指令进行重新排序时,就会发生WAR冒险。
例子中 i 根据程序顺序排在 j 前面
2. 揭示ILP的基本编译器技术
以流水线调度和循环展开为例
流水线调度与循环展开
确认循环迭代不相关(循环维护代码除外),判定展开循环是有用的
使用不同的寄存器,以避免由于不同运算使用相同寄存器而施加的非必要约束(如名称相关)
去除多余的测试和分支指令,并调整循环终止与迭代代码
观察不同迭代中的载入与存储指令互不相关,判定展开后的循环中的载入和存储指令可以交换位置。这一变换需要分析存储器地址,查明它们没有引用同一地址
对代码进行调度,保留任何必要相关,以得到与原代码相同的结果
有3种不同效果会限制循环展开带来的好处
每次展开操作分摊的开销数目降低
代码规模限制
编译器限制
3. 用高级分支预测降低分支成本
降低分支冒险方法
由于需要通过分支冒险和停顿来实施控制相关,所以分支会伤害流水线性能。
循环展开
通过预测分支的行为方式来降低分支的性能损失
相关分支预测
利用其他分支行为来预测的分支预测器称为相关预测或两级预测
现有的相关预测器增加最近分支的行为信息,来决定如何预测一个给定分支
其吸引力在于它的预测率可以高于2位方案,而需要添加的硬件很少
竞赛预测器:局部预测器与全局预测器的自适应联合
采用了多个预测器,通常是一个基于全局信息的预测器和一个基于局部信息的预测器,用选择器将它们结合起来。
竞赛预测器既可以以中等规模的预测位(8K~32K位)实现更好的预测准确度,还可以更有效地利用超大量预测位。
竞赛预测器的优势在于能够为特定分支选择正确的预测器,这一点对于整数基准测试尤为重要。
Intel Core i7分支预测器
使用了一个两级预测器
第一级预测器较小,设计用来满足周期约束条件:每个时钟周期预测一个分支
第二级预测器较大,作为备份。
每个预测器都组合了3种不同的预测器
简单的两位预测器
全局历史预测器
循环退出预测器
4. 用动态调度克服数据冒险
在动态调度中,硬件会重新安排指令的执行顺序以减少停顿,并同时保持数据流和异常行为
优点
允许针对一种流水线编译的代码在不同流水线上高效执行,不需要在使用不同微体系结构时重新编译,并拥有多个二进制文件
某些情况下,在编译代码时还不能知道相关性,利用动态调度可以处理某些此类情况
允许处理器容忍一些预料之外的延迟,比如缓存缺失可以在等待解决缺失问题时执行其他代码
动态调度:思想
采用乱序完成动态调度
可能导致WAR和WAW冒险
还会使异常处理变得复杂
乱序完成的动态调度必须保持异常行为,使哪些在严格按照程序顺序执行时会发生的异常仍然会实际发生,也不会发生其他异常。
尽管异常行为必须保持,但动态调度处理器可能生成一些非精确异常
非精确异常可能因为2种可能性而发生
流水线在执行导致异常的指令时,可能已经完成了按照程序顺序排在这一指令之后的指令
流水线在执行导致异常的指令时,可能还没有完成按照程序顺序排在这一指令之前的指令
为了能够进行乱序执行,将五级简单流水线的ID流水级大体分为以下两个阶段
发射
译码指令,检查结构性冒险
读操作数
一直等到没有数据冒险,然后读取操作数
使用Tomasulo算法进行动态调度
基本思想
保留站再一个操作数可用时马上提取并缓冲它,就不用再从寄存器种获取该操作数
等待执行的指令会指定保留站,为自己提供输入
对寄存器连续进行写入操作并且重叠执行时,只会实际使用最后一个操作更新寄存器
再发射指令时,会将待用操作数的寄存器说明符更名,改为保留站的名字。这就体现了寄存器重命名功能
使用保留站而非集中式寄存器堆,会导致另外两个重要特性
冒险检测和执行控制时分布式的:每个功能单元保留站中保存的信息决定了一条指令什么时候可以开始在该单元中执行
结果将直接从直接从缓冲它们的保留站中传递给功能单元,而不需要经过寄存器
5. 基于硬件的推测
流水线调度与循环展开
确认循环迭代不相关(循环维护代码除外),判定展开循环是有用的
使用不同的寄存器,以避免由于不同运算使用相同寄存器而施加的非必要约束(如名称相关)
去除多余的测试和分支指令,并调整循环终止与迭代代码
观察不同迭代中的载入与存储指令互不相关,判定展开后的循环中的载入和存储指令可以交换位置。这一变换需要分析存储器地址,查明它们没有引用同一地址
对代码进行调度,保留任何必要相关,以得到与原代码相同的结果
6. 开发ILP
以多发射和静态调度开发ILP
基本思想
保留站再一个操作数可用时马上提取并缓冲它,就不用再从寄存器种获取该操作数
等待执行的指令会指定保留站,为自己提供输入
对寄存器连续进行写入操作并且重叠执行时,只会实际使用最后一个操作更新寄存器
再发射指令时,会将待用操作数的寄存器说明符更名,改为保留站的名字。这就体现了寄存器重命名功能
以动态调度、多发射和推测开发ILP
优点
允许针对一种流水线编译的代码在不同流水线上高效执行,不需要在使用不同微体系结构时重新编译,并拥有多个二进制文件
某些情况下,在编译代码时还不能知道相关性,利用动态调度可以处理某些此类情况
允许处理器容忍一些预料之外的延迟,比如缓存缺失可以在等待解决缺失问题时执行其他代码
7. 用于指令传输和推测的高级技术
4. 用动态调度克服数据冒险
在动态调度中,硬件会重新安排指令的执行顺序以减少停顿,并同时保持数据流和异常行为
优点
允许针对一种流水线编译的代码在不同流水线上高效执行,不需要在使用不同微体系结构时重新编译,并拥有多个二进制文件
某些情况下,在编译代码时还不能知道相关性,利用动态调度可以处理某些此类情况
允许处理器容忍一些预料之外的延迟,比如缓存缺失可以在等待解决缺失问题时执行其他代码
动态调度:思想
采用乱序完成动态调度
可能导致WAR和WAW冒险
还会使异常处理变得复杂
乱序完成的动态调度必须保持异常行为,使哪些在严格按照程序顺序执行时会发生的异常仍然会实际发生,也不会发生其他异常。
尽管异常行为必须保持,但动态调度处理器可能生成一些非精确异常
非精确异常可能因为2种可能性而发生
流水线在执行导致异常的指令时,可能已经完成了按照程序顺序排在这一指令之后的指令
流水线在执行导致异常的指令时,可能还没有完成按照程序顺序排在这一指令之前的指令
为了能够进行乱序执行,将五级简单流水线的ID流水级大体分为以下两个阶段
发射
译码指令,检查结构性冒险
读操作数
一直等到没有数据冒险,然后读取操作数
使用Tomasulo算法进行动态调度
基本思想
保留站再一个操作数可用时马上提取并缓冲它,就不用再从寄存器种获取该操作数
等待执行的指令会指定保留站,为自己提供输入
对寄存器连续进行写入操作并且重叠执行时,只会实际使用最后一个操作更新寄存器
再发射指令时,会将待用操作数的寄存器说明符更名,改为保留站的名字。这就体现了寄存器重命名功能
使用保留站而非集中式寄存器堆,会导致另外两个重要特性
冒险检测和执行控制时分布式的:每个功能单元保留站中保存的信息决定了一条指令什么时候可以开始在该单元中执行
结果将直接从直接从缓冲它们的保留站中传递给功能单元,而不需要经过寄存器
8. ILP局限性研究
Intel Core i7分支预测器
使用了一个两级预测器
第一级预测器较小,设计用来满足周期约束条件:每个时钟周期预测一个分支
第二级预测器较大,作为备份。
每个预测器都组合了3种不同的预测器
简单的两位预测器
全局历史预测器
循环退出预测器
动态调度:思想
采用乱序完成动态调度
可能导致WAR和WAW冒险
还会使异常处理变得复杂
乱序完成的动态调度必须保持异常行为,使哪些在严格按照程序顺序执行时会发生的异常仍然会实际发生,也不会发生其他异常。
尽管异常行为必须保持,但动态调度处理器可能生成一些非精确异常
非精确异常可能因为2种可能性而发生
流水线在执行导致异常的指令时,可能已经完成了按照程序顺序排在这一指令之后的指令
流水线在执行导致异常的指令时,可能还没有完成按照程序顺序排在这一指令之前的指令
为了能够进行乱序执行,将五级简单流水线的ID流水级大体分为以下两个阶段
发射
译码指令,检查结构性冒险
读操作数
一直等到没有数据冒险,然后读取操作数
9. 交叉问题:ILP方法与存储器系统
指令级并行ILP
约1985年后所有处理器都用流水线来重叠指令的执行过程,以提高性能。 由于指令可以并行执行,所以指令间可能实现的这种重叠称为 指令级并行(ILP)
ILP大体有两种开发方法
依靠硬件来帮助动态发现和开发并行
包括Intel Core系列,在桌面、服务器市场占主导地位
依靠软件技术在编译时静态发现并行
之前在PMD市场占主导地位(为了提高能耗效率,采用较低级别指令级并行,故采用静态方法),但未来的处理器将趋向采用动态方法
流水线CPI = 理想流水线CPI + 结构化停顿 + 数据冒险停顿 + 控制停顿
理想化流水线CPI:可以用来度量能够实现的最佳性能。 通过缩短式子中右侧各项,可以降低总流水线CPI,也就是提高IPC。
基本块
一段顺序执行代码,除入口外没有其他转入分支,除出口外没有其他转出分支
可利用的并行数非常有限
为了真正地提高性能,必须跨越多个基本块开发ILP
循环级并行
在循环的各次迭代之间开发并行
是提高ILP最简单、最常见的方法
重要替代方法:使用向量处理器和图形处理器(GPU)中的SIMD
SIMD指令:并行处理少量到中等数量的数据项(通常2~8项)
向量指令:使用并行执行单元和深流水线,并行处理许多数据项
10. 多线程:开发线程级并行提高单处理器吞吐量
动态调度:思想
采用乱序完成动态调度
可能导致WAR和WAW冒险
还会使异常处理变得复杂
乱序完成的动态调度必须保持异常行为,使哪些在严格按照程序顺序执行时会发生的异常仍然会实际发生,也不会发生其他异常。
尽管异常行为必须保持,但动态调度处理器可能生成一些非精确异常
非精确异常可能因为2种可能性而发生
流水线在执行导致异常的指令时,可能已经完成了按照程序顺序排在这一指令之后的指令
流水线在执行导致异常的指令时,可能还没有完成按照程序顺序排在这一指令之前的指令
为了能够进行乱序执行,将五级简单流水线的ID流水级大体分为以下两个阶段
发射
译码指令,检查结构性冒险
读操作数
一直等到没有数据冒险,然后读取操作数