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

设计一个简易的处理器(8)--流水线冒险的避免上一篇已经介绍了流水线的相关和冒险 本篇介绍避免流水线冒险几种技术 暂停技术 Stalling 避免数据冒险 通过上一篇的介绍 PIPELINE 的数据冒险只发生在读 取同一个程序寄存器的时候 只需要在 PIPE 硬件结构图见本系列 6 的基础上使用暂停 Stalling 技术来避免数据冒险 下面具体分析暂停技术的暂停条件和实现

大家好,我是讯享网,很高兴认识大家。

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

 

 

暂停技术(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

小讯
上一篇 2025-04-01 19:14
下一篇 2025-01-05 21:34

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/55262.html