在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6516|回复: 6

问一个关于MIPS流水线的问题

[复制链接]
发表于 2013-10-11 09:57:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
正在看《计算机体系结构:量化》这本书。
关于MIPS的流水线中的stall,有一些问题不明白,请大侠指点迷津。
感觉stall, nop, flush这些东西很像,但是不太明白区别在哪里?
如果一个典型的5级流水线 IF  ID  EX  MEM  WB, 一般如果和前面的指令有data hazard,那么就要加stall。不过stall加在哪里?
看例子有好几种: (1) stall, IF, ID, EX, MEM, WB  就是所有的步骤都滞后一个cycle;
(2) IF, stall, ID, EX, MEM, WB     就是先IF 然后 在译码前 stall 了一个cycle,虽然我不明白为什么非得把IF提前,但是我明白滞后ID的意思;
(3) IF, ID, stall, EX, MEM, WB      这是把上一个LD的MEM后产生的数前递到当前指令的EX的结果
虽然都能说得通,但是为什么不直接把stall放到IF前面呢(这样多整齐啊)?
发表于 2013-10-14 22:40:36 | 显示全部楼层
我感觉指令译码过后才可能知道当前EX阶段存在了data hazard,流水自然就会stall,比较符合流水的概念,还有会不会这样效率会高一些,我才接触,随便说说。
发表于 2013-10-16 11:00:09 | 显示全部楼层
看看高手
发表于 2013-10-27 10:37:22 | 显示全部楼层
本帖最后由 lipizju 于 2013-10-27 10:45 编辑

Stall 的产生是指因为当前指令需要的某些信息还没有available而导致其无法继续在流水线中前进, 注意此时还没有任何的 speculative execution happens.
Stall 的目的是等待当前指令需要的信息准备好即wait till dependency to be resolved, 然后可以继续执行, 至于你提到的stall 加在哪里, I think that's a good question,
我的答案是 :  no early than current instruction gets to know the data it needs can not be available, no later than error data reading happens,  
Mips 的pipeline 设计非常巧妙, 我们可以最早在second stage ID  级就可以detect all data dependency, so 我们一般就stall ID stage, which means keep IF/ID interface
register unchanged and insert a bubble into ID/EX interface register:

                    IF/ID                       ID/EX                            EX/MEM                            MEM/WB        
cycle one: current inst              previous inst             previous of previous
cycle two:                                 current inst              bubble(nop)             previous inst                     previous of previous

至于你提到的为什么不在IF stage stall  是因为那时指令还未进入流水线, current inst还不知道自己需要的data是否available

当然以上提到的情况是在没有data forwarding path的情况下, 如果在data path 上加上一些简单的mux 和 control register, 我们就可以解决绝大部分
(except delayed load, still need one cycle stall for back to back dependency) data dependency 而不用stall, 这样就可以improve over all  throughput

至于flush则是因为pipeline 由于speculative execution 而产生了错误的状态,这时我们无法通过插入stall cycle来解决, 而只能把错误的register清零,

                      IF/ID                       ID/EX                            EX/MEM                            MEM/WB        
cycle one:  speculative one        Branch inst                      previous inst
cycle two:  Flush/bubble           Flush/bubble                     Branch inst                        previous inst


flush 操作一般用在resolve control dependency, 因为对于BNE or BEQ,  next instr address is resloved in EX stage, 如果我们要等待的话需要stall two cycles
that's too expensive, so generally, mips will use some kind of branch prediction to reduce the cost, 就像最简单的predic branch never happens, 如果预测错误
的话我们必须flush branch inst 之后的所有instrctions, that is also expensive, so mips ISA introduce the delay slot mechanism to allow the following inst to finish
发表于 2013-11-2 08:22:44 | 显示全部楼层
一个nop为1个指令周期,主要用于精确定时或者延时。stall这里指“拖延”一个cycle,flush不大用在这里。指令流并行处理时,如果有相关性,这时通过stall保证程序正确执行。
发表于 2013-11-2 08:37:30 | 显示全部楼层
初学者路过,帮楼主顶顶!
发表于 2014-4-26 16:39:50 | 显示全部楼层
Nop 是一条机器指令,是编译器负责插入的。例如这段代码
I1:LD R4, 500(R0)
I2: ADD R3, R4, R5
I3:LD R1, 300(R0)
编译器发现了I1和I2之间的相关性,又知道硬件特别简单,简单到它们之间的相
关性都发现不了,编译器就把程序改成这样:
I1:LD R4, 500(R0)
NOP
NOP
NOP
I2: ADD R3, R4, R5
I3:LD R1, 300(R0)
Stall是一个机器的动作,当处理器的读入一条指令并对改指令进行译码时,发现
它和之前的指令(比如上例的I1和I2)有冲突,控制器就会控制流水线停顿三拍,
这三拍停顿就是3个周期的stall.
Flush, 如果你指的是流水线的flush, 其实也是控制器控制的一个机器动作,例如
把流水线中的段寄存器清空。一般这个动作是将IF 或者ID清空,因为可能碰到
了一条转移指令,要跳转到转移方向之前,先把已经取错方向的已经进入IF和ID
段的指令清空。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 10:04 , Processed in 0.018374 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表