第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线

上传人:今*** 文档编号:107030749 上传时间:2019-10-17 格式:PPT 页数:111 大小:1.95MB
返回 下载 相关 举报
第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线_第1页
第1页 / 共111页
第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线_第2页
第2页 / 共111页
第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线_第3页
第3页 / 共111页
第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线_第4页
第4页 / 共111页
第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线》由会员分享,可在线阅读,更多相关《第5章标量处理机(5.4,5.5,5.6) 流水线的冲突mips流水线(111页珍藏版)》请在金锄头文库上搜索。

1、5.4 流水线的相关与冲突,5.4.1 一条经典的5段流水线 5.4.2 相关与流水线的冲突,介绍一条经典的5段RISC流水线 首先讨论在非流水情况下是如何实现的 一条指令的执行过程分为以下5个周期: 取指令周期(IF) 以程序计数器PC中的内容作为地址,从存储器中取出指令并放入指令寄存器IR; 同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。,5.4 流水线的相关与冲突,5.4.1 一条经典的5段流水线,指令译码/读寄存器周期(ID) 对指令进行译码,并读出寄存器的内容。用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数。由于指令的立即数部分也保存在相同的位置,需要扩展

2、立即数的操作也在本段完成。 执行/有效地址计算周期(EX) 不同指令所进行的操作不同: load和store指令:ALU把指令中所指定的寄存器的内容与偏移量相加,形成访存有效地址。 寄存器寄存器ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的数据进行运算。,寄存器立即数ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的操作数和指令中给出的立即数进行运算。 分支指令:ALU把指令中给出的偏移量与PC值相加,形成转移目标的地址。同时,对在前一个周期读出的操作数进行判断,确定分支是否成功。 存储器访问分支完成周期(MEM) 该周期处理的指令只有load、store和分支指令

3、。 其它类型的指令在此周期不做任何操作。,load和store指令 load指令:用上一个周期计算出的有效地址从存储器中 读出相应的数据; store指令:把指定的数据写入这个有效地址所指出的存 储器单元。 分支指令 分支“成功”,就把转移目标地址送入PC。 分支指令执行完成。,写回周期(WB) ALU运算指令和load指令在这个周期把结果数据写入通用寄存器组。 ALU运算指令:结果数据来自ALU。 load指令:结果数据来自存储器。 在这个实现方案中: 分支指令需要4个时钟周期(如果把分支指令的执行 提前到ID周期,则只需要2个周期); store指令需要4个周期; 其它指令需要5个周期才能

4、完成。 在更先进的实现中,在ID段完成对寄存器的内容进行比较,判断是否为转移指令,若为真,将PC与带符号的位移量相加,生成的转移目标地址写人PC,在ID段完成对转移的处理。,将上述实现方案修改为流水线实现 一条经典的5段流水线 每一个周期作为一个流水段; 在各段之间加上锁存器(流水寄存器)。,流水寄存器保证了流水线中不同段的指令不会相互影响。每个时钟周期结束之后,该段的所有执行结果都保存在流水段寄存器中,在下一个时钟周期开始作为下一个段的输入。,第一种描述(类似于时空图),5段流水线的两种描述方式,流水线的实现必须关注:,需要确定处理器在每一个时钟周期都进行什么样的动作。 要保证在同一个周期没

5、有两条指令使用相同的数据通路资源。 可以采用流水线方式下简化的RISC数据通路图来表示:,第二种描述(按时间错开的数据通路序列),采用流水线方式实现时,应解决好以下几个问题: 要保证不会在同一时钟周期要求同一个功能段做 两件不同的工作。 例如:不能要求ALU同时做有效地址计算和算术运算。 避免IF段的访存(取指令)与MEM段的访存(读/写数据)发生冲突。 可以采用分离的指令存储器和数据存储器; 一般采用分离的指令Cache和数据Cache。 ID段和WB段都要访问同一寄存器文件。 ID段:读 WB段:写,寄存器堆在ID段被读,在WE段被写,所以在数据通路中出现两次,对于在一个时钟周期内同一寄存

6、器堆进行操作,在时钟的前半部分进行写寄存器的操作,后半部分进行读寄存器的操作。,如何解决对同一寄存器的访问冲突? 把写操作安排在时钟周期的前半拍完成,把读操作安排在后半拍完成。边框画实线表示操作,画虚线表示不做任何操作。,考虑PC的问题 流水线为了能够每个时钟周期启动一条新的指令,就必须在每个时钟周期进行PC值的加4操作,并保留新的PC值。这种操作必须在IF段完成,以便为取下一条指令做好准备。 (需设置一个专门的加法器) 但分支指令也可能改变PC的值,而且是在MEM段进行,这会导致冲突。 请考虑一下,如何处理分支指令?,相关:两条指令之间存在某种依赖关系。 如果两条指令相关,则它们就有可能不能

7、在流 水线中重叠执行或者只能部分重叠执行。,5.4.2.1 相关与流水线冲突,5.4.2 相关与流水线冲突,流水线冲突是指对于具体的流水线来说,由于相关 的存在,使得指令流中的下一条指令不能在指定的时钟 周期执行。 流水线冲突有3种类型: 结构冲突:因硬件资源满足不了指令重叠执行的要 求而发生的冲突。 数据冲突:当指令在流水线中重叠执行时,因需要 用到前面指令的执行结果而发生的冲突。 控制冲突:流水线遇到分支指令和其它会改变PC值 的指令所引起的冲突。,流水线冲突,导致错误的执行结果。 流水线可能会出现停顿,从而降低流水线的效率和实际的加速比。 我们约定 当一条指令被暂停时,在该暂停指令之后流

8、出的所有指令都要被暂停,而在该暂停指令之前流出的指令则继续进行(否则就永远无法消除冲突)。,带来的几个问题:,在流水线处理机中,为了能够使各种组合的指令 都能顺利地重叠执行,需要对功能部件进行流水 或重复设置资源。 如果某种指令组合因为资源冲突而不能正常执 行,则称该处理机有结构冲突。 常见的导致结构冲突的原因: 功能部件不是完全流水 资源份数不够,结构冲突,结构冲突举例:访存冲突 有些流水线处理机只有一个存储器,将数据 和指令放在一起,访存指令会导致访存冲突。 解决办法:插入暂停周期 (“流水线气泡”或“气泡”) 引入暂停后的时空图 解决方法: 设置相互独立的指令存储器和数据存储器 或设置相

9、互独立的指令Cache和数据Cache。,由于访问同一个存储器而引起的结构冲突,访存冲突,返回,为消除结构冲突而插入的流水线气泡,引入暂停后的时空图,有时流水线设计者允许结构冲突的存在 主要原因:减少硬件成本 如果把流水线中的所有功能单元完全流水化,或者重复设置足够份数,那么所花费的成本将相当高。,数据冲突 当相关的指令靠得足够近时,它们在流水线中 的重叠执行或者重新排序会改变指令读/写操作数 的顺序,使之不同于它们串行执行时的顺序,则发 生了数据冲突。,举例: DADD R1,R2,R3 DSUB R4,R1,R5 XOR R6,R1,R7 AND R8,R1,R9 OR R10,R1,R1

10、1,流水线的数据冲突举例,ADD在WB段写R1,SUB则在ID段读R1,产生了数据相关。XOR也受到数据相关的影响 AND操作由于前半个周期写寄存器对,后半个周期读寄存器堆,可以正确执行。 OR操作也能正确执行,此时R1的值已经被正确写人,根据指令读访问和写访问的顺序,可以将数据冲 突分为3种类型。 考虑两条指令i和j ,且i在j之前进入流水线, 可能发生的数据冲突有: 写后读冲突(RAW) 在 i 写入之前,j 先去读。 j 读出的内容是错误的。 这是最常见的一种数据冲突,它对应于真数据相关。,数据冲突的三种类型,写后写冲突(WAW) 在 i 写入之前,j 先写。 最后写入的结果是 i 的。

11、错误! 这种冲突对应于输出相关。 写后写冲突仅发生在这样的流水线中: 流水线中不只一个段可以进行写操作; 指令被重新排序了。 前面介绍的5段流水线不会发生写后写冲突。 (只在WB段写寄存器),读后写冲突(WAR) 在 i 读之前,j 先写。 i 读出的内容是错误的! 由反相关引起。 这种冲突仅发生在这样的情况下: 有些指令的写结果操作提前了,而且有些指令 的读操作滞后了; 指令被重新排序了。,通过定向技术减少数据冲突引起的停顿 (定向技术也称为旁路或短路) 关键思想:在计算结果尚未出来之前,后面等待使用该结果的指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其它指令需

