什麼是資料依賴?
指一條指令在執行之前依賴於順序上更早的指令的結果。在採用流水線或超標量技術的 高效能處理器中,資料依賴性會導致處理器流水線的服務中斷,或者阻止超標量處理器中指令的並行發出。
考慮同一程式中的兩條指令 ik 和 ii,其中 ik 位於 ii 之前。如果 ik 和 ii 有一個公共暫存器或記憶體運算元,則它們相互之間存在資料依賴性,除非該公共運算元在兩條指令中都用作源運算元。
一個例子是 ii 使用 ik 的結果作為源運算元。在順序執行資料中,依賴性不會產生任何問題,因為指令是嚴格按照規定的順序執行的。
資料依賴性既可以出現在後續指令之間的“直線程式碼”中,也可以出現在迴圈中,出現在迴圈的後續迭代所屬的指令之間,如圖所示。

因此,“直線程式碼”可以定義任何程式碼序列,甚至是迴圈體中的指令,這些指令不涉及後續迴圈迭代中的指令。直線程式碼可以包含三種不同型別的依賴性,稱為 RAW(寫後讀)、WAR(讀後寫)和 WAW(寫後寫)依賴性。
直線程式碼中的資料依賴性
記憶體資料的依賴性可以用類似的方法解釋。
RAW 依賴性 − 考慮兩條組合語言指令 −
i1: load r1, a; i2: add r2, r1, r1;
因此,指令 i2 使用 r1 作為源。結果,在 r1 由 i1 載入之前,i2 不能直接執行。因此,i2 依賴於 i1。RAW 依賴性也稱為流依賴性。它們是真正的依賴性,因為它們不能被消除。
RAW 依賴性可以細分為載入使用和定義使用依賴性。在下面的例子中,需要先載入請求的源運算元。此方法可以處理載入使用依賴性。相比之下,如果請求的源運算元在指令序列中前一條指令中表示。
i1: mul r1, r4, r5; i2: add r2, r1, r1;
這種型別的 RAW 依賴性被稱為定義使用依賴性。
WAR 依賴性 − 考慮執行以下指令 −
i1: mul r1, r2, r3; i2: add r2, r4, r5;
在這種情況下,i2 寫入 r2,而 i1 使用 r2 作為源。如果出於任何原因,i2 在 i1 之前執行,則 r2 的初始內容將在 r1 讀取它之前被重寫,這會導致錯誤的結果。
WAW 依賴性:如果兩條指令都寫入相同的目標,則這兩條指令是 WAW 依賴性(或輸出依賴性),如下例所示:
i1: mul r1, r2, r3; i2: add r1, r4, r5;
這種型別的依賴性也是一種虛假依賴性,可以透過暫存器重新命名以類似於 WAR 依賴性的方法消除。當包含的邏輯上先前的指令的執行完成並且產生的結果可以重新整理程式狀態時,會確定 WAW 依賴性。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP