近期因相关课程须要完成一个关于指令级并行(ILP)的汇报,个人主题为“以动态调度、多发射和推测来开发ILP”,是教材《计算机体系结构——量化研究方法》的第三章第九节内容,这里记录下来,用于之后回顾。
笔记分为如下几个部分:算法
首先来介绍一下什么是流水线以及使用流水线所产生的一些问题设计
流水线是一种用来将多个指令重叠执行的技术。
上图是一个简单的例子,不使用流水线技术时,处理器每800ps完成一条指令,为了提升执行指令的吞吐量,将指令的执行划分为五个阶段(取指、译码、执行、访存、写回)并添加相应的运算单元后,处理器就能够重叠执行指令了,如上图中的第二张图所示,修改后的流水线每200ps就能够执行完一条指令,提升了吞吐量,能够看到流水线只是提升了处理器执行指令的吞吐量,并无减少天天指令的执行周期,第二张图中执行每条指令仍是须要800ps。
这里插入简单介绍一些经典五级流水线每一个阶段:blog
可是指令之间会存在一些数据相关等问题,因此流水线技术也会有一些局限性,接下来介绍三种常见的流水线冒险排序
上图是一个经过旁路技术来解决写后读问题的例子,第一条指令修改了寄存器s0的数据,第二条指令须要读取s0的数据,旁路技术经过在获得s0数据的那个周期,直接将数据经过一个旁路送到须要这个数据的地方,能够看那条蓝色的线路,正常状况下第一条指令须要在WB阶段才能修改s0的值,但经过旁路,能够在EX阶段得到数据后直接送到第二条指令的译码(ID)阶段,避免产生停顿。接口
上图是另一个例子,因为这个例子中第一条指令是一个载入指令,必需要等到MEM阶段才能获得数据,可是第二条指令在EX阶段就要使用数据了,咱们没法将将来的数据送给如今,因此这种状况下没法使用旁路技术,因此能够看见两条指令间有一个停顿,即蓝色的气泡(bubble)。开发
上图是使用分支预测来解决分支冒险的例子,第二条指令须要一个判断,而判断的结果不能很快获得,为了避免产生停顿,因此处理器预测这条指令不会跳转,因此处理器继续执行第三条指令而不是停顿等待结果,分支预测简单的说就是为了避免停顿,因此就预测一个结果,让处理器先去执行那条预测的指令,分支预测技术还有其余的细节,若是感兴趣能够去阅读教材,这里不是重点。io
上图中分支预测失败,因此对中止执行以前预测获得的指令,即简单的插入气泡,而后去执行正确的指令。基础
关于延迟分支技术,简单来讲就是在分支解析的时候,去执行一条与分支无关的指令来避免流水线停顿。扩展
这里不会过多介绍动态调度,个人重点在推测和多发射,这里主要列举动态调度的特色:软件
动态调度的执行指令过程分为发射、执行、写结果三个部分。
推测技术主要是为了克服控制相关的限制,去开发更多的ILP。
思想:
特色:
咱们来看一下基于硬件推测的基本结构图:
其中红色框是在动态调度结构的基础上进行改变的部分,黄色框是动态调度结构的重点部分,接下来进行解释。
重排序缓冲区(reorder buffer,简称ROB):这是推测新加入的一个硬件,由于有了ROB,在推测的指令执行过程当中的写结果后又多加了一个指令提交,因此推测下的指令执行有四部分,分别是发射、执行、写结果和提交。ROB中扩展了寄存器集,会在必定时间内保存指令的结果,这段时间从完成该指令的相关运算算起,到该指令提交完毕为止,寄存器和存储器只有在指令提交以后才会被更新(即咱们很是肯定该指令会被执行),所以ROB是在指令执行完毕到指令提交这段时间内提供操做数。ROB相似于Tomasulo算法中的存储器缓冲区,因此将载入缓冲区(load buffers,第二个红色框)旁边的存储器缓冲区集成到ROB中了。
保留站(reservation stations,简称RS):保留站提供了寄存器重命名功能,解决了WAR和WAW问题,它为等待发射的指令缓冲操做数,基本思想是:保留站在一个操做数可用时立刻提取并缓冲它,这样就再也不须要从寄存器中获取该操做数。此外,等待执行的指令会指定保留站,为本身提供输入。最后,在对寄存器连续进行写入操做而且重叠执行时,只会实际使用最后一个操做更新寄存器。在发射指令时,会将待用操做数的寄存器说明符改名,改成保留站的名字,这就实现了寄存器重命名功能。
公共数据总线(common data bus,简称CDB):CDB将操做数从保留站中传递给全部须要它的功能单元,而不须要通过寄存器,加快了指令的执行。
上图是一些指令在执行过程当中的某一个时刻的状况,其中最上面的两条指令是在动态调度状况下的执行状况,它们分别指向在推测状况下的执行状况,能够看出,在动态调度下,由于乱序执行,这两个指令已经执行结束并写入寄存器了。而在推测下一样的指令已经完成了执行,但因为这两条指令以前的MUL.D指令还未完成指令提交,因此这两条指令也不容许完成指令提交。
这一区别意味着具备ROB的处理器能够在维持精确异常的同时动态执行代码。
多发射处理器的目标就是容许在一个时钟周期中发射多条指令,分为如下三类:
它们的区别在于,静态调度采用循序(也就是顺序)执行,动态调度采用乱序执行,它们在每一个周期发射的指令数是可变的,而VLIW处理器每一个时钟周期发射固定数目的指令。
上图是一个简单的循环例子,在不使用任何技术的状况下,执行一次循环并获得一个结果须要9个周期。
上图代码使用了循环展开和静态调度技术,获得一个结果须要3.5个周期。
上图代码使用了循环展开、静态调度和VLIW技术,获得一个结果须要1.29个周期。
上图对几种不一样处理器所使用的技术和各自的应用进行了总结。
最后咱们将动态调度、推测和多发射技术结合起来,基本结构以下:
能够看到这个结构在推测的结构的基础上增添了浮点乘法单元和整数单元,支持了具备分离整数、载入/存储和浮点单元的多发射超标量流水线。
这篇文章大体介绍了以动态调度、推测和多发射技术来开发ILP的基本概念,须要读者了解基本的五级流水线和动态调度技术,更多的细节能够参考我在文章开头说到的教材。
参考: