流水線冒險及解決方法
相關----由於一段機器語言程序的鄰近指令之間出現了某種關聯后,為了避免出錯而使得它們不能同時被解釋的現象,又稱相關沖突。
在流水解釋過程中可能會出現三種相關,這三種相關是資源相關、數據相關和控制相關。
1. 資源相關
資源相關----是指多條指令進入流水線后在同一個時鍾周期內爭用同一功能部件所發生的相關。
在圖1所示的流水解釋時空圖中,在第4個時鍾周期時,第I1條指令的MEM段與第I4條指令的IF段都要訪問存儲器。當數據和指令混存在同一個存儲器且只有一個訪問端口時,便會發生兩條指令爭用同一個存儲器資源的相關沖突。

圖1 指令流水解釋的時空圖
解決資源相關的方法主要有以下五種:
(1)從時間上推后下一條指令的訪存操作。
(2)讓操作數和指令分別存放於兩個獨立編址且可同時訪問的主存儲器中。
(3)仍然維持指令和操作數混存,但采用多模塊交叉主存結構。
(4)在CPU內增設指令Cache。
(5)在CPU內增設指令Cache和數據Cache。
2. 數據相關
數據相關----是指由於相鄰的兩條或多條指令使用了相同的數據地址而發生的關聯。這里所說的數據地址包括存儲單元地址和寄存器地址。
例如,有如下三條指令依次流入如圖2所示的流水線:
ADD R1,R2,R3 ;(R2)+(R3)→R1
SUB R1,R4,R5 ;(R4)-(R5)→R1
AND R4,R1,R7 ;(R1)∧(R7)→R4

圖2 三條指令流水解釋的時空圖
第三條指令與前面兩條指令之間存在着關於寄存器R1的先寫后讀(RAW)數據相關。
解決數據相關的方法主要有以下兩種:
(1)推后相關單元的讀。

圖 3三條指令流水解釋的時空圖(用方法1解決數據相關)
(2)設置相關專用通路,又稱采用定向傳送技術。

圖4 相關專用通路

圖5 三條指令流水解釋的時空圖(用方法2解決數據相關)
推后相關單元的讀和設置相關專用通路是解決流水解釋方式中數據相關的兩種基本方法。推后相關單元的讀是以降低速度為代價,使設備基本上不增加,而設置相關專用通路是以增加硬件為代價,使流水解釋的性能盡可能不降低。
對流水的流動順序的安排和控制可以有兩種方式:順序流動方式和異步流動方式。
順序流動方式----是指流水線輸出端的任務(指令)流出順序和輸入端的流入順序一樣。
順序流動方式的優點是控制比較簡單。其缺點是一旦發生數據相關后,在空間和時間上都會有損失,使得流水線的吞吐率和功能部件的利用率降低。
異步流動方式----是指流水線輸出端的任務(指令)流出順序和輸入端的流入順序可以不一樣。
異步流動方式的優點是流水線的吞吐率和功能部件的利用率都不會下降。但采用異步流動方式帶來了新的問題,采用異步流動的控制復雜,而且會發生在順序流動中不會出現的其它相關。由於異步流動要改變指令的執行順序,同時流水線的異步流動還會使相關情況復雜化,會出現除先寫后讀(RAW)相關以外的先讀后寫(WAR)相關和寫寫(WAW)相關。
3. 控制相關
控制相關----是指由轉移指令引起的相關。
解決控制相關的方法主要有以下兩種:
(1)延遲轉移技術。
延遲轉移技術----將轉移指令與其前面的與轉移指令無關的一條或幾條指令對換位置,讓成功轉移總是在緊跟的指令被執行之后發生,從而使預取的指令不作廢。
(2)轉移預測技術。
轉移預測技術可分為靜態轉移預測和動態轉移預測兩種(由硬件來實現)。
靜態轉移預測技術有兩種實現方法:
一種是分析程序結構本身的特點來進行預測。不少條件轉移指令轉向兩個目標地址的概率是能夠預估的,如若x86匯編語言中連續的兩條語句為“ADD AX,BX”、“JNZ L1”,則轉向標號L1的概率要高,只要編譯程序把出現概率高的分支安排為猜選分支,就能顯著減少由於處理條件轉移所帶來的流水線吞吐率和效率的損失。
另一種是按照分支的方向來預測分支是否轉移成功。一般來說,向后分支被假定為循環的一部分而且被假定為發生轉移,這種靜態預測的准確性是相當高的。向前分支被假定為條件語句的一部分而且被假定為不發生轉移,這種靜態預測的准確性比向后分支的准確性要低得多。
要提高預測的准確度,可以采用動態預測的方法,在硬件上建立分支預測緩沖站及分支目標緩沖站,根據執行過程中轉移的歷史記錄來動態的預測轉移目標,其預測准確度可以提高到90%以上。這種方法已在現代微處理器的轉移預測中得到了廣泛應用。例如,Pentium 4微處理器中的L1 BTB(Branch Target Buffer,轉移目標緩沖器)采用的就是動態轉移預測技術,當轉移指令不在BTB中時,則采用靜態轉移預測技術。
在安騰體系結構設計時,采用了一種新的轉移預測技術。該技術將傳統的分支結構變為無分支的並行代碼,當處理機在運行中遇到分支時,它並不是進行傳統的分支預測並選擇可能性最大的一個分支執行,而是利用多個功能部件按分支的所有可能的后續路徑開始並行執行多段代碼,並暫存各段代碼的執行結果,直到處理機能夠確認分支轉移與否的條件是真是假時,處理機再把應該選擇的路徑上的指令執行結果保留下來。采用了這種技術后,可消除大部分轉移指令對流水解釋的影響,使得整個系統的運行速度得到提高。
