📝本文介绍
本文总结了流水机器的相关处理以及非线性流水线的调度
👋作者简介:一个正在积极探索的本科生
📱联系方式:943641266(QQ)
🚪Github地址:https://github.com/sankexilianhua
🔑Gitee地址:https://gitee.com/Java_Ryson
由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。
文章目录
- 📕流水机器的相关处理
- 📖各种相关
- 🔖局部相关
- 🔖全局相关
- 🔖流水机器的中断处理
- 📘非线性流水线的调度
- 📖静态调度
- 📖动态调度
- 📖二维预约表,禁止表,冲突向量,以及状态转移图
📕流水机器的相关处理
影响流水通畅的因素:
- 编译后的目标代码
- 操作数,指令的读取
- 各种相关
- 中断
📖各种相关
🔖局部相关
局部相关的处理
局部相关:指令相关,访存操作数相关,通用寄存器组相关等。 (先读后写产生)
解决方法:1. 推后执行 2. 设置相关专用通路
流水线中的流动方式:
- 顺序流动方式(同步流动方式):任务流出流水线的顺序保持与流入流水线的顺序一致。(即:所有流水段的流入流出同步进行,那么每段任务都必须经过所有流水线!)
- 先写后读相关
- 异步流动方式:任务流出流水线的顺序与流入流水线的顺序不同。(即:这种情况下,如果有任务与某段流水段无关,可以选择跳过该流水段,进入下一个流水段。)
- 写-写相关
- 先读后写相关
数据相关
- 先写后读相关(RAW)
顺序流动和异步流动都会发生 - 先读后写相关(WAR)
顺序流动不会发生,异步流动会发生
WinDLX规定读操作只发生在ID阶段,写操作只发生在WB阶段,不会出现WAR相关。如果是乱序发射就需要考虑保证正确性 - 写-写相关(WAW)
顺序流动不会发生,异步流动会发生
需保证写的正确顺序
解决:1. 推后执行 2.设置相关专用通路
结构相关
本质上是资源不足,导致的不能满足指令重叠的需求,所以解决方法就是增加硬件资源
🔖全局相关
也称为转移相关,控制相关。指:已进入流水线的转移指令(尤其指条件转移指令)和其后续指令之间的相关。其造成的问题有:
- 一旦转移成功,进入流水线的指令就作废,至少会浪费一个时钟周期
- 若转移成功分支指令未被预取到指令缓冲区中,则需要从主存中取指,浪费一个访存周期。
解决方法: - 猜测执行法
- 分支选择:选择大概率分支。若概率相同选(跳转)不成功分支。
- 加快执行:准备两套转移目标指缓
- 延迟转移
- 采用静态调度技术,编译时调整目标指令顺序,将转移指令与前面不相关的指令调换顺序。
- 加快,提前形成条件码
- 加快单指令内部条件码的执行(条件码是乘除结果的正,负,零值)
- 加快程序段内条件码的执行(将产生条件码的指令提前到与其不相关的其它指令之前)
- 加快短循环程序的处理
- 短循环程序全部放入指令缓冲器内,并暂停预取指令。循环出口条件转移指令恒猜循环分支
🔖流水机器的中断处理
中断的出现概率比条件转移的概率要低。(出现概率低的情况下,需要花费大 才能提升一点性能)处理中断的主要问题:断点现场的保护和恢复,而不是缩短流水线的断流时间。
不精确断点:无论指令在哪处发生中断,都不允许尚未进入流水线的后续指令再进入流水线,已在流水线中的指令执行完毕后,转入中断处理程序。(不利于排错)
精确断点:论指令是在流水线中的哪一段响应中断,给中断现场全都是对应的,之后流入流水线内的指令的原有现场都能保存和恢复。
📘非线性流水线的调度
📖静态调度
借助软件对指令执行顺序进行调度,以减少由于流水线中存在相关冲突而引起流水线的停顿时间。(流行)
📖动态调度
动态调度:通过硬件重新安排指令的执行顺序以减少流水的停顿。
📖二维预约表,禁止表,冲突向量,以及状态转移图
由于非线性流水线的特性:一个程序可能会多次经过同一段流水线,同时,在调度任务时需要保证不同任务之间不会出现需要同时占用同一流水段。二维预约表,可以清楚地将这类问题展示。
二维预约表
二维预约表的写法:有一个由K段组成的单功能非线性流水线,每个任务通过流水线需要n拍如果第m拍用到第l段,就在相应第m列和第l行的交叉点处用√表示
如:一个5段流水线,安排同一个需要9拍的任务。
也就是,任务在第一拍和第九拍的时候需要使用第一个流水段。其他的类似。
禁止表
那么,禁止表如何看呢?我们这里的目的是让其不要在同一时刻内争用同一段流水。所以,有多次使用的段我们才需要去看。那么相隔几拍会遇到一起呢?以第一个流水段段为例,其在1拍和9拍都需要使用,那么如果该任务执行到9拍时(已执行8拍),下一个任务此时进来,由于其处于1拍,需要使用第1个流水段,此时就会发生争用。所以,这个周期是不允许有任务进来的。第一个不允许的周期就得到了。从表上看,就是同一个流水段之间相邻的拍数。
根据上述,1号段中得到不允许间隔8拍,二号段中得到不允许间隔1拍(2,3拍之间),6拍(2,8之间),5拍(3,8之间)。故得到的禁止表为:{1,5,6,8}
冲突向量
冲突向量:根据禁止表上,置一为不允许。其为拍数减一。(因为间隔所有拍数或其以上,上一个任务已流出流水线,没有冲突的可能)。用C表示。
根据上述可得到C=(10110010)
这里还有一个问题:已经经过n拍之后,冲突向量如何变化?将整个冲突向量左移n位,右边补0。
为什么要左移呢?经过n拍之后,所有占用流水段的时间实际上都前移了n拍,而冲突向量代表的就是在第n拍的时候进入流水段会有冲突。
右位为何补0?左移n位之后,实际上就是其执行n拍之后。而冲突向量只有任务执行时间-1的拍数,一旦左移1位之后,就相当于间隔了任务总拍数再安排任务,此时任务都已流出流水线,不存在争用问题。所以置0。
状态转移图
状态转移图描述了该任务在允许的时间间隔内安排后,其任务状态的变化。根据上述所讲,每个安排的任务初始阶段都是初始状态量,而经过n拍安排任务后,其状态量要左移,同时,之后安排的任务也不能与该任务冲突。故,需要将初始状态量(新安排任务)与原来已在流水线中的任务的状态量(左移后的)进行相或,从而得出新的状态量。每个新的状态量都需重复该操作,直到完成。