相關是影響亂序調度的罪魁禍首,如果指令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的結果,這種相關性是由指令的控制流決定的,因此被稱為控制相關。