首页 《流水线中的相关》word版

《流水线中的相关》word版

举报
开通vip

《流水线中的相关》word版34流水线中的相关流水线中的相关是指相邻或相近的指令因存在某种关联,后面的指令不能在原指定的时钟周期开始执行。一般来说,流水线中的相关主要分为如下三种类型:1.结构相关:当硬件资源满足不了指令重叠执行的要求,而发生资源冲突时,就发生了结构相关。2.数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起数据相关。3.控制相关:当流水线遇到分支指令和其它能够改变PC值的指令时,就会发生控制相关。一旦流水线中出现相关,必然会给指令在流水线中的顺利执行带来许多问题,如果不能很好地解决相...

《流水线中的相关》word版
34流水线中的相关流水线中的相关是指相邻或相近的指令因存在某种关联,后面的指令不能在原指定的时钟周期开始执行。一般来说,流水线中的相关主要分为如下三种类型:1.结构相关:当硬件资源满足不了指令重叠执行的要求,而发生资源冲突时,就发生了结构相关。2.数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起数据相关。3.控制相关:当流水线遇到分支指令和其它能够改变PC值的指令时,就会发生控制相关。一旦流水线中出现相关,必然会给指令在流水线中的顺利执行带来许多问题,如果不能很好地解决相关问题,轻则影响流水线的性能,重则导致错误的执行结果。消除相关的基本方法是让流水线暂停执行某些指令,而继续执行其它一些指令。在后面的讨论中,我们约定:当一条指令被暂停时,在该暂停指令之后发射的所有指令都要被暂停,而在该暂停之前发射的指令则可继续进行,在暂停期间,流水线不会取新的指令。如果某些指令组合在流水线中重叠执行时,产生资源冲突,则称该流水线有结构相关。为了能够在流水线中顺利执行指令的所有可能组合,而不发生结构相关,通常需要采用流水化功能单元的方法或资源重复的方法。许多流水线机器都是将数据和指令保存在同一存储器中。如果在某个时钟周期内,流水线既要完成某条指令对数据的存储器访问操作,又要完成取指令的操作,那么将会发生存储器访问冲突问题(如图3.3.1所示),产生结构相关。为了解决这个问题,可以让流水线完成前一条指令对数据的存储器访问时,暂停取后一条指令的操作(如图3.3.2所示)。该周期称为流水线的一个暂停周期。暂停周期一般也称为流水线气泡,或简称为气泡。从图3.3.2可以看出,在流水线中插入暂停周期可以消除这种结构相关。图3.3.1由于存储器访问冲突而带来的流水线结构相关图3.3.2为消除结构相关而插入的流水线气泡也可以用如图3.3.3所示的时空图来表示上述暂停情况。图3.3.3由上可知,为消除结构相关而引入的暂停将影响流水线的性能。为了避免结构相关,可以考虑采用资源重复的方法。比如,在流水线机器中设置相互独立的指令存储器和数据存储器;也可以将Cache分割成指令Cache和数据Cache。假设不考虑流水线其它因素对流水线性能的影响,显然如果流水线机器没有结构相关,那么其CPI也较小。然而,为什么有时流水线设计者却允许结构相关的存在呢?主要有两个原因:一是为了减少硬件代价,二是为了减少功能单元的延迟。如果为了避免结构相关而将流水线中的所有功能单元完全流水化,或者设置足够的硬件资源,那么所带来的硬件代价必定很大。1.数据相关简介当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使得读/写操作顺序不同于它们非流水实现的顺序,这将导致数据相关。首先让我们考虑下列指令在流水线中的执行情况:ADDR1,R2,R3SUBR4,R5,R1ANDR6,R1,R7ORR8,R1,R9XORR10,R1,R11ADD指令后的所有指令都要用到ADD指令的计算结果,如图3.3.4所示,ADD指令在WB段才将计算结果写入寄存器R1中,但是SUB指令在其ID段就要从寄存器R1中读取该计算结果,这种情况就叫做数据相关。除非有 措施 《全国民用建筑工程设计技术措施》规划•建筑•景观全国民用建筑工程设计技术措施》规划•建筑•景观软件质量保证措施下载工地伤害及预防措施下载关于贯彻落实的具体措施 防止这一情况出现,否则SUB指令读到的是错误的值。所以,为了保证上述指令序列的正确执行,流水线只好暂停ADD指令之后的所有指令,直到ADD指令将计算结果写入寄存器R1之后,再启动ADD指令之后的指令继续执行。图3.3.4流水线的数据相关从图3.3.4还可以看到,AND指令同样也将受到这种相关关系的影响。ADD指令只有到第五个时钟周期末尾才能结束对寄存器R1的写操作,所以AND指令在第四个时钟周期从寄存器R1中读出的值也是错误的。而XOR指令则可以正常操作,因为它是在第六个时钟周期读寄存器R1的内容。另外,利用DLX流水线的一种简单技术,可以使流水线顺利执行OR指令。这种技术就是:在DLX流水线中,约定在时钟周期的后半部分进行寄存器文件的读操作,而在时钟周期的前半部分进行寄存器文件的写操作。在本章的图中,我们将寄存器文件的边框适当地画成虚线来表示这种技术。2.通过定向技术减少数据相关带来的暂停图3.3.4中的数据相关问题可以采用一种称为定向(也称为旁路或短路)的简单技术来解决(动画演示)。定向技术的主要思想是:在某条指令(如图3.3.4中的ADD指令)产生一个计算结果之前,其它指令(如图3.3.4中的SUB和AND指令)并不真正需要该计算结果,如果能够将该计算结果从其产生的地方(寄存器文件EX/MEM)直接送到其它指令需要它的地方(ALU的输入寄存器),那么就可以避免暂停。基于这种考虑,定向技术的要点可以归纳为:(1)寄存器文件EX/MEM中的ALU的运算结果总是回送到ALU的输入寄存器。(2)当定向硬件 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 到前一个ALU运算结果的写入寄存器就是当前ALU操作的源寄存器时,那么控制逻辑将前一个ALU运算结果定向到ALU的输入端,后一个ALU操作就不必从源寄存器中读取操作数。图3.3.5图3.3.4还表明,流水线中的指令所需要的定向结果可能并不仅仅是前一条指令的计算结果,而且还有可能是前面与其不相邻指令的计算结果,图3.3.5是采用了定向技术后上述例子的执行情况,其中寄存器文件和功能单元之间的箭头表示定向路径。上述指令序列可以在图3.3.5中顺利执行而无需暂停。图3.3.6上述定向技术可以推广到更一般的情况,可以将一个结果直接传送到所有需要它的功能单元。也就是说,一个结果不仅可以从某一功能单元的输出定向到其自身的输入,而且还可以从某一功能单元的输出定向到其它功能单元的输入。举例图3.3.7到数据存储器和ALU单元的定向路径在DLX中,任何流水线寄存器到任何功能单元的输入都可能需要定向路径。前面的一些数据相关的实例均是有关寄存器操作数的,但是数据相关也有可能发生在一对指令对存储器同一单元进行读写的时候。不过,本章仅讨论有关寄存器的数据相关。3.数据相关的分类根据指令对寄存器的读写顺序,可以将数据相关分为三类。习惯上,这些相关是根据流水线所必须保持的访问顺序来命名的。考虑流水线中的两条指令i和j,且i在j之前进入流水线,由此可能带来的数据相关有:图3.3.8(1)写后读相关(RAW:ReadAfterWrite)(命名规则):j的执行要用到i的计算结果,当它们在流水线中重叠执行时,j可能在i写入其计算结果之前就先行对保存该结果的寄存器进行读操作,从而得到错误的值。这是最常见的一种数据相关,图3.3.6和图3.3.7中采用定向技术消除的数据相关就属于这种类型。(2)写后写相关(WAW:WriteAfterWrite):j和i的目的寄存器相同,当它们在流水线中重叠执行时,j可能在i写入其计算结果之前就先行对该结果寄存器进行写操作,从而导致写入顺序错误,在目的寄存器中留下的是i写入的值,而不是j写入的值。如果在流水线中不只一个段可以进行写操作,或者当流水线暂停某条指令时,允许该指令之后的指令继续前进,就可能会产生这种类型的数据相关。由于DLX流水线只在WB段写寄存器,所以在DLX流水线中执行的指令不会发生这种类型的数据相关。如果我们对DLX流水线作如下改变,在DLX流水线中执行的指令就有可能发生WAW相关。首先,将ALU运算结果的写回操作移到MEM段进行,因为这时计算结果已经有效;其次,假设访问数据存储器占两个流水段。下面是两条指令在修改后的DLX流水线中执行的情况:图3.3.9可以看出,在修改后的DLX流水线中执行上述指令序列后,寄存器R1中的内容是第一条指令(LW)的写入结果,而不是ADD指令的写入结果。这就是由于WAW相关所带来的错误执行结果。(3)读后写相关(WAR:WriteAfterRead):j可能在i读取某个源寄存器的内容之前就先对该寄存器进行写操作,导致i后来读取到的值是错误的。由于DLX流水线在ID段完成所有的读操作,在WB段完成所有的写操作。所以,在DLX流水线中不会产生这种类型的数据相关。基于上面修改后的DLX流水线,考察下面两条指令的执行情况:SWR2,0(R5)IFIDEXMEM1MEM2WBADDR2,R3,R4IFIDEXWB如果SW指令在MEM2段的后半部分读取寄存器R2的值,ADD指令在WB段的前半部分将计算结果写回寄存器R2,则SW将读取错误的值,将ADD指令的计算结果写入存储器中。值得注意的是,在读后读(RAR:ReadAfterRead)的情况下,不存在数据相关问题。4.需要暂停的数据相关前面我们讨论了如何利用定向技术消除由于数据相关带来的暂停。但是,并不是所有数据相关带来的暂停都可以通过定向技术消除。举例图3.3.10LW指令不能将结果定向到SUB指令为了保证流水线正确执行上述指令序列,可以设置一个称为流水线互锁(pipelineinterlock)的功能部件。一旦流水线互锁检测到上述数据相关,流水线暂停执行LW指令之后的所有指令,直到能够通过定向解决该数据相关为止。图3.3.11图3.3.12为流水线互锁插入暂停后流水线数据通路;图3.3.13是加入暂停前后的流水线时空图。图3.3.12图3.3.13下面讨论如何利用编译器技术来减少这种必须的暂停,然后论述如何在流水线中实现数据相关检测和定向。5.对数据相关的编译器调度方法流水线常常会遇到许多种类型的暂停。比如,采用典型的代码生成方法对A=B+C这种常用的表达式进行处理,可以得到如图3.3.14所示的指令序列。从图3.3.14可以看出,在ADD指令的流水过程中必须插入一个暂停时钟周期,以保证变量C的读入值有效。既然定向无法消除指令序列中所包含的这种暂停,那么能否让编译器在进行代码生成时就消除这些潜在的暂停呢?图3.3.14A=B+C的DLX代码序列及其流水线实现时空图表示实际上,编译器的确可以通过重新组织代码顺序来消除这种暂停。通常称这种重新组织代码顺序消除暂停的技术为流水线调度(pipelinescheduling)或指令调度(instructionscheduling)。例3.6请为下列表达式生成没有暂停的DLX代码序列。假设载入延迟为1个时钟周期。a=b-c;d=e-f;解:调度前后的指令序列如表3.2所示。可以看出,两条ALU指令(ADDRa,Rb,Rc和SUBRd,Re,Rf)分别和两条Load指令(LWRc,c和LWRf,f)之间存在数据相关。为了保证流水线正确执行调度前的指令序列,必须在指令执行过程中插入两个时钟周期的暂停。但是考察调度后的指令序列不难发现,由于流水线允许定向,就不必在指令执行过程中插入任何暂停周期。表3.2调度前后的代码序列6.对DLX流水线控制的实现让一条指令从流水线的指令译码段(ID)移动到执行段(EX)的过程通常称为指令发射,而经过了该过程的指令为已发射的指令。对于DLX标量流水线而言,所有的数据相关均可以在流水线的ID段检测到,如果存在数据相关,指令在其发射之前就会被暂停。这样,我们可以在ID段决定需要什么样的定向,然后设置相应的控制。在流水线中较早地检测到相关,可以降低实现流水线的硬件复杂度,因为这样不必在流水过程中被迫将一条已经改变了机器状态的指令挂起。另外一种方法是在使用一个操作数的时钟周期开始(DLX流水线的EX和MEM段的开始)检测相关,确定必需的定向。为了说明这两种方法的不同,我们将以Load指令所引起的RAW相关为例,论述如何通过在ID段的检测来实现流水线控制,其中到ALU输入的定向路径可以在EX段。表3.3列出了流水线相关检测硬件可以检测到的各种相关情况。表3.3流水线相关检测硬件可以检测到的各种相关情况现在来看看如何实现流水线互锁。如果某条指令和Load指令有一个RAW相关时,该指令处于ID段,Load指令处于EX段。我们可以用表3.4来描述此时所有可能的相关情况。表3.4指令在ID段为检测是否需启动流水线锁而进行的三种比较一旦硬件检测到上述RAW相关,流水线互锁必须在流水线中插入暂停周期,使正处于IF和ID段的指令不再前进。另外,还必须暂停向前传送IF/ID寄存器组的内容,使得流水线能够保持被暂停的指令。对定向而言,虽然可能要考虑许多情况,但是定向逻辑的实现方法是类似的。实现定向逻辑的关键是,流水线寄存器不仅包含了被定向的数据,而且包含了目标和源寄存器域。从上面的讨论可知,所有定向都是从ALU或数据存储器的输出到ALU、数据存储器或0检测单元的输入的定向,我们可以分别将EX/MEM和MEM/WB段的寄存器IR同ID/EX和EX/MEM段中的寄存器IR相比较,决定是否需要定向,从而实现必需的定向控制。定向的控制硬件除了需要用比较器和组合逻辑来确定什么时候打开哪一条定向路径之外,还需要在ALU输入端采用具有多个输入的多路器,并增加相应的定向路径连接通路。改进图3.2.17中的相关硬件,可以得到图3.3.15,图中画出了所增设的定向路径。图3.3.15流水线增设的定向路径在DLX流水线上执行分支指令时,PC值有两种可能的变化情况。一种是PC值发生改变(为分支转移的目标地址);一种是PC值保持正常(等于其当前值加4)。如果一条分支指令将PC值改变为分支转移的目标地址,那么我们称分支转移成功;如果分支转移条件不成立,PC值保持正常,我们称分支转移失败。图3.3.16处理分支指令最简单的方法是:一旦在流水线中检测到某条指令是分支指令,就暂停执行该分支指令之后的所有指令,直到分支指令到达流水线的MEM段,确定了新的PC值为止。我们当然不希望流水线还没有确定某条指令是分支指令之前就暂停执行指令,所以对分支指令而言,当流水线完成其译码操作(ID段)之后才会暂停执行其后继指令。根据上述处理分支指令的方法,可以得到如图3.3.17所示的流水线时空图。从图中可以看出,在流水线中插入了两个暂停周期,当分支指令在MEM段确定新的PC值后,流水线作废分支直接后继指令的IF周期(相当于一个暂停周期),按照新的有效PC值取指令。显然,分支指令给流水线带来了三个时钟周期的暂停。图3.3.17简单处理分支指令的方法及其流水线时空图减少流水线处理分支指令时的暂停时钟周期数有如下两种途径:1.在流水线中尽早判断出分支转移是否成功;2.尽早计算出分支转移成功时的PC值(即分支的目标地址)。为了优化处理分支指令,在流水线中应该同时采用上述两条途径,缺一不可。即使知道分支转移的目标地址,而不知道分支转移是否成功对减少暂停也是徒劳的;知道分支转移是否成功,而不知道分支转移的目标地址,同样对降低分支损失毫无帮助。下面让我们看看如何基于这些思想,从硬件上改进DLX流水线,达到降低分支损失的目的。在DLX流水线中,分支指令(BEQZ和BENZ)需要测试分支条件寄存器的值是否为0,所以可以把测试分支条件寄存器的操作移到ID段完成,从而使得在ID周期末就完成分支转移成功与否的检测。另外,由于要尽早计算出两个PC值(分支转移成功和失败时的PC值),也可以将计算分支目标地址的操作移到ID段完成。为此,需要在ID段增设一个加法器(注意,为了避免结构相关,不能用EX段的ALU功能部件来计算分支转移目标地址)。图3.3.18是对DLX流水线进行上述改进后的流水线数据通路。容易看出,基于上述改进后的流水线数据通路,处理分支指令只需要一个时钟周期的暂停。表3.5列出了在改进后的流水线数据通路上处理分支指令的一些操作。图3.3.18为降低分支损失,对图3.2.17进行改进后的流水线数据通路表3.5改进后流水线的分支操作流水段分支指令操作IFIF/ID.IR←Mem[PC];IF/ID.NPC,PC←(ifID/EX.cond{ID/EX.NPC}else{PC+4});IDID/EX.A←Regs[IF/ID.IR6.10];ID/EX.B←Regs[IF/ID.IR11.15];ID/EX.NPC←IF/ID.NPC+(IR16)16##IR16.31;ID/EX.IR←IF/ID.IR;ID/EX.cond←(Regs[IF/ID.IR6.10]op0);ID/EX.Imm←(IR16)16##IR16.31;EXMEMWB对某些机器的流水线而言,由于检测分支条件和计算分支转移目标地址需要更长的时间,所以处理分支指令所带来的控制相关可能需要更多的时钟周期。一般来说,流水线越深,处理分支指令所带来的控制相关所需要的时钟周期数就越多。降低流水线分支损失的方法有许多种。前面论述了改进流水线硬件减少流水线暂停周期的方法。这里主要从编译技术的角度,论述四种降低流水线分支损失的简单方法。首先需要说明的是,这些方法对分支转移成功与否进行的预测都是静态的,并在整个程序的执行过程中保持这种预测结论,即:要么总是认为分支转移成功,要么总是认为分支转移失败。(1)冻结(freeze)或排空(flush)流水线的方法在流水线中,处理分支最简单的方法是冻结或排空流水线,保持或清除流水线在分支指令之后读入的任何指令,直到知道分支指令的目标地址以及分支转移是否成功为止。这种方法优点在于其对硬件和软件的要求都十分简单,我们前面采用的就是这种方法,这里也就不再赘述。(2)预测分支失败的方法如果流水线采用预测分支失败的方法处理分支指令,那么当流水线译码到一条分支指令时,流水线继续取指令,并允许该分支指令后的指令继续在流水线中流动。当流水线确定分支转移成功与否以及分支的目标地址之后,如果分支转移成功,流水线必须将在分支指令之后取出的所有指令转化为空操作,并在分支的目标地址处重新取出有效的指令;如果分支转移失败,那么可以将分支指令看作是一条普通指令,流水线正常流动,无需将在分支指令之后取出的所有指令转化为空操作。流水线采用预测分支失败方法处理分支指令的时空图如图3.3.19所示。图3.3.19基于预测分支失败方法的流水线时空图(3)预测分支成功的方法另一种降低流水线分支损失的方法便是预测分支成功,一旦流水线译码到一条指令是分支指令,且完成了分支目标地址的计算,我们就假设分支转移成功,并开始在分支目标地址处取指令执行。对DLX流水线而言,因为在知道分支转移成功与否之前,无法知道分支目标地址(0检测和计算分支目标地址均在ID段完成),所以这种方法对降低DLX流水线分支损失没有任何好处。而在某些流水线中,特别是那些具有隐含设置条件码或分支条件更复杂指令的流水线机器中,在确定分支转移成功与否之前,便可以知道分支的目标地址,这时采用这种方法便可以降低这些流水线的分支损失。(4)延迟分支(delayedbranch)方法为降低流水线分支损失而采用的第四种方法就是延迟分支方法。其主要思想是从逻辑上"延长"分支指令的执行时间。延迟长度为n的分支指令的执行顺序是:分支指令顺序后继指令1…顺序后继指令n如果分支成功,分支目标处指令所有顺序后继指令都处于分支延迟槽(branch-delayslots)中,无论分支成功与否,流水线都会执行这些指令。具有一个分支延迟槽的DLX流水线的时空图如图3.3.20所示。图3.3.20基于延迟分支方法的流水线时空图从该图可以看出,基于延迟分支方法,无论分支成功与否,其流水线时空图所描述的流水线的行为是类似的,流水线中均没有插入暂停周期,从而极大地降低了流水线分支损失。从该图也可以看出,实际上是处于分支延迟槽中的指令"掩盖"了流水线原来所必需插入的暂停周期。那么将什么指令放入分支延迟槽中呢?选择放入分支延迟槽中的指令必须遵循有效和有用两个原则,这也是一种指令调度技术。三种调度分支延迟指令的常用方法如图3.3.21所示,表3.6说明了这三种指令调度方法的特点及其局限性。图3.3.21调度分支延迟指令的三种常用方法表3.6调度分支延迟指令的三种常用方法的特点及其局限性调度策略对调度的要求对流水线性能改善的影响从前调度分支必须不依赖于被调度的指令。总是可以有效提高流水线性能。从目标处调度如果分支转移失败,必须保证被调度的指令对程序的执行没有影响,可能需要复制被调度指令。分支转移成功时,可以提高流水线性能。但由于复制指令,可能加大程序空间。从失败处调度如果分支转移成功,必须保证被调度的指令对程序的执行没有影响。分支转移失败时,可以提高流水线性能。从图3.3.21和表3.6可以看出,调度延迟分支指令的方法可以降低流水线分支损失,但是它受限于被调度进入分支延迟槽中的指令,以及编译器预测分支转移是否成功的能力。为了提高编译器填充分支延迟槽的能力,许多流水线机器引入了或作废分支。对取消分支而言,分支指令包含了预测的分支方向,当实际分支方向和事先所预测的一样,执行分支延迟槽中的指令,流水线正常工作;当实际分支方向和事先所预测的不同,就将分支延迟槽中的指令转化成一个空操作,图3.3.22给出了取消分支在分支转移成功和失败两种情况下的行为。图3.3.22取消分支的行为依赖于实际的分支方向特别声明:1:资料来源于互联网,版权归属原作者2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。2k
本文档为【《流水线中的相关》word版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
爱笑的小黑贼
暂无简介~
格式:doc
大小:49KB
软件:Word
页数:12
分类:
上传时间:2022-12-21
浏览量:0