流水线中的三种冒险
流水线中的三种冒险ISA指令的实现会包含阻碍流水线的因素,使程序不能完全流水式执行。上图给出了在5段流水线的机器中,指令“完全”流水执行和流水线被阻碍时的对比。这种为保证正确执行,而在流水线中插入的停顿称为气泡。可以发现如果在一个指令中插入了1个气泡,那么这个指令之后的步骤都会被推迟1个时钟周期,更糟糕的是这些步骤被推迟1个周期会导致相应硬件的占用被推迟1个周期,导致后面的指令也要相继推迟才能占用这些硬件。也就是1个气泡可能导致该指令后的所有指令晚1个周期结束。
阻碍流水线的因素被称为冒险(Hazard,和电路的冒险不是同个概念)。冒险可分如下几类:
1) 结构冒险:同时抢占同一硬件资源导致的。比如在一个周期里同时fetch内存;
2) 数据冒险:又称为相关,数据的前后依赖关系导致的。比如前面MIC-3讨论过微指令间的写后读相关,因为是在同一条指令内的相关,所以也比较容易直接解决。进入流水线的ISA指令间也有相关,比如在流水线中的2条指令,上条指令的数据在周期i尚未产生,但下条指令在周期i依赖该数据;… 阅读全文