流水线中的三种冒险

流水线中的三种冒险

fcfaa061-0a75-4c10-977b-551521d1c5f3

5b163053-7e03-4286-bc82-8cf5fb485893

ISA指令的实现会包含阻碍流水线的因素,使程序不能完全流水式执行。上图给出了在5段流水线的机器中,指令“完全”流水执行流水线被阻碍时的对比。这种为保证正确执行,而在流水线中插入的停顿称为气泡。可以发现如果在一个指令中插入了1个气泡,那么这个指令之后的步骤都会被推迟1个时钟周期,更糟糕的是这些步骤被推迟1个周期会导致相应硬件的占用被推迟1个周期,导致后面的指令也要相继推迟才能占用这些硬件。也就是1个气泡可能导致该指令后的所有指令晚1个周期结束。

阻碍流水线的因素被称为冒险(Hazard,和电路的冒险不是同个概念)。冒险可分如下几类:

1) 结构冒险:同时抢占同一硬件资源导致的。比如在一个周期里同时fetch内存;

2) 数据冒险:又称为相关,数据的前后依赖关系导致的。比如前面MIC-3讨论过微指令间的写后读相关,因为是在同一条指令内的相关,所以也比较容易直接解决。进入流水线的ISA指令间也有相关,比如在流水线中的2条指令,上条指令的数据在周期i尚未产生,但下条指令在周期i依赖该数据;

3) 控制冒险:之后执行哪条指令由之前的指令来决定,但之前的指令还没有结果时所导致的。比如条件跳转指令,可以发现在MIC-4中,条件跳转指令只有走到流水线很深的地方才知道是否会跳转(也就是下一个指令是谁),但此时该条件跳转指令后紧接着的若干个指令可能早已进入流水线。这种情况很难处理也很影响性能,流水线级数越长,需要的气泡(周期)就越多;

实际中的CPU有冒险检测机制。发现冒险时,最基本的方法就是插入气泡(阻塞),但这会浪费周期,并让流水线滞后。还有一些更复杂的方法,能通过额外硬件减少这些浪费,后面会讨论。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部