指令级并行

指令级并行

流水线提高的是指令带宽(吞吐率),而不是单条指令的执行速度
相关限制了流水线性能的发挥
    结构相关:需要更多的硬件资源
    数据相关:需要定向,编译器调度
    控制相关:尽早检测条件,计算目标地址,延迟转移,预测
增加流水线的级数会增加相关产生的可能性
异常,浮点运算使得流水线控制更加复杂
编译器可降低数据相关和控制相关的开销
    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

猜你喜欢

转载自blog.csdn.net/liudongdong19/article/details/80761637