系统结构第五章 | 指令级并行硬件方法

  1.  指令级并行(ILP)是指指令之间存在的一种并行性,利用它,计算机可以并行执行两条或两条以上的指令。开发指令级并行是提高计算机性能的一种重要方法,近十多年推出的计算机几乎都采用了这种技术。

  2. 流水线实际CPI=理想CPI+三种停顿(结构数据控制冲突)带来的CPI

  3. IPC=1/CPI,每周期执行指令数

  4. 循环级并行性LLP:循环的不同迭代之间存在的并行性。

  5. 回顾之前内容,如果两条指令相关,它们就不能并行执行或只能部分重叠执行。相关有三种类型:数据相关、名相关、控制相关。 流水线冲突是指对于具体的流水线来说,由于相关的存在使得指令流中的下一条指令不能在指定的时钟周期执行。流水线冲突有三种类型是结构、数据、控制冲突。相关是程序固有的一种属性反映了程序中指令之间的相互依赖关系,而具体的某一次相关是否会导致实际冲突的发生以及该冲突会带来多长的停顿则是流水线的属性。

  6. 数据相关限制了所能开发的ILP,本章论述的主要内容之一就是如何克服这些限制。可以从两个方面解决相关问题:a. 保持相关但避免发生冲突 b. 进行代码变换消除相关。

  7. 第三章通过编译器静态指令调度的方法属于6.a本章将论述动态调度代码的硬件方法,而且我们还可以看到有些类型的相关是可以消除的。

  8. 由于相关的存在,必须保持所谓的程序顺序(程序顺序:由原来程序确定的在完全串行方式下指令的执行顺序),但是,并不需要在所有相关的地方都保持程序顺序,后面介绍的方法只有在可能会带来错误的地方才去保持。

  9. 对于提高性能来说,控制相关本身并不是一个主要的限制。如果控制相关走错了路执行了本来不该执行的指令但是对程序的正确性没有影响,那么完全可以这么做(如果有好处的话,这就是赌狗),因此控制相关不是一个必须严格保持的关键属性。为了保持程序执行的正确性,必须保持的最关键属性是数据流和异常行为。

  10. 保持异常行为是指:无论怎么改变指令的执行顺序,都不能改变程序中异常的发生情况。也就是说原来程序是怎么发生的改变执行顺序后应该还是那样发生。常被弱化为:改变指令顺序不能发生新的异常。

  11. 数据流是指数据值从其生产者指令到其消费者指令的实际流动。分支指令的执行结果又是可能决定了哪个才是真生产者。

  12. 有时不遵守控制相关既不影响异常行为也不会改变数据流,那么就可大胆的指令调度,把失败分支中的指令调度到分支指令前。p114

  13. 与静态调度不同,动态调度是在程序的执行过程中,依靠专门硬件对代码进行调度。动态调度能在保持数据流和异常行为的情况下通过硬件对指令执行顺序进行重新安排,减少数据相关导致的停顿。动态调度有两个优点一是能处理在编译时情况不明的相关,二是能使某一面向特定流水线的优化编译的代码在其他流水线上也能高效执行。

  14. 第三章的五段流水线存在一个问题就是指令都是按序流出按序执行,一个停顿会导致所有的指令停止前进,从而造成资源浪费使得系统效率低下。如果可以不按照程序顺序去执行指令就能进一步提高性能。

  15. 在原来的五段流水线中,结构冲突和数据冲突都在译码ID段检测,只有两个冲突都不存在,指令才能流出,我们将指令流出的工作进一步细化为检测结构冲突(流出)和等待数据冲突消失(读操作数)两个步骤,只要没有结构冲突就让指令流出,然后一旦操作数就绪就可以立即执行。就可以使得p115中的例子SUB.D不被阻塞,这样修改后流水线是按序流出、乱序执行和乱序完成的。

  16. 乱序完成大大增加了异常处理的复杂度。所以动态调度的处理机通过:对于一条会产生异常的指令来说,只有当处理机确切地知道该指令将被执行时,才允许它产生异常(不执行不异常)。来保持正确的异常行为。

  17. 精确异常与不精确异常:精确异常是指异常发生时的现场与顺序执行时的现场完全一致。不精确异常产生的原因可能是流水线可能已经执行完按程序顺序位于当前指令之后的指令或还没完成按程序顺序位于当前指令之前的指令。一句话说就是由于乱序执行导致的。

  18. 一种典型的动态调度算法——记分牌算法。采用一个称为记分牌的硬件实现对指令的动态调度。该硬件维护着三张表分别用于记录指令的执行状态、功能部件状态、寄存器状态以及数据相关关系等,且按照之前描述将ID段划分为流出和读操作数两个段。

    记分牌算法的目标是在没有结构冲突时尽可能早地执行没有数据冲突的指令,实现每个时钟周期执行一条指令。如果某条指令被暂停,而后面的指令与流水线中正在执行或被暂停的指令都不相关,那么这些指令就可跨越它们继续流出和执行下去。

    每条指令都要经过记分牌,由记分牌负责相关检测并控制指令的流出和执行。指令流出时,记分牌在表中记录相关信息,并决定什么时候该指令可以读出操作数和开始执行,如果确定不能开始执行,记分牌会监视硬件中信息的每一个变化,一旦就绪立即执行。

    记分牌流水线的处理步骤:每条指令分为4段(流出、读操作数、执行和写结果,为什么没有访问存储器阶段?因为此处主要考虑浮点运算)

    流出段:如果功能部件空闲且所有其他正在执行的指令的目的寄存器与该指令的不同,则流出并修改记录表。也就是存在结构相关或WAW冲突时不流出,在流出段就避免了以上两个冲突。

    读操作数段:记分牌检测源操作数的可用性,如果可用就通知功能部件开始取数执行。动态解决了RAW冲突并导致程序可以开始乱序执行。如何检测操作数的可用性:如果所有前面已流出且还在执行的指令都不再对该寄存器进行写操作,那么数据可用。

    执行:取数后立即执行,产生结果后通知记分牌它已经完成(但不写回,相当于五段流水线中的EX阶段)。

    写结果:记分牌检测是否存在WAR冲突,如果没有冲突或冲突已消失,记分牌就通知功能部件把结果写入目的寄存器。(比如前序指令还没读,对应的寄存器要被写了)

    p120例子

    记分牌性能受限于:a. 代码中可开发的并行性,即是否存在可以并行执行的不相关的指令。b. 记分牌的容量,记分牌的容量决定了流水线能在多大范围内寻找不相关指令。c. 功能部件的数目和种类。d. 反相关和输出相关。bc可以通过增加硬件配置解决,但是同样会导致处理器成本增加。乱序流出的指令也会在流水线中引起更多的名相关,倘若采用分支预测技术,会更加严重。

  19. 另一种典型的动态调度算法——Tomasulo算法。是现在的主流做法。核心思想是a.记录和检测指令相关,操作数一旦就绪立即执行 b.通过寄存器换名来消除WAR和WAW冲突。

    Tomasulo算法在运算部件的入口设置了保留站,每个保留站有一个标识唯一标识了保留站,在每一条指令流出到保留站的时候,如果源数据数已经就绪,则将之取到保留站中,如果尚未就绪,就把保留站中的记录改为产生这个数据的保留站标识。数据的传送通过一条公共数据总线CDB进行,所有功能部件产生的数据都送到CDB上,CDB连接到除了load缓冲器以外的所有部件入口。

    寄存器换名的操作是通过 保留站和流出逻辑来共同完成的。当指令流出时,如果操作数还没有就绪,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站标识,这一步完成了实质上的换名,将原先以寄存器号为名的地方,改为了以真实数据为名,不再与寄存器有关。在等待的保留站产生结果以后,就直接广播送数据不用经过寄存器。

    Tomasulo算法的流程:

    a. 流出:从指令队列的头部取一条指令如果指令对应的保留站有空闲的则进站,并且如果源操作数中已有就绪就将操作数送保留站,如果操作数还没有就绪,就将产生操作数的标识送保留站,这一步实际上进行换名,消除了WAR冲突,同时,也完成了写操作的预约,确保了写顺序按照指令流出的顺序进行,消除了WAW冲突。但是如果保留站不够,指令则不能流出,这属于结构冲突。

    b. 执行:如果某个操作数还没有计算出,保留站将监视CDB,等待所需结果,一旦结果上CDB,保留站将立即获得然后开始执行。不同功能部件可以立即执行,但是同一功能部件只能串行执行。

    c. 写结果:功能部件计算完毕之后,要将计算结果放到CDB上,所有等待该计算结果的寄存器和保留站(包括store缓冲器)都同时从CDB上获得需要的数据,store指令在此步完成存储器写入。

  20. 在第三章中学习过一些固定的分支预测方法,预测成功或延迟分支,在这里还要讨论的是动态分支预测的技术,通过在程序运行过程中,根据分支指令过去的表现来预测将来的行为。如果分支行为发生了变化,预测结果也就跟着改变。有着更好的预测准确度和适应性。

  21. 采用动态分支预测技术的目的有二:a. 预测分支是否成功,b. 尽快找到分支目标地址(或指令)避免流水线停顿。需要解决两个关键问题,一是怎样才能记录下分支的历史信息和要记录哪些信息,二是在预测错误时如何作废已经预取和分析的指令恢复现场并从另一条分支路径重新取指。

  22. 采用分支历史表BHT。分支历史表法是最简单的动态分支预测方法。

    917609f9a978a07c5fb3aea2860ba762.png

    通过一个简单的状态机来记录。(测试表明两位以上的分支预测性能与两位其实妹差,所以大多数都是采用两位来做预测的)根据分支历史表,遇到分支的时候就按照表的指引去做,如果预测失败,就作废已经预取的指令,恢复现场,如果预测成功那流水线就没有断流,就可以继续运行。

    但是还记得上面的两个目的么,我们只实现了第一目的(预测分支是否成功),却忽视了第二目的(尽快找到分支目标地址),所以BHT方法只有在判定分支成功所需的时间大于确定分支目标地址所需的时间的时候才管用,不然可能反而浪费了时间在去确定分支目标地址上(假设当前预测分支成功,然后先去确定了分支目标地址,却失败了,其实只需要顺序执行而不需确定,那就浪费了时间)。

  23. 采用分支目标缓冲器BTB。BHT方法是在ID段对BHT进行访问,在ID段的末尾才能获得目标分支地址、顺序下一条指令地址以及分支预测的结果。如果能在提前一拍,在IF段就能知道这些信息那么分支开销就可以减小为0,采用BTB能够实现这一点。BTB可以被看做使用专门的硬件实现的一张表格,里面记录着执行过的成功分支指令的地址和预测的分支目标地址。

    365ec585926ddffd4d470194df4b83e1.png

  24. 如果在表中匹配到了当前指令,我们就可以知道该指令是分支指令而且上一次执行结果是分支成功,然后就据此可以预测这次执行也将分支成功,目标地址由表中第二个字段给出。如果没有匹配,那么将本条指令视作一条普通指令来执行。如果匹配+预测正确,赢麻,继续执行,不会停顿,如果匹配+预测错误,作废、从失败处取值、删除BTB项,导致2周期延迟,如果未匹配+成功分支,写入BTB表,导致2周期延迟,如果未匹配+未成功分支,正常执行,无事发生。如下图。

    31758fe75523ad7718100a798a147864.png

  25. BTB和BHT可以巧妙地结合在一起,在BTB中再加入一个分支历史表,也可以在BTB中存放多条目标指令,从而有可能一次提供多条分支目标指令,对多流出处理器来说是很有必要的。

  26. 基于硬件的前瞻执行。控制相关已经成为开发更多ILP的主要障碍,前瞻执行就是猜测分支指令结果然后假设这个猜测总是对的继续取、流出、执行后续指令,但是执行的结果写入到一个“再定序缓冲器”中,不写入寄存器或存储器,确保没有进行不可恢复的写操作,以便在猜测错误的情况下能够恢复原来现场。

  27. 多指令流出技术。前面的技术所考虑的都是单指令流出的情况,CPI不可能小于1,所作的工作仅是将CPI尽可能接近于1,要使得CPI能小于1,那就必须采用多流出技术,在每个时钟周期流出多条指令。

    多流出处理机有两种基本风格:a. 超标量,在每个时钟周期流出的指令条数不固定依代码具体情况而定但存在上限,若上限为n,则称该处理机为n-流出。指令调度可以动态和静态。b. 超长指令字VLIW技术,在每个时钟周期流出的指令条数是固定的,这些指令构成一条长指令或者一个指令包,指令调度由编译器静态完成。

    462ce4b2f20c07073859da337b803449.png

  28. 超长指令字技术:把能并行执行的多条指令组成一条很长的指令(100多位到几百位长度)。设置多个功能部件且指令字分割为一些字段,每个字段称为一个操作槽,直接独立地控制一个功能部件。VLIW存在的问题有,a.程序代码长度增加了,比如为了提高并行性而进行了大量的循环展开,由于代码限制指令字中的操作槽也并非总能填满等。对于该缺点解决方法可以采用指令共享立即数字段或者采用指令压缩存储等方法,b.采用了锁步机制,任何一个操作部件出现停顿对应整个处理机都要停顿,因为所有的功能部件是同步操作的。解决该问题可以设置适当硬件动态检测机制。c.机器代码的不兼容性。

  29. 指令多流出处理器受到a.程序所固有的指令级并行性,这也是最根本的因素,需要有大量可以并行执行的操作才能避免流水线停顿,难以实现流水线的充分忙碌,b.硬件实现上的困难,多流出处理器需要大量的硬件资源,c.超标量和超长指令字处理器固有的技术限制 三个方面的影响。

  30. 超流水线处理机。超流水线处理机与超标量处理机采用重复设置硬件提高性能的方式不同,超流水线处理机只需要添加少量的硬件,通过把流水段进一步细分,使得各个功能段在一个时钟周期内能分时流出多条指令,通过各部分硬件的充分重叠工作来利用时间并行性提高性能。对于一台每个时钟周期能流出n条指令的超流水处理机来说,实际上的流水线周期为1/n个时钟周期(n为该超流水处理机是n流出的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值