作者svanavs (svanavs)
看板Grad-ProbAsk
標題Re: [理工] [計組]-94交大資工 計組
時間Tue Oct 6 21:56:16 2009
※ 引述《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
1F:推 yesa315:太強大了... 10/07 17:12
2F:→ yesa315:我想問一下 接著進行 lw $t0, 0($s1) 跟 sw $t0, 16($s1) 10/07 17:26
3F:→ yesa315:讀出來的位子與寫進去的位子不同 是因為當時s1尚未-16嗎 10/07 17:27
4F:→ yesa315:最後sw $t0, 16($s1) 之所以這樣 是因為s1已經加了16嗎?? 10/07 17:27
5F:→ ZALYBAR:應該說addi $s1, $s1, -16 lw $t0, 0($s1) 這兩個指令 10/07 18:14
6F:推 ZALYBAR:是同時執行 此時$s1還沒被扣16 所以lw 的位置不需要改變 10/07 18:17
7F:→ ZALYBAR:而後面的sw 需要加16是因為$s1已經先被扣16 所以要加16 10/07 18:18
8F:→ ZALYBAR:才會和原本的位置相同 10/07 18:18
9F:→ yesa315:瞭解! 謝謝 10/07 22:09
10F:推 luckyburgess:太厲害了!! 感謝你了 10/07 22:30