您的位置:首页 > 其它

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

2012-12-16 15:10 429 查看
上一篇已经介绍了流水线的相关和冒险,本篇介绍避免流水线冒险几种技术.

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

1.暂停条件
源寄存器 - srcA和srcB:当前指令处于Decode阶段.
目标寄存器 - dstE和dstM:处于Excute,
Memory和Write Back阶段.
条件 -srcA==dstE or srcA==dstM;srcB==dstE or srcB==dstM
注意:当寄存器的ID=F时,表示没有寄存器,所以也就不需要暂停啦.

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



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



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

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



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

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



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

3.暂停控制逻辑的优缺点
优点:简单,容易实现
缺点:数据冒险经常发生,性能不高.

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

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



转发源有:
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的值,但是mrmovl在Cycle
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不对ret的PC进行预测.所以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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: