流水线与指令级并行

流水线冒险(pipeline hazard)包括结构冒险(structure hazard)数据冒险(data hazard)控制冒险(Control hazard)

什么是结构冒险?

在执行特定的指令组合时,由于资源冲突,一个指令不得不等待另一个指令结束再进行执行。通常情况下,流水线会将其中的一个指令停顿,直到所需单元可用为止。

旁路(forwarding)技术可以将数据冒险停顿减少到最小。

怎样实现动态分支预测?

简单的动态分支预测机制是分支预测缓冲区分支历史表

记分牌算法与Tomasulo算法

解决WAW(写后写)与RAW(读后写)产生的数据冒险问题。采用寄存器重命名的方式可以解决,这两种数据冒险成为假数据冒险。而对于WAR(写后读)的数据冒险问题。

“记分牌”本质是一个信息存储单元,分别记录了功能单元状态寄存器结果状态

信息包括部件是否正在忙、部件执行的指令类型、部件现在需要的源寄存器、部件现在的目的寄存器、源寄存器是否准备好($R_j$,$R_k$ 表示)和如果源寄存器没准备好部件该向哪里要数据($Q_j$,$Q_k$)表示。

记分牌算法特点是顺序发射和乱序执行,还是会因为“写后写”和“读后写”冒险而产生阻塞,浪费了乱序性能。

Tomasulo算法
其最大的特点是借助寄存器重命名消除假数据冒险。

其中FP OP Queue:浮点指令队列,用于存储待发射的指令。
青绿色模块是加法单元和乘法单元的保留站。
蓝绿色的Address Unit是地址计算单元,在这个算法中存储指令在执行前会先计算好存储地址;
Memory Unit则是存储单元;
另外数据的计算结果通过一个Common Data Bus (CDB)总线写回。写回的数据通过CDB总线直通寄存器堆和各个保留站。如果执行单元中有指令正在执行,其他指令就在保留站中等待;如果指令缺少源数据,就留在保留站中,时刻监听CDB总线,如果CDB总线广播了需要的数据,就立马拷贝下来,然后准备执行。

调度流程
发射:Tomasulo算法是顺序发射的,即指令按照程序中的顺序一条接一条被发射到保留站。判断能否发射的唯一标准是指令对应通路的保留站是否有空余位置,只要保留站有空余,就可以把指令发射到保留站中。周期结束时会更新保留站和寄存器结果状态表,如果指令有可以读取的数据,就会立刻拷贝到保留站中;寄存器结果状态表中总是存有最新的值,即如果后序指令的目的寄存器和前序指令的目的寄存器重合,那就只保留后序指令的写信息。
执行:指令通过拷贝数据和监听CDB获得源数据,然后开始执行,执行可能是多周期的,在执行过程中不改变处理器状态。
写回:指令在写回阶段通过CDB总线将数据直通到寄存器堆和各个保留站;周期结束时,根据寄存器结果状态表来更新寄存器堆,并且清除保留站和寄存器结果状态表的信息。

Tomasulo算法中指令的存储地址需要计算得到。

案例:

Cycle1:

Cycle2:

第二个周期结束时,第一条指令的存储地址被计算出来。

传统的架构中,因为第一条指令占用了整数部件,以至于后续的指令都无法发射。

Cycle3

指令在发射的时候会更新寄存器状态表,此时后序指令和前序指令的目的寄存器重合了(同为Load2),所以用后序指令的写信息标志寄存器,表示只会把后序指令的计算结果写进寄存器,这样可以解决写后写冒险;
Cycle4

Cycle5

第五个周期,第二条指令到写回阶段,通过CDB总线广播数据;第三条指令通过CDB总线抓取到了源数据,下一个周期就会开始执行,图中Mult1前面的数字10表示这条指令接下来将用十个周期完成执行;同理第四条指令通过CDB总线抓取到了源数据,下一个周期就会开始执行;第五条指令因为乘法单元的保留站有空余,所以可以发射。

周期结束时,第二条指令清除保留站信息,清除寄存器结果状态表;第三条指令和第四条指令更新保留站,将CDB总线上的数据拷贝到保留站中,至此,这两条指令数据准备完毕,马上就可以执行了;第五条指令更新保留站和寄存器结果状态表。Qj显示该指令需要等到乘法保留站第一行的指令的结果。

Cycle6

Tomasulo算法怎样解决WAW与RAW冒险?

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

写后写冒险时,记分牌过度纠结寄存器名字,会把所有指令的结果都写进寄存器堆,会因为写后写冒险阻塞指令发射,而Tomasulo只保存最新的写入值,这样即保证了正确的结果,又减少了无谓的工作;
读后写冒险时,记分牌过度纠结寄存器名字,指令在执行之前一直检测的是寄存器堆,一旦数据准备好,就会从寄存器堆中取数,这样的后果就是后序指令即使计算完结果也可能不能立刻写回寄存器堆,而Tomasulo则在发射时就拷贝数据,贯彻数据流的思想——“寄存器名字不重要,寄存器里的数据才重要”。