Re: [理工] [計組]-交大94-資工

看板Grad-ProbAsk作者 (svanavs)時間14年前 (2009/10/06 21:56), 編輯推噓3(307)
留言10則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《luckyburgess (the one)》之銘言: : 想請問一下94年交大資工計組的第9題 : 那邊是怎麼解出來的 : http://www.lib.nctu.edu.tw/n_exam/exam94/isc/7006.pdf : 感謝! Loop: lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) addi $s1, $s1, -4 bne $s1, $zero, Loop ALU or branch inst. Data transfer inst. Loop: addi $s1, $s1, -16 lw $t0, 0($s1) (blank) lw $t1, 12($s1) (1) lw $t2, 8($s1) (2) (6) addu $t2, $t2, $s2 (7) (3) (8) (4) (9) (5) sw $t3, 4($s1) ================================================================ 由 addi $s1, $s1, -16 與 addi $s1, $s1, -4 得知unroll了四次 原本 loop 變成 Loop: lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) addi $s1, $s1, -16 bne $s1, $zero, Loop 接著進行 重排指令 與 register renaming Loop: addi $s1, $s1, -16 lw $t0, 0($s1) lw $t1, 12($s1) lw $t2, 8($s1) lw $t3, 4($s1) addu $t0, $t0, $s2 addu $t1, $t1, $s2 addu $t2, $t2, $s2 addu $t3, $t3, $s2 sw $t0, 16($s1) sw $t1, 12($s1) sw $t2, 8($s1) sw $t3, 4($s1) bne $s1, $zero, Loop 最後 調整成可並行執行的順序且不發生 hazard 的 instruction group Loop: addi $s1, $s1, -16 lw $t0, 0($s1) lw $t1, 12($s1) (blank) lw $t2, 8($s1) addu $t0, $t0, $s2 lw $t3, 4($s1) addu $t1, $t1, $s2 addu $t2, $t2, $s2 sw $t0, 16($s1) addu $t3, $t3, $s2 sw $t1, 12($s1) sw $t2, 8($s1) (blank) sw $t3, 4($s1) bne $s1, $zero, Loop 每個 instruction group 可並行執行 變成... ALU or branch Data transfer =========================================================== Loop: addi $s1, $s1, -16 lw $t0, 0($s1) (blank) lw $t1, 12($s1) addu $t0, $t0, $s2 lw $t2, 8($s1) addu $t1, $t1, $s2 lw $t3, 4($s1) addu $t2, $t2, $s2 sw $t0, 16($s1) addu $t3, $t3, $s2 sw $t1, 12($s1) (blank) sw $t2, 8($s1) bne $s1, $zero, Loop sw $t3, 4($s1) ============================================================ 找 instruction group 時要注意 group 內 的 hazard 比如: lw $t0, 0($s1) addu $t0, $t0, $s2 不能成為一個 group group 間的 hazard 比如: 你不能分成 group-1: lw $t1, 12($s1) addu $t0, $t0, $s2 與 group-2: lw $t2, 8($s1) addu $t1, $t1, $s2 因為 group-1 中的 lw 與 group-2 中的 addu 有 load-used hazard -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.222.93

10/07 17:12, , 1F
太強大了...
10/07 17:12, 1F

10/07 17:26, , 2F
我想問一下 接著進行 lw $t0, 0($s1) 跟 sw $t0, 16($s1)
10/07 17:26, 2F

10/07 17:27, , 3F
讀出來的位子與寫進去的位子不同 是因為當時s1尚未-16嗎
10/07 17:27, 3F

10/07 17:27, , 4F
最後sw $t0, 16($s1) 之所以這樣 是因為s1已經加了16嗎??
10/07 17:27, 4F

10/07 18:14, , 5F
應該說addi $s1, $s1, -16 lw $t0, 0($s1) 這兩個指令
10/07 18:14, 5F

10/07 18:17, , 6F
是同時執行 此時$s1還沒被扣16 所以lw 的位置不需要改變
10/07 18:17, 6F

10/07 18:18, , 7F
而後面的sw 需要加16是因為$s1已經先被扣16 所以要加16
10/07 18:18, 7F

10/07 18:18, , 8F
才會和原本的位置相同
10/07 18:18, 8F

10/07 22:09, , 9F
瞭解! 謝謝
10/07 22:09, 9F

10/07 22:30, , 10F
太厲害了!! 感謝你了
10/07 22:30, 10F
文章代碼(AID): #1Aoqo29z (Grad-ProbAsk)
文章代碼(AID): #1Aoqo29z (Grad-ProbAsk)