Try   HackMD

2017q1 Homework4 (microarch)

contributed by <vtim9907>

前置

問題

考慮以下 MIPS 實作,其 data path 如下:

上圖紅色的 1, 2, 3 對 MIPS 做了對應的修改,請考慮以下狀況,分別解釋對應的程式碼是否能運作:

Q1

  • 做了 1: Stuck at 0 left of cut 的修改,sw $s1, 0($s2) 能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表。

A1

回顧教材時,發現一張很熟悉的圖

之前上計組的時候看過也背過,沒想到忘這麼快Orz

  • (截自黃婷婷教授的 ppt 教材

圖中,第一列是 R-type 指令,第二列是 lw ,第三列是 sw ,第四列是 beq。

  • 針對題目中被切斷的地方,會影響到的是 RegWrite,也就是會影響把值寫回 Register 的指令。
  • 然而從上圖很快可以知道,R-type 和 Load 兩類指令會受影響,簡單來說,因為這兩類指令跑完的結果都需要寫回某個 Register,而像 sw 和 beq 就不同,sw 主要是把 register 的值寫回 Memory ,跟 lw 剛好相反 ; 而 beq 也只是單純的比較,沒牽扯到寫值進 Register 的步驟。
  • 所以題目中問到 "sw $s1, 0($s2)能否運作?",我想答案是可以的,畢竟 sw 不受影響。

Q2

  • 做了 2 的修改後,以下程式能否運作?解釋並提出可運作的版本。
add $s1, $s1, $s1
add $s1, $t0, $t1

A2

根據題目砍掉的那條,會影響到 Forwarding 的機制,很可能會發生 Data Hazard。

  • 再回來看 Q2,第一行做完,由於 Dst 也就是 $s1 的結果還沒寫進去,如果下一條指令的 Src1 有用到 $s1 那就會拿到錯的值。
  • 但是第二道指令沒有 Src 用到 $s1,所以說這兩行 code 還是可以正常運作。

探討

假設有第三道指令?

  • 因為砍掉的這條只會影響下一道指令的 Forwarding 機制,所以如果還有第三道指令,並且用到 $s1 ,現在第一道指令的$s1 結果還是會 Forward 回去的。
  • 但是因為不幸的,第二道指令也改動了 $s1 的值,所以第三道指令拿到的 $s1 依然有可能不是最新的值。
    • 為什麼只是有可能不是拿到最新的值呢? 因為圖中砍掉的線只有砍到 Src1 的 Forward 機制,如果說存在第三道指令為 add $s1, $s0, $s1,那麼這三行 code 依然可以運作,因為第三道指令的 $s1 放在 Src2,所以整個 Forward 機制依然正常。

Q3

  • 做了 3 的修改後,以下程式能否運作?
addi $s2, $zero, 2
addi $s1, $zero, 2
beq $s2, $s1, exit

A3

砍掉第三條,會影響到 condition branch 的機制

  • 根據黃婷婷教授的 ppt 內容,其中一部份寫到
Handling Branch Hazard
- Move up branch address calculation to ID
- Check branch equality at ID (using XOR) by comparing the two registers
  read during ID
- Branch decision made at ID => one instruction to flush
- Add a control signal, IF.Flush, to zero instruction field of IF/ID 
  => making the instruction an NOP
  • 所以知道,圖中被砍掉的地方,原來是為了希望在 ID 時就可以用 XOR 來確定兩個 registers 的值是否相同,藉以減少 branch 帶來的 delay。
  • 那麼根據 Q3 的 code ,因為使用到了 beq,剛好使用到了被砍掉的機制,所以這段 code 沒辦法運作。

探討

雖然作業沒寫到,但是小考時有提到該如何做修改,所以我來嘗試看看修改程可以運作的版本。

  • 根據本題上面的結論,不能使用的是 condition branch 一類的指令,那麼簡單來說,只要把這類指令換成其他指令的組合,能達到其他功效就 OK! 我的想法是直接照著圖上的路線,用其他指令取代原有的機制。
  • 主要觀念
    • 首先 compare 的部份從本題上面的結論也可以知道,用 XOR 來做就好。
    • 沒辦法用 beq 判斷結果是否零,那就用 slt 取代,同樣可以確定 XOR 出來的結果是否等於零, 而且得到的結果只有 0 或 1。
    • 從題目的結構圖中,可以看到,因為每道指令是 4 bytes,所以有一個 Shift Left 2 的 unit ,不過用 sll 也可以模擬。
    • 使用 J-type 指令來完成原來 branch 的功能。

code 如下:

cmp:
    xor $t1, $s2, $s1
    slt $t2, $zero, $t1
    sll $t2, 2
    add $ra, $ra, $t2
    jr  $ra
------------------------

addi $s2, $zero, 2
addi $s1, $zero, 2
jal  cmp
j    exit

小結

計組、計結很重要,實在應該好好理解,背頌的成果很差,很容易忘記 當然如能實際應用更能加深印象@@

黃婷婷教授的 Computer Architecture 開放式課程很讚! 當然,算盤書也是。

Reference