12、要它的地方,那么就可以避免停顿。 采用定向技术消除上例中的相关 DSUB操作是在DADD操作产生了结果之后才使用该结果的,考虑将DADD的结果从EX/MEM寄存器移到DSUB需要的地方,也就是ALU的输入锁存器,则不需要引入停顿。,采用定向技术后的流水线数据通路,工作过程演示,定向的实现 EX段和MEM段之间的流水寄存器中保存的ALU运算结果总是回送到ALU的入口。 当定向硬件检测到前一个ALU运算结果写入的寄存器就是当前ALU操作的源寄存器时,那么控制逻辑就选择定向的数据作为ALU的输入,而不采用从通用寄存器组读出的数据。 在使用直通时,如果DSUB操作被停顿,那么DADD操作将被完整执行,

13、没有必要激活旁路。当两个操作之间有一个中断也是如此。,直通的实现,直通思想可以一般化:可以将结果直接送到需要它的单元,并不限制在同一个单元的输出到输入。,并不是所有的数据冲突都可以用定向技术来解决。 举例:,LD R1,0(R2) DADD R4,R1,R5 AND R6,R1,R7 XOR R8,R1,R9,增加流水线互锁机制,插入“暂停”。 作用:检测发现数据冲突,并使流水线停顿,直至 冲突消失。 举例:演示A(资源图表示) 演示B(时空图表示),需要停顿的数据冲突,无法将LD指令的结果定向到DADD指令,采用定向无法解决,返回,依靠编译器解决数据冲突 让编译器重新组织指令顺序来消除冲突,

14、这种技术称为指令调度或流水线调度。,举例: 请为下列表达式生成没有暂停的指令序列: ABC ; DEF ; 假设载入延迟为1个时钟周期。 题解,控制冲突 执行分支指令的结果有两种 分支成功:PC值改变为分支转移的目标地址。 在条件判定和转移地址计算都完成后,才改变PC值。 不成功或者失败:PC的值保持正常递增, 指向顺序的下一条指令。 处理分支指令最简单的方法: “冻结”或者“排空”流水线 优点:简单 前述5段流水线中,改变PC值是在MEM段进行的。 给流水线带来了3个时钟周期的延迟,控制冲突,简单处理分支指令:分支成功的情况,把由分支指令引起的延迟称为分支延迟。 分支指令在目标代码中出现的频

15、度 每34条指令就有一条是分支指令。 假设:分支指令出现的频度是30 流水线理想 CPI1 那么:流水线的实际 CPI 1.9 可采取两种措施来减少分支延迟。 在流水线中尽早判断出分支转移是否成功; 尽早计算出分支目标地址。,下面的讨论中,我们假设: 这两步工作被提前到ID段完成,即分支指令是在ID段的末尾执行完成,所带来的分支延迟为一个时钟周期。,3种通过软件(编译器)来减少分支延迟的方法 共同点: 对分支的处理方法在程序的执行过程中始终是 不变的,是静态的。(在整个程序的执行过程中对每个转移的处理都是一样的) 要么总是预测分支成功,要么总是预测分支失败。 预测分支失败 允许分支指令后的指令

16、继续在流水线中流动,就 好象什么都没发生似的; 若确定分支失败,将分支指令看作是一条普通指 令,流水线正常流动;,若确定分支成功,流水线就把在分支指令之后 取出的所有指令转化为空操作,并按分支目地 重新取指令执行。 要保证:分支结果出来之前不能改变处理机的状态,以 便一旦猜错时,处理机能够回退到原先的状态。 流水线的处理过程,转移不成功和转移成功两种情况下的流水线序列,预测分支成功:假设分支转移成功,并从分支目标地址处取指令执行。 起作用的前题:先知道分支目标地址,后知道分支是否成功。 前述5段流水线中,这种方法没有任何好处。 无论采用预测不成功还是预测成功,编译器都能通过组织代码来实现与硬件的最佳匹配。,不论采用刚才说的哪种策略,编译器都能通过组织代码来实现与硬件的最佳匹配。 延迟分支 主要思想: 从逻辑上“延长”分支指令的执行时间。把延迟分支看成是由原来的分支指令和若干个延迟槽构成,不管分支是否成功,都要按顺序执行延迟槽中的指令。,有些处理器中也称为延迟转移,在早

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号