上期答案
[37] 什么是pipeline hazard?处理器中有几种pipeline hazard?
pipeline hazard是指由于某些原因下一条指令无法执行的情况。有三种类型的hazard:
- Structural Hazards:由于硬件资源不足产生的。比如如果设计结构中只有一个浮点执行单元,每次执行都需要两个周期的时间,那么当程序中出现背靠背的浮点指令时会导致流水线停止。除此之外内存和缓存的访问也会导致Structural Hazards
- Data Hazards:由于前后指令数据的依赖性而造成的hazard
- A、RAW:先读后写register,ture data dependence
- B、WAW:先写后写register,output data dependence
- C、WAR:先写后读register, anti-data dependence
- Control Hazards:当碰到跳转指令时,processor会stall一个cycle。
因为processor在处理指令时会分两个stage:取指令和解码指令。
当一条指令进入到解码阶段时,才会被发现需要跳转,所以在取指令阶段
的那条指令会被废掉,故浪费掉一个cycle。
[38] 如何避免三种pipeline hazard?
- Structural Hazards:将一个function unit切分成更小的stage或对设计相同功能的硬件等,总之,就是让硬件资源够用。
- Data Hazards:A情况是真正的数据依赖,会产生hazard,可以用forwarding技术来减少或消除它;而B和C是在当指令顺序被compiler或者是硬件调整后才会出现的数据依赖。如果出现了B和C的情况,可以有一种技术来消除它,叫做register renaming。
- Control Hazards:可以在program中加入likely()or unlikely()来帮助compiler预测taken or not taken的可能性。另外,compiler可以通过delayed-branch的技术来消除branch hazard,但是该技术很少用在很长的pipeline中。最后,可以通过硬件的技术消除Brach hazard。以上的技术都是compiler或hardware的技术,programmer可以不关心,但好的if语句应该
如下:
if(unlikely(condition))
{
几率小
}
else
{
几率大
}
注意:将几率大的语句放在not taken下面,将几率小的语句放在taken下,这样会节省4个
cycle左右(由pipeline的深度决定)。另外,还有一种写法就是将unlikely改为likely,将几率大的和几率小的对调,这种方法比第一种方法要慢或持平(至于原因有compiler的原因,有pipeline的原因,所以它依赖于compiler和chip的设计)。
你答对了吗
本期题目
[039] 如果一个流水线由十个阶段,每个阶段需要1ns执行。假设没有hazards,那么处理100个数据需要多久?
[040] 指令有多少种寻址方式?
欢迎在留言区给出你的答案,正确答案将在下一期公布,或者到下面的文章获取答案