3.4 利用动态调度克服数据危险

发布时间 2023-11-23 20:36:48作者: 杨小靖

3.4 利用动态调度克服数据危险

本节将探讨动态调度,硬件重新安排指令执行以减少停顿,同时保持数据流和异常行为。基于硬件的动态调度有几个优点。

  1. 它允许汇编代码在不同流水线上运行,避免二进制文件对不同微体系结构重新编译的需要。

  2. 可以处理编译时依赖项未知的情况。

  3. 允许处理器容忍不可预测的延迟,比如缓存丢失,在等待缓存丢失解决的同时执行其他代码。

动态调度的优势是以显著增加硬件复杂性为代价获得的,尽管动态调度的处理器不能更改数据流,但它会尝试在存在依赖项时避免停机。相比之下,编译器的静态调度试图通过分离相关指令来最小化延迟。

动态调度思路

使指令在数据准备好后立刻执行,意味着乱序执行、乱序完成,这会带来WAR WAW的危险。动态调度就会带来不精确中断,使异常的现场恢复很麻烦。为了实现乱序执行,ID阶段被拆成两个部分——Issue(译码,检查数据危险)Read Operands(等到没有数据危险读数)

我们区分指令何时开始执行何时完成执行;在这之间,指令正在执行。流水线允许多个指令同时执行,需要多个功能单元,所有指令依次通过发布阶段(有序发布);然而,它们可能在第二阶段(读取操作数)停滞或相互绕过,从而进入无序执行。

使用Tomasulo’s 进行动态调度

RAW:跟踪指令操作数的有效性;

WAR、WAW:寄存器重命名,实现寄存器拓展。使用了一个加载功能单元,所以不需要进行重大的修改来添加寄存器-内存寻址模式。

基本思想是保留站在操作数可用时立即获取并缓冲操作数,从而消除了从寄存器获取操作数的需要。危险检测和执行控制是分布式的,在每个功能单元的保留站中保存的信息决定了指令何时可以在该单元开始执行。其次,结果直接从被缓冲的保留站传递到功能单元,而不是通过寄存器(通过公共数据总线CDB)。

Load Buffer功能:(1)保存有效地址的组成部分,直到它被计算出来;(2)跟踪正在内存上等待的未完成负载;(3)保存正在等待CDB的已完成负载的结果。

Store Buffer功能:(1)保存有效地址的组成部分,直到它被计算出来;(2)保存等待数据值存储的未完成存储的目标内存地址;(3)保存要存储的地址和值,直到内存单元可用。

三个步骤:

Issue:从指令队列的头部获取下一条指令

如果有一个匹配的预留站是空的,则向具有操作数值的站点发出指令。如果操作数不在寄存器中,则跟踪将产生操作数的功能单元(方便Execute阶段接收)。存在WAR和WAW时重命名寄存器。

Execute

如果一个或多个操作数还不可用,在等待计算公共数据总线时监视它。当一个操作数可用时,它被放置到任何等待它的保留站。当所有的操作数都可用时,操作就可以在相应的功能单元上执行。通过延迟指令执行直到操作数可用,可以避免RAW危险。对一个功能单元,几个指令可能在相同的时钟周期内准备就绪。对于计算单元可能影响不大,但是存储单元的选择有很大影响。

Write result

当结果可用时,将其写入CDB,并从CDB写入寄存器和等待该结果的任何保留站(包括存储缓冲区)

保留站从CDB检索结果实现了静态调度管道中使用的转发和绕过机制。但是动态调度方案在源和结果之间引入了一个延迟周期,因为直到写入结果阶段才能完成结果及其使用的匹配。因此,在动态调度的流水线中,产生指令和消费指令之间的有效延迟至少比产生结果的功能单元的延迟长一个周期。

计算机体系结构-Tomasulo算法 - 知乎 (zhihu.com)

记分牌那样的一条通路只对应一条信息的做法容易造成指令堵塞、无法发射,而保留站则为每条通路预留了缓冲区,指令可以在加法单元忙碌的时候发射到保留站的缓冲区待命

记分牌一样只记录一个寄存器编号,只记录编号的话会造成读后写阻塞,而保留站则贯彻了“数据一旦准备完毕,就立马执行指令”的思想,指令一旦发现有数据可读,就立马读下来,读下来之后,那个源寄存器的写与不写就不关己事了。

记分牌和保留站相同的地方是都记录了Qj和Qk,即一旦需要的数据被算出来,就通过Qj和Qk捕捉广播数据,这样的做法其实就是重命名,即用保留站的编号而不是寄存器编号来标记数据源

发射:Tomasulo算法是顺序发射的,判断能否发射的唯一标准是指令对应通路的保留站是否有空余位置

执行:指令通过拷贝数据和监听CDB获得源数据,然后开始执行,执行可能是多周期的,在执行过程中不改变处理器状态

写回:指令在写回阶段通过CDB总线将数据直通到寄存器堆和各个保留站;周期结束时,根据寄存器结果状态表来更新寄存器堆,并且清除保留站和寄存器结果状态表的信息。

优势

  • 记分牌每条通路只能存一条指令,导致经常有指令因为结构冒险而不能发射,而Tomasulo引入保留站之后每条通路可以缓冲下多条指令,这样的做法平缓了指令发射的速度

  • 写后写冒险时,记分牌过度纠结寄存器名字,会把所有指令的结果都写进寄存器堆,会因为写后写冒险阻塞指令发射,而Tomasulo只保存最新的写入值,这样即保证了正确的结果,又减少了无谓的工作;

  • 读后写冒险时,记分牌过度纠结寄存器名字,指令在执行之前一直检测的是寄存器堆,一旦数据准备好,就会从寄存器堆中取数,这样的后果就是后序指令即使计算完结果也可能不能立刻写回寄存器堆,而Tomasulo则在发射时就拷贝数据,贯彻数据流的思想——“寄存器名字不重要,寄存器里的数据才重要

缺点

  1. 每一个执行单元对应一个保留站,保留站中缓冲多条指令,所以有可能在同一周期有多条指令准备好数据,但是执行单元同时只能执行一条指令,所以就需要从中选择一条指令,简单的解决办法是为保留站的每一行增加一个年龄位,每次出现冲突,就选择最老的指令送到执行单元。

  2. 电路里的CDB总线只有一组,这意味着每一个周期只能写回一条指令,如果同时有多条指令完成,那就只能选择一条指令进行广播,别的指令等待;第二种办法是增加CDB总线,支持多指令广播,但是这会让电路面积大增,

  3. Tomasulo算法没办法实现精确中断设计人员提出了重排序缓冲的概念,利用这一概念,可以改进Tomasulo算法,从而实现处理器的按序发射-乱序执行-按序提交。