指令相關


相關是影響亂序調度的罪魁禍首,如果指令2的執行需要依賴指令1的結果,我們就
說這兩條指令是相關的,指令2必須在指令1后面執行,無法亂序。
下圖描述了指令間的相關性:

1.寄存器相關

當兩條語句沒有共用寄存器時,它們之間是不相關的,而當兩條語句共用寄存器時,它們就有可能相關。
我們以x86匯編來看看指令間的相關性。
(1) 先讀后讀

這兩條指令實際上是沒有相關性的,調轉一下執行順序,對結果沒有影響。

(2) 先寫后讀(Read-Afer- Write,RAW)
這兩條指令都用到BX,指令1輸出BX給指令2用,它們之間有數據流動,存在依賴性,因此也稱為數據相關。

(3) 先讀后寫( Write -After- Read,WAR)

這兩條指令都用到AX,指令1讀AX,指令2寫AX,如果直接將兩條語句調轉,執行結果自然是不一樣的,因此它們具有相關性。不過如果仔細分析一下,這兩條語句之間並沒有數據流向,在邏輯上並沒有相關性,引起它們相關性的原因在於:x86處理器對程序員可見的通用寄存器太少了,指令不得不共用寄存器,這樣才導致指令間存在相關。WAR和RAW相反,因此這種相關也稱為反相關( Anti Dependencies)。

(4) 先寫后寫( Write- After- Write,WAW)

這兩條指令都向AX中寫,和wAR一樣,wAW的兩條指令間也沒有數據流動,它們的相關是因為有相同的輸出寄存器,因此被稱為輸出相關( Output Dependencies)。WAR和wAW沒有邏輯上的相關性,只是由於共用了同一個寄存器而存在相關性,它們被稱為偽相關( False Dependencies)或者名字相關( Name Dependencies)

2. 控制相關

程序中有許多條件跳轉,如下面這個例子:

mov
cmp
JNZ label
ADD
....
label: XOR

JNZ是個條件跳轉語句,XOR指令的執行需要依賴於JNZ的結果,這種相關性是由指令的控制流決定的,因此被稱為控制相關。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM