设计一个简易的处理器(8)--流水线冒险的避免

上一篇已经介绍了流水线的相关和冒险,本篇介绍避免流水线冒险几种技术.

 

 

暂停技术(Stalling)避免数据冒险

————

通过上一篇的介绍,PIPELINE的数据冒险只发生在读/取同一个程序寄存器的时候只需要在PIPE-(硬件结构图见本系列6)的基础上使用暂停(Stalling)技术来避免数据冒险.下面具体分析暂停技术的暂停条件和实现.

 

1.暂停条件

源寄存器 - srcAsrcB:当前指令处于Decode阶段.

目标寄存器 - dstEdstM:处于Excute, MemoryWrite Back阶段.

条件 -srcA==dstE or srcA==dstM;srcB==dstE or srcB==dstM

注意:当寄存器的ID=F,表示没有寄存器,所以也就不需要暂停啦.

 

2.具体例子

下面看具体的两个例子,来分析暂停技术.

观察Cycle 6, addl指令处于Decode阶段,%eax还处于Write Back阶段,还没有写回从而导致了数据冒险.当采用暂停技术的PIPELINE暂停控制逻辑(根据前面的暂停条件)发现了数据冒险,就会在Execute阶段中插入一个气泡(bubble),addlhalt指令暂停. Cycle 7中暂停条件不在满足,就正常的流水线执行即可.

 

观察Cycle 4,暂停控制逻辑发现了数据冒险(满足暂停条件),Execute阶段中插入一个气泡(bubble), addlhalt指令暂停;同理,Cycle 5Cycle 6中暂停控制逻辑同样检测出数据冒险,处理方式一样,Execute阶段中插入一个气泡(bubble), addlhalt指令暂停.直到Cycle 7中发现暂停逻辑不再满足,就执行正常的流水线执行即可.

 

3.流水线的暂停控制逻辑的实现

前面很早就说过,控制逻辑是一个组合电路,下图就是一个带有暂停控制逻辑的PIPELINE.

:带有暂停控制逻辑的PIPELINE-.

其实就是在PIPELINE-的基础上,增加了一个暂停控制逻辑(组合电路),它的主要目的就是根据暂停条件发现数据冒险,一点发生数据冒险,就在Execute阶段插入bubble(向一个动态的NOP指令似的),当前指令和后续指令处于暂停状态,然后依次推进.如上图所示,插入bubble发生在Execute阶段;暂停(Stall)发生在FetchDecode阶段.

 

下面是暂停技术的原理示意图.

:暂停技术的原理示意图(不允许stallbubble同时为1)

 

3.暂停控制逻辑的优缺点

优点:简单,容易实现

缺点:数据冒险经常发生,性能不高.

 


数据转发技术(Data Forwarding)避免数据冒险

————

暂停技术的性能不高,通过观察,我们流水线中只有ExecuteMemory这两个阶段产生值,当前指令Decode时可以直接获取其上指令的ExecuteMemory阶段产生的值.这种将结果值直接从流水线阶段传到较早阶段的技术称为数据转发(data Forwarding or bypassing).

 

1.转发源

我们的流水线模型中,只有ExecuteMemory会产生值.所以主要有下面几个转发源.

转发源有:

Execute阶段: e_ValE

Memory阶段: M_valE, m_valM

Write Back阶段: W_valE, W_valM

 

2.示例

观察Cycle 6, addl指令处于Decode阶段,%eax还处于Write Back阶段,还没有写回从而导致了数据冒险.当采用转发技术的PIPELINE转发控制逻辑发现了数据冒险,直接将W_valE的值直接转发valB.

观察Cycle 4,转发控制逻辑发现了数据冒险,直接将M_valE转发给valA,e_valE转发给valB.

 

3.实现

观察"Sel+FwdA""Fwd B"两个控制逻辑,通过使用反馈路径实现了转发控制逻辑.

 

4.转发技术的局限性

有一类数据冒险不能单纯用转发来解决.那就是加载/使用冒险,这一类数据冒险需要转发技术+暂停技术相结合来解决.

 


加载/使用冒险的避免

————

1.加载/使用冒险(load/usehazard)示例

单纯的使用转发技术,上述情况会发生数据冒险.观察Cycle 7, addl指令处于Encode阶段,需要%eax的值,但是mrmovlCycle 8才会在访存阶段中读出这个寄存器的值.这种由寄存器的值来自存储器而导致结果错误,称为加载/使用冒险.

 

2.避免加载/使用冒险

对于加载/使用冒险,你可能已经猜到,使用暂停技术来解决(这种方法称为加载互锁,详见上面的暂停技术的原理示意图).

如上图所示,可以使用"加载互锁+转发技术 " 解决所有类型的数据冒险.

 

3.加载互锁的实现

 

 

总结:只有加载互锁会降低流水线的吞吐量,使用"加载互锁+转发技术 "几乎可以实现每个时钟周期发射一条新指令的吞吐量的目标啦~



暂停技术(Stalling)避免预测错误的分支导致控制冒险

————

1.预测错误导致控制冒险的示例(前文已经介绍)

0x000:    xorl %eax,%eax

0x002:    jne t          # Not taken

0x007:    irmovl $1, %eax # Fall through

0x00d:    nop

0x00e:    nop

0x00f:    nop

0x010:    halt

0x011: t:irmovl $3, %edx # Target (Should not execute)

0x017:    irmovl $4, %ecx    # Should not execute

0x01d:    irmovl $5, %edx    # Should not execute

流水线会选择分支,所以开始取跳转目标处的指令.实际上在Cycle 4结束就可以发现预测错误啦.

 

2.预测错误的触发条件

Execute阶段末开始计算产生e_Bch的信号,就可以判断是否预测错误了.

 

3.预测错误的分支导致控制冒险的避免

观察Cycle 4.Cycle 4快结束前就可以判断出分支预测错误了, PIPELINE的控制逻辑发现了控制冒险,这时候按照下表处理.

Condition

F

D

E

M

W

分支预测错误

normal

bubble

bubble

normal

normal

 

4.实现

暂停技术可以很容易的解决由分支预测导致的控制冒险.



暂停技术(Stalling)避免ret导致控制冒险

————

1. ret导致控制冒险的示例(前文已经介绍)

前文说过, PIPE不对retPC进行预测.所以ret也会导致控制冒险.

例如:

 

2. ret的触发条件

 

3. ret导致控制冒险的避免

按照下表处理.

Condition

F

D

E

M

W

ret

normal

bubble

normal

normal

normal

 

4.实现



小小总结

————

完全可以使用"加载互锁+转发技术"解决所有的数据冒险,同样可以使用"加载互锁"方法解决控制冒险.转发技术不会降低流水线的吞吐量,而加载互锁是通过暂停技术来实现的,所以会降低流水线的吞吐量,但是几乎可以实现每个时钟周期发射一条新指令的吞吐量的目标.

 

下一篇将详细讨论PIPE各个阶段的实现和流水线的控制逻辑.

 

reference:

1. 深入理解计算机系统(原书第2版)

 

(版权所有,转载时请注明作者和出处-dennis_fan-http://blog.csdn.net/dennis_fan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值