流水线
相关与冲突
相关
两条指令之间存在某种依赖关系
- 数据相关:真数据相关 RAW read after write
前一条指令写,后一条指令读 - 名相关:
- 名:寄存器的名称
- 两条指令使用相同的名,但之间没有数据流动
- 反相关:WAR wirte after read
- 读之后写
- 输出相关:WAW wirte after write
- 两个指令写同一个寄存器
- 反相关:WAR wirte after read
- Q:为什么出现名相关?A:物理寄存器数量有限
- 执行顺序不可颠倒
- 因为没有数据的流动,因此改变寄存器名字也无妨
- 换名技术:改变操作数的名来消除名相关
- 编译器静态实现,硬件动态实现(区别?)
冲突
指对于流水线来说,由于相关
的存在,使得指令中下一条指令无法执行
* 结构、数据、控制冲突
- 结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
- 数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
- 控制冲突:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。
冲突的问题:1.导致错误的执行结果
2.流水线可能会出现停顿,从而降低流水线的效率和实际的加速比
结构冲突
在流水线处理机中,为了能够使各种组合的指令都能顺利地重叠执行,需要对功能部件进行流水或重复设置资源。
如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突。
原因:1. 功能部件不是完全流水(瓶颈段)
2. 资源份数不够
解决:停顿
eg.访存冲突
有些流水线处理机只有一个存储器,将数据和指令放在一起,访存指令会导致访存冲突。
解决方法:1. 插入暂停周期 2. 设置相互独立的指令存储器和数据存储器或设置相互独立的指令cache和数据cache
有时允许结构冲突存在,节省成本
数据冲突
当相关的指令靠得足够近时,它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们非流水线实现时的顺序,则发生了数据冲突。
数据冲突的类型:
- 写后读冲突(RAW),最常见,对应真数据相关
- 在i写入之前,j先读,则j读出的结果是错误的
- 写后写(WAW)对应输出相关
- 在i写入之前,j先写
- 读后写(WAR)由反相关引起
- i读之前,j先写
解决:
- i读之前,j先写
- 定向传送技术
- 定向传送技术+停顿
- 指令调度(依靠编译器)(可能产生新的WAR或WAW冲突)
控制冲突
- 处理分支指令最简单的方法:冻结或排空流水线。优点:简单
指令级并行
概念:是指存在于指令一级即指令间的并行性,主要是指机器语言一级,如存储器访问指令、整型指令、浮点指令之间的并行性等。
特点:是并行性由处理器硬件和编译程序自动识别和利用,不需要程序员对顺序程序作任何修改。正是由于这一优点,使得它的发展与处理器的发展紧密相连。
实际CPI=CPI理想+结构冲突+数据冲突+控制冲突
需要解决相关与冲突的问题。
两类解决方法:
- 保持相关,但避免发生冲突
- 指令调度(依靠编译器静态调度)
- 通过代码变换,消除相关
- 寄存器换名(消除WAR和WAW)
静态开发方法
基本编译技术:循环展开与指令调度
动态调度
乱序执行
- 将ID阶段再分为两个阶段:
- 流出(IS):指令译码,检查是否存在结构冲突
- 读操作数(Read Operands):等待数据冲突消失,然后读操作数
乱序执行会导致WAR and WAW冲突
动态指令调度是在指令执行过程中进行调度,使得无关的指令得以先执行,减少阻塞。
能处理一些在编译时情况不明的相关(存储器访问的相关)
能使得本来是面向某一流水线优化编译的代码在其他的流水线(动态调度)上也能高效执行。
使用换名技术消除名相关(包括反相关和输出相关)
指令乱序->异常处理困难
硬件复杂性显著增加
动态调度解决数据冒险
Tomasulo算法
记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小;通过寄存器换名来消除WAR和WAW冲突
- 寄存器换名是通过保留站和流出逻辑来共同完成的。
- 当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站标识
- 指令流到保留站后,其操作数或换成了数据本身,或换成了保留站标识,不再与寄存器有关系
- 特点:
- 冲突检测和指令执行控制是分布的
每个功能部件的保留站中的信息决定了什么时候指令可以在该功能部件开始执行 - 计算结果通过CDB直接从产生它的保留站传送到所有需要它的功能部件,而不用经过寄存器
- 冲突检测和指令执行控制是分布的
动态调度解决控制冒险
动态分支预测技术
- 所开发的ILP越多,控制相关的制约就越大,分支预测就要有更高的准确度。
- 动态分支预测技术:通过硬件技术,在程序执行时根据每一条转移指令过去的转移历史记录来预测下一次转移的方向。通过提前预测分支方向,减少或消除控制相关导致的流水线停顿。
- 优点:
- 根据程序的执行过程动态地改变转移的预测方向,因此有更好的准确度和适应性
- 程序每次执行时,可能预测的分支方向与前次相同或不同
- 分支预测的有效性取决于:
- 预测的准确性
- 决定分支开销的因素:
- 流水线的结构
- 预测的方法
- 预测错误时的恢复策略
- 采用动态分支预测技术的目的:
- 预测分支是否成功
- 尽快找到分支目标地址(避免控制相关造成流水线停顿)
分支预测缓存器(BHT)
最简单的动态分支预测方法
用BHT来记录分支指令最近一次或几次的执行情况
- 一个预测位
- 只需要一位二进制单位
- 两个预测位
- 提高预测的准确度
- 当分支指令到达译码段时,根据从BHT读出的信息进行分支预测,若预测正确,则继续处理后续的指令,流水线没有断流,否则,就要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令
- BHT只在以下情况下才有用:
- 判定分支是否成功所需的时间大于确定分支目标地址所需的时间
- 五段经典流水线中,由于判定分支和计算分支地址都是在ID阶段完成,所以BHT方法不会给流水线带来好处
分支目标缓冲器(BTB)
目标:将分支的开销降为0
方法:分支目标缓冲
将分支成功的分支指令的地址和它的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标识。
预测不成功的话延迟2个周期
基于硬件的前瞻执行
前瞻执行基本思想:
对分支指令的结果进行猜测,并假设这个猜测总是对的,然后按这个猜测结果继续取、流出和执行后续的指令。只是执行指令的结果不是写回到寄存器或存储器,而是放到一个称为ROB(ReOrder Buffer)的缓冲器中。等到相应的指令得到“确认”(commit)(即确实是应该执行的)之后,才将结果写入寄存器或存储器。
实现前瞻的关键思想:允许指令乱序执行,但必须顺序确认
- 在分支指令的结果出来后,对相应指令的前瞻执行给予确认。如果前面所做的猜测是对的,把在ROB中的结果写到寄存器或存储器。如果发现前面对分支结果的猜测是错误的,那就不予以确认,并从那条分支指令的另一条路径开始重新执行。
在Tomasulo算法基础上改进。Tomasulo算法的保留站换名功能由ROB完成。
标签:并行,指令,冲突,寄存器,流水线,执行,分支 From: https://www.cnblogs.com/airjojo/p/17476380.html