作者sate1128 (小夯夯)
看板Grad-ProbAsk
标题[理工] 计组 branch stall的位置
时间Mon Dec 26 11:00:23 2016
我最近在做题目的时候有个疑问
Branch在ID判断时
要和前面的R-type空一格 lw空两格
但是详细来看的话空的那个stall应该放在哪?
我举一个例子:
add後接bne 接下来bne predict 错误
我的想法是branch的stall接在它的IF之後
http://i.imgur.com/Lsm84Xw.jpg
如此一来bne的ID有在add的EX後 拿到正确的值
之後的add(correct)的IF也接在bne的ID後 也很合理
但是有些题目好像把stall放在branch的ID後
http://i.imgur.com/IV611EN.jpg
这样add的EX的结果没办法给bne做判断啊?
难道bne在stall还可以拿add的结果做运算?
但是这样就没有stall吧(暂停)
後面的add(correct)这样接也蛮诡异
请问各位哪种才是对的?
如果是下面那种该怎麽解释?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.186.245
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Grad-ProbAsk/M.1482721226.A.1B1.html
1F:推 PTTleader: 有下面那种的题目吗12/26 13:02
2F:推 newpuma: 第一种stall是为了解决1,2指令相依,有第二种的题目吗?12/26 13:10
3F:→ ken52011219: 你这麽想吧 detect unit 是在ID侦测的 ,当侦测到 if12/26 13:17
4F:→ ken52011219: 判断式为true 时 会执行stall12/26 13:17
5F:→ ken52011219: 那它所谓的stall 在实际面向该怎麽执行12/26 13:17
6F:→ ken52011219: 停止 control signal 往下一个stage 传递 停止 PC +412/26 13:19
7F:→ ken52011219: 传达到 Instruction memory12/26 13:19
8F:→ ken52011219: ID 就会在下一个cycle时,持续执行ID 的指令 这样就12/26 13:20
9F:→ ken52011219: 很明显了12/26 13:20
10F:→ ken52011219: 第二个ID才是实际上的stall 所以你第二个才是对的12/26 13:24
11F:→ ken52011219: 但 stall功能自己要知道 为了方便检查 写2次ID 会比12/26 13:31
12F:→ ken52011219: 较好12/26 13:31
喔喔喔 原来是在ID侦测
而且我之前一直以为stall就是不做事
如果照k大这样讲
那这题第二题答案给的cycle12
是不是要改成13才对?
http://i.imgur.com/2CiznaR.jpg
http://i.imgur.com/6aglKBk.jpg
13F:推 aa06697: 第一个例子举的怪怪的感觉@@ 猜错是flush不是stall 另外12/26 14:01
下面例子的第二个stall
是我用来把那个cycle挡住的啦
他在stall之後才做flush
14F:→ aa06697: 不管是flush还是stall都是透过pipeline register操作 不12/26 14:01
15F:→ aa06697: 是你要stall就「马上」stall 是下个cycle才算是stall12/26 14:01
16F:推 newpuma: 我以为原po是在问branch指令跟前一个指令的相依解决stall12/26 14:24
是这个没错啊XD
17F:→ newpuma: +forwarding耶 哈12/26 14:24
※ 编辑: sate1128 (140.113.186.245), 12/26/2016 19:33:04
※ 编辑: sate1128 (140.113.186.245), 12/26/2016 19:36:47
18F:→ k2shouai: 要改13没错,旧文有这题 12/26 19:51
20F:推 Transfat: ken大你的那张图,为什麽第五个add的IF不是从第八个cycle 12/27 19:56
21F:→ Transfat: 开始呢?为什麽从第九个cycle才IF啊 12/27 19:56
22F:→ Transfat: 还有最後一个add也是为什麽从cycle14不是cycle13呀 12/27 19:57
23F:推 Transfat: 而且你说的p.534那题呀,如果stall cycle是c4,c7,c8,c13 12/27 20:44
24F:→ Transfat: 那麽total number of cycles不是等於5-1+8+1+2+1=16 吗 12/27 20:44
25F:→ Transfat: 为什麽後面又多加了两个1变成18啊 12/27 20:44
26F:→ Transfat: 阿我再回一篇好了 12/27 20:45
28F:→ ken52011219: 因为习惯性直接省略一些instruction来节省空间 但实 12/27 20:56
29F:→ ken52011219: 际上当第8 cycle 的时候,ID判定需要flush并将PC改 12/27 20:56
30F:→ ken52011219: 成原address+4 ,第九cycle时 ID将control signal 设 12/27 20:56
31F:→ ken52011219: 0 ,而IF 则会执行 原address+4 并不会与ID的flush 12/27 20:56
32F:→ ken52011219: 冲突到 12/27 20:56
33F:→ ken52011219: Trans大 的问题是没有把flush算进总 cycle中 12/27 20:59
34F:→ ken52011219: 且这题flush并非为stall 故不用写入 stall cycle中( 12/27 21:00
35F:→ ken52011219: 依稀记得去年九月张凡说的) 12/27 21:00
36F:推 yupog2003: 我也来确认一下自己的观念,因为真正的branch target 12/27 21:03
37F:→ ken52011219: 上面有点小错,是在8 cycle时就将signal 设为0 12/27 21:03
38F:→ yupog2003: 要在bne的ID之後才会知道,如果预测错误的话就要像K大 12/27 21:04
39F:→ yupog2003: 这样把真正的branch target的IF放在bne的ID之後 12/27 21:04
40F:→ yupog2003: 如果预测正确的话是不是可以直接画在bne的IF之後就好? 12/27 21:05
41F:→ yupog2003: 也就是当作什麽问题都没有直接执行下去 12/27 21:05
42F:→ ken52011219: 没错,当预测成功时就会继续执行跳至的address 不用f 12/27 21:07
43F:→ ken52011219: lush 12/27 21:07
44F:→ yupog2003: 那麽stall cycle似乎就只要列出data hazard就好? 12/27 21:08
45F:→ yupog2003: 但是在算总cycle数的时候还是要把预测错误浪费的cycle 12/27 21:08
46F:→ yupog2003: 算进去? 12/27 21:08
47F:→ yupog2003: flush跟stall我也常常搞混,他们共同点就是会浪费cycle 12/27 21:12
48F:→ yupog2003: 但是发生data hazard的时候是要"暂停"pipeline,所以是 12/27 21:12
49F:→ yupog2003: stall,而branch prediction错误是要"洗掉"之前的指令 12/27 21:13
50F:→ yupog2003: 所以是flush,这样直接硬分不知道有没有错误? 12/27 21:13
51F:→ ken52011219: flush 与 stall 的差别最主要是一个直接洗掉某个 12/27 21:19
52F:→ ken52011219: 指令 而 Stall只是藉由延迟instruction 和避免 12/27 21:20
53F:推 Transfat: 我大概了解你们的说法了。因为预测错误,所以要在branch 12/27 21:20
54F:→ Transfat: 的ID阶段执行flush和把control signal设为0,所以下一个 12/27 21:20
55F:→ Transfat: 指令add(PC+4)的IF需要在第九个cycle才可以执行。 12/27 21:20
56F:→ ken52011219: 讯号传递 来达到 stall 的功能 12/27 21:20