指令级并行
流水线提高的是指令带宽(吞吐率),而不是单条指令的执行速度相关限制了流水线性能的发挥
结构相关:需要更多的硬件资源
数据相关:需要定向,编译器调度
控制相关:尽早检测条件,计算目标地址,延迟转移,预测
增加流水线的级数会增加相关产生的可能性
异常,浮点运算使得流水线控制更加复杂
编译器可降低数据相关和控制相关的开销
Load 延迟槽
Branch 延迟槽
Branch预测
指令级并行性又称细粒度并行, 主要是相对粗粒度并行而言的。
粗粒度并行存在于程序间,主要是进程或线程间的并行性。
指令级并行是指存在于指令一级即指令间的并行性, 主要是指机器语言一级, 如存储器访问指令、整型指令、浮点指令之间的并行性等。主要特点是并行性由处理器硬件和编译程序自动识别和利用, 不需要程序员对顺序程序作任何修改。正是由于这一优点, 使得它的发展与处理器的发展紧密相连。
基于硬件的动态方法
基于软件的静
硬件+软件技术
CPI流水线 = CPI理想 + 停顿结构冲突 + 停顿数据冲突+ 停顿控制冲突
理想CPI是衡量流水线最高性能的一个指标。减少等式右端的各项就减少了总的的CPI,从而提高IPC.
IPC:Instructions Per Cycle
(每个时钟周期完成的指令条数)
开发循环级并行的技术
循环展开(loop unrolling)技术
采用向量指令和向量数据表示
程序顺序:由源程序确定的在完全串行方式下指令的执行顺序。
:数据流和异常行为。
保持异常行为是指:无论怎么改变指令的执行顺序,都不能改变程序中异常的发生情况。
数据流:指数据值在产生结果的指令到使用结果的指令的实际流动。
分支指令使得数据流具有动态性,因为它让给定指令的数据可以有多个来源。
仅仅保持数据相关性是不够的,只有再加上保持控制顺序,才能够保持程序顺序。(因为一条指令可能数据相关于多条先前的指令)
静态调度
依靠 编译器对 代码进行静态调度,以减少相关和冲突。它不是在程序执行的过程中、而是在 编译期间进行代码调度和优化 ,对相关的处理方法在程序执行过程中始终不变。
通过把相关的指令拉开距离来减少可能产生的停顿。
动态调度
在程序的执行过程中,依靠 专门硬件对代码进行调度 ,减少数据相关导致的停顿。动态调度的基本思想
流水线的最大的局限性:
指令必须按序流出和按序执行
乱序执行基本思想:通过指令窗口按序保存多条指令,采用数据流技术,控制操作数就绪的指令优先执行(乱序执行)。异常处理比较复杂
动态调度要保持正确的异常行为:对于一条会产生异常的指令来说,只有当处理机确切地知道该指令将被执行后,才允许它产生异常。
即使保持了正确的异常行为,动态调度处理机仍可能发生不精确异常。
不精确异常:当执行指令i导致发生异常时,处理机的现场(状态)与严格按程序顺序执行时指令i的现场不同。
发生不精确异常的原因:
因为当发生异常(设为指令i)时:
流水线可能已经执行完按程序顺序是位于指令i之后的指令;流水线可能还没完成按程序顺序是指令i之前的指令。
精确异常:如果发生异常时,处理机的现场跟严格按程序顺序执行时指令i的现场相同。
Tomasulo算法
核心思想
记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小;
通过寄存器换名来消除WAR冲突和WAW冲突。寄存器换名是通过保留站和流出逻辑来共同完成的。
load缓冲器和store缓冲器(load1,load2,load3)
用于存放读/写存储器的数据或地址
load缓冲器的作用有3个:
存放用于计算有效地址的分量;
记录正在进行的load访存,等待存储器的响应;
保存已经完成了的load的结果(即从存储器取来的数据),等待CDB传输。
store缓冲器的作用有3个:
存放用于计算有效地址的分量;
保存正在进行的store访存的目标地址,该store正在等待存储数据的到达;
保存该store的地址和数据,直到存储部件接收。
优点
冲突检测逻辑是分布的
(通过保留站和CDB实现)
消除了WAW冲突和WAR冲突导致的停顿
流出---执行 ---写结果
动态分支预测技术:在程序运行时,根据分支指令过去的表现来预测其将来的行为。
分支预测的有效性取决于:
预测的准确性
预测正确和不正确两种情况下的分支开销
决定分支开销的因素:
流水线的结构
预测的方法
预测错误时的恢复策略等
采用动态分支预测技术的目的
预测分支是否成功
尽快找到分支目标地址(或指令)
(避免控制相关造成流水线停顿)
需要解决的关键问题
如何记录分支的历史信息;
如何根据这些分支的历史信息来预测分支的去向(甚至取到指令)。
(1)仅仅记录最近一次或最近几次的分支历史;
(2)记录分支成功的目标地址;
(3)记录分支历史和分支目标地址,相当于前
面两种方式的结合;
(4)记录分支目标地址的一条或若干条指令。
采用分支历史表 BHT 或分支预测缓冲器
预测错误两次,才会改变预测结果
两个步骤:
分支预测。
当分支指令到达译码段(ID)时,根据从BHT读出的信息进行分支预测 。
若预测正确,就继续处理后续的指令,流水线没有断流。否则,就要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令。
状态修改。
BHT方法只在以下情况下才有用:
判定分支是否成功所需的时间大于确定分支目标地址所需的时间。
如果预测错误或在BTB中没有匹配的项,要有至少2个时钟周期的开销。
因为:
①需要更新BTB中的项,要花费一个时钟周期;
②在更新BTB 中的项时,要停止取指令,那么取新的 指令又要花费一个时钟周期。
更快地获得分支目标处的指令;
可以一次提供分支目标处的多条指令,这对于多流出处理器是很有必要的;
使我们可以进行称为分支折叠(branch folding)的优化。
基于硬件的前瞻执行
允许指令乱序执行,但必须按程序顺序确认。
ROB中的每一项由以下4个字段组成:
指令类型
指出该指令是分支指令、store指令或寄存器操作指令。
目标地址
给出指令执行结果应写入的目标寄存器号(如果是
load和ALU指令)或存储器单元的地址(如果是store指
令)。
数据值字段
用来保存指令前瞻执行的结果,直到指令得到确认。
就绪字段
指出指令是否已经完成执行并且数据已就绪。
控制字段
设置ROB的某一项是否被占用
9