CSAPP学习笔记(七)

Posted by HK on February 10, 2019

第四章

流水线冒险

将流水线技术映入一个带反馈的系统,当相邻指令间存在相关时会导致出现问题。这些相关可能会导致流水线产生计算错误,称为冒险(hazard)

  • 数据相关:下一条指令会用到这一条指令计算出的结果
  • 控制相关:一条指令要确定下一条指令的位置,例如在执行跳转、调用或返回指令时。

冒险分为数据冒险(data hazard)和控制冒险(control hazard)。

用暂停的方式处理数据相关

这种方法就是暂停流水线,结果跟顺序结果一样。(产生气泡操作bubble,跟nop空操作一样)

用转发来避免数据冒险

当前指令的执行结果应该在指令执行结束之后才能写回到寄存器或者存储器中,但是如果流水线的下一条指令就用到了该结果,这里采用转发或者叫做数据旁路技术把当前的指令执行结果传递到流水线较早阶段。也就是没等这条指令执行结束,下一条指令就可以默认该结果有值了。一般来说,产生结果的只有执行和访存阶段,转发的方式就是从执行结果和访存阶段的结果直接添加一条回到译码阶段的回路。

第一种方法简单效率不高,第二种方法效率高但是有些问题也不能完全解决数据冒险问题。例如load加载冒险,因为访存阶段在比较后面,如果第二条指令直接使用load的结果,在译码阶段执行时不能完成转发。所以只有使用转发和暂停的联合方式,才能解决所有的冒险问题。

用预测技术解决控制冒险

当遇到跳转指令的时候使用预测技术对其进行预测,预测正确,流水线继续执行。预测错误,恢复现场,删掉流水线中的指令。ret指令是个特例,当执行ret指令时,必须要暂停,因为它没法进行预测下一次地址是什么了。

异常处理

顺序结构异常处理是halt停机,并向操作系统报告异常。

流水线处理的时候,如果流水线中的多条指令同时出现异常,那么只向操作系统报告流水线中最深的指令引起的异常,就是运行最多的指令。当预测指令出现异常时,应该等到预测正确与否才报告是否异常。如果一条指令引起了异常,那么它之后的指令不应该影响系统状态。比如说CC的状态,所以不仅要暂停后续指令改变状态的操作,还需要专门的异常处理程序对状态进行恢复。

存储接口

从主存中读取需要3-20个周期,可以等待、暂停流水线。

当需要的数据不在主存中,而在磁盘中,因为读取一个磁盘的操作需要几百个时钟周期,所以不能等待。这个时候采用的操作系统采用缺页中断的处理方式进行读取。 总结来说主存读取用暂停,磁盘读取用中断方法。