2
在MIPS體系結構與流水線和轉發:MIPS中是否存在執行存儲數據隱患?
add $s0, $t1, $t2
sw $s0, 0($sp)
add指令將具有結果準備在步驟3(執行動作),但是我推定該SW指示要在步驟2(指令解碼&寄存器中的結果讀)。
有一個解決的鍛鍊書中計算機組織與設計由David A.帕特森:查找下面的代碼段的危害和重新排序的說明,以避免任何管道攤位:
lw $t1, 0($t0)
lw $t2, 4($t0)
add $t3, $t1,$t2
sw $t3, 12($t0)
lw $t4, 8($01)
add $t5, $t1,$t4
sw $t5, 16($t0)
解決方案:
lw $t1, 0($t0)
lw $t2, 4($t1)
lw $t4, 8($01)
add $t3, $t1,$t2
sw $t3, 12($t0)
add $t5, $t1,$t4
sw $t5, 16($t0)
在它正確識別負載使用的危險,並相應地重新排列碼,但有一個執行店內危險以及解決?
負載使用危險源於負載需要兩個週期,而其他簡單指令(不包括例如乘法)只需要一個週期。簡單指令的結果可以被轉發到下一條指令的執行階段,所以即使對於基址寄存器值也沒有危險(例如'add $ t2,$ t2,1; sw $ t4,0($ T2)')。對於商店,因爲地址生成,緩存索引和標籤檢查必須在實際寫入存儲數據之前完成,甚至可以容忍更長的延遲;直到存儲指令的寫回階段才需要存儲數據。 –