/**
* 计算机体系结构(7)
* #控制相关
* 控制相关决定了指令i相对于分支指令的顺序,使指令i按正确程序顺序执行,而且只会在应当执行时执行
*
* 控制相关会施加两个约束条件
* 1、如果一条指令与一个分支控制相关,就不能将这个指令移动到这个分支前,使它的执行不再受控于这个分支
* 例如不能将if then 后面的一部分移动到if外面
* 2、如果一条指令与一个分支没有控制相关,那就不能把这个指令移动到这个分支之后
* 使其执行受控于这分支,
* 例如不能将if之前的一个语句移动到then部分
*
* 处理器严格顺序执行指令的时候,确保控制相关不会破坏
* 但在不影响结果正确性的前提,可能会造成一些控制相关的破坏
*
* 有两个特性对程序正确性至关重要
* 异常行为和数据流 通常保持数据和控制相关也就保护了这两种特性
*
* 保护异步行为意味着对指令执行顺序的任何改变都不能改变程序中激发异常的方式
* 要求改变指令的执行顺序时不得导致程序中生成新的异常
*
* 揭示ILP的基本编译器技术
* 基本流水线调度和循环展开
* 为了使流水线保持满载,必须找出可以再流水线中重叠的不相关指令序列
* 静态预测和全局预测的自适应联合
*
* #动态调度克服基本冒险
* 除非流水线中的已有指令和要提取的指令之间存在数据相关,并且无法通过旁路或者转发来影藏这一数据相关
* 否则,静态调度就会提取一条指令然后发送出去
* 转发逻辑会减少流水线延迟,因为延迟可能会出现某项数据相关不会造成数据冒险
* 如果存在不能隐藏的数据相关,哪些冒险检测软件会从使用该指令结果开始,将流水线置于停顿状态
* 在清除这一相关之前不会进行提取和发射指令
*
* 动态调度有一些优点 【是以硬件复杂度的显著提高为代价的】
* 允许一种流水线编译的代码在不同的流水线上执行。不需要在不同体系结构上重新编译生成多个二进制文件。
* 第三方二进制软件分发的便利性
* 在编译代码的时候还不能确定相关性,通过动态调度可以在编译的时候确定一些这样的情况
* 比如这些相关可能设计存储器引用和数据相关的分支
* 他们可能源于动态链接或者动态分发环境导致
*
* 允许处理器容忍一些意外的延迟,比如缓存缺失
* 在等待缓存缺失问题的同时可以执行其他代码
*
* ---尽管动态调度的处理不能改变数据流,但是能在存在相关性时尽量避免停顿
* #动态调度 —————— 思想
* #简单流水线技术的一个主要限制是他们使用循环指令发送和执行
* 指令按照程序顺序发射,如果一条指令在流水线中停顿。其他指令也因此无法继续执行
* 如果流水线中两条相近的指令存在相关性,就会导致冒险和停顿
* 如果存在多个功能单元。这些功能单元则进行停顿和空闲
* 如果指令依赖发生时间很长,则导致时间停止过长
* 如果不用程序执行顺序解决性能问题,则这个优化可以发生
*
* 在经典五级流水线中
* 会在指令编译码(ID)的时候检查结构冒险和数据冒险;当一条指令可以无冒险执行
* 直到所有数据冒险都解决,从ID将其发送出去
* 这样的流水线执行是乱序的,是乱序完成的。
* 乱序执行会导致
* WAR 写后读 造成读取错误值
* WAW 写后写 造成写顺序错误
* 乱序执行完成还会导致异常处理复杂
* 采用乱序执行完成动态调度的必须保持异常行为
* 即在顺序执行情况下会发生的异常在乱序的时候一定也会发生
* 也不会发生其他异常
* 动态调度处理器会推迟发布相关异常行为
* 一直等到处理器知道该指令就是接下来要完成的指令通过这一方式保持异常行为
*
*/
来源《计算机体系结构》