數據相關:指在流水線中執行的幾條指令中,一條指令依賴於前面指令的執行結果。
- WAW: Write-After-Write(寫后再寫) ordering for requests to the same address. 假設指令Write1是在指令Write0后面執行的指令,WAW表示指令Write0將數據寫入寄存器后,指令Write1才能將數據寫入這個寄存器。如果指令Write1在指令Write0之前寫該寄存器,將使得該寄存器的值不是最新值。
- RAR: Read-After-Read(讀后再讀) ordering for requests to the same address. 假設指令Read1是在指令Read0后面執行的指令,RAR表示指令Read0讀出數據后,指令Read1才能從這個寄存器讀取數據。如果指令Read1在指令Read0之前讀該寄存器,將使得讀到的寄存器值不是最新值。
- WAR: Write-After-Read(先讀后寫) ordering for requests to the same address. 假設指令Write是在指令Read后面執行的指令,WAR表示指令Read讀出數據后,指令Write才能寫這個寄存器。如果指令Write在指令Read讀出數據前就寫該寄存器,將使得指令Read讀出的數據不正確。
- RAW: Read-After-Write(先寫后讀) ordering for requests to the same address. 假設指令Read是在指令Write后面執行的指令,RAW表示指令Write將數據寫入寄存器后,指令Read才能從這個寄存器讀取數據。如果指令Read在指令Write寫入寄存器前嘗試讀出該寄存器的內容,將得到不正確的數據。
WAW,WAR,RAW很好理解。關於RAR:如果兩條Read0/Read1指令之間沒有相同地址的Write指令,那么Read0和Read1讀出的數據是一樣的,不存在數據相關;如果兩條Read0/Read1指令之間有相同地址的Write指令,那么相當於對同一個地址執行Read0 -> Write -> Read1操作,這是WAR和RAW的組合,由於CPU是想讀Read1指令的數據,因此Read0和Write的數據相關可以不考慮,只需要考慮Write和Read1的數據相關即可。所以RAR本質上是RAW。
如何解決數據相關的問題呢?
TBD...