Re: [理工] [計組] RAW WAR WAW...
Three data dependencies:
================================================
RAW
= read after write ----
= True dependency | << 兩者相同??
= read before write ----
read after write =/= read before write (read before write 應該像是 WAR)
所謂的True dependency,指的是read after write,且只有這種才算
這類的dependency是會造成程式結果錯誤的情形
發生的情形就是後面的資料會參考到前面指令的結果
而前面的指令又尚未完成,因此消極的作法就是等有結果後再接續後面的運作
比較常見的解決方式就是forwarding
=================================================
WAR
= write after read ------
= Anti dependency | ==?
= write before read ----
write after read =/= write before read (write before read 應該像是 RAW)
WAR 和 WAW 只會出現在允許out-of-order的架構下
因為指令完成的順序可能不會依照指令出現的先後
因此後面的指令有可能會比前面的指令先行完成
WAR 和 WAW 都是因為暫存器名字使用相同,
但是後面的指令卻比前面先完成的case
Ex : I0: R4 <- R1 + R3 (後讀)
I1: R3 <- R1 + R2 (先寫)
正常來說,I0執行完才會執行I1
但是因為允許out-of-order的情形下
I1如果一下子就做完了就先寫入結果
而I0拖到I1都已經覆蓋掉原本R3的data,
這時候才去抓R3的data就勢必會是錯誤的結果
==================================================
WAW
=write after write ----
=Output dependency | = 這看起來就可能一樣
=write before write ---- 只不過我比較沒聽說過 XXX before OOO 這類的說法
這和WAR的例子很相似,也是出現在可out-of-order的架構下
一樣是後面的指令比前面的指令先完成的case
Ex : I0. R0 <- R1 + R2 (後寫)
I1. R0 <- R3 + R4 (先寫)
I2. R6 <- R0 + R5 (最後讀到I0)
要使程式結果是正確的,I2中的R0必須是I1所運算完成後寫完的data
但是如果在out-of-order的情形下
I0 做的比較緩慢
I1 一下子就完成了
就會變成I1先寫入後,I0去覆蓋掉I1的data
之後要參考到R0暫存器的指令都是拿到I0算的data而不是I1算的data
========================================================
WAW, WAR 都是暫存器不夠用,使用到相同名字下,而且又是不照順序完成的case
所以傳統的pipeline 是可以不被考慮的
而他的解決方式就是讓暫存器換個名字(renaming)就OK了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.37.134.48
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):