作者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