第5章標量處理機(5.4,5.5,5.6)流水線的沖突MIPS流水線_第1頁
第5章標量處理機(5.4,5.5,5.6)流水線的沖突MIPS流水線_第2頁
第5章標量處理機(5.4,5.5,5.6)流水線的沖突MIPS流水線_第3頁
第5章標量處理機(5.4,5.5,5.6)流水線的沖突MIPS流水線_第4頁
第5章標量處理機(5.4,5.5,5.6)流水線的沖突MIPS流水線_第5頁
已閱讀5頁,還剩106頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

5.4流水線的相關與沖突5.4.1一條經典的5段流水線5.4.2相關與流水線的沖突介紹一條經典的5段RISC流水線

首先討論在非流水情況下是如何實現的一條指令的執行過程分為以下5個周期:取指令周期(IF)以程序計數器PC中的內容作為地址,從存儲器中取出指令并放入指令寄存器IR;同時PC值加4(假設每條指令占4個字節),指向順序的下一條指令。

5.4流水線的相關與沖突5.4.1一條經典的5段流水線指令譯碼/讀寄存器周期(ID)對指令進行譯碼,并讀出寄存器的內容。用IR中的寄存器地址去訪問通用寄存器組,讀出所需的操作數。由于指令的立即數部分也保存在相同的位置,需要擴展立即數的操作也在本段完成。

執行/有效地址計算周期(EX)不同指令所進行的操作不同:load和store指令:ALU把指令中所指定的寄存器的內容與偏移量相加,形成訪存有效地址。寄存器-寄存器ALU指令:ALU按照操作碼指定的操作對從通用寄存器組中讀出的數據進行運算。寄存器-立即數ALU指令:ALU按照操作碼指定的操作對從通用寄存器組中讀出的操作數和指令中給出的立即數進行運算。分支指令:ALU把指令中給出的偏移量與PC值相加,形成轉移目標的地址。同時,對在前一個周期讀出的操作數進行判斷,確定分支是否成功。存儲器訪問/分支完成周期(MEM)該周期處理的指令只有load、store和分支指令。其它類型的指令在此周期不做任何操作。load和store指令load指令:用上一個周期計算出的有效地址從存儲器中讀出相應的數據;store指令:把指定的數據寫入這個有效地址所指出的存儲器單元。分支指令分支“成功”,就把轉移目標地址送入PC。分支指令執行完成。寫回周期(WB)

ALU運算指令和load指令在這個周期把結果數據寫入通用寄存器組。

ALU運算指令:結果數據來自ALU。

load指令:結果數據來自存儲器。在這個實現方案中:分支指令需要4個時鐘周期(如果把分支指令的執行提前到ID周期,則只需要2個周期);store指令需要4個周期;其它指令需要5個周期才能完成。在更先進的實現中,在ID段完成對寄存器的內容進行比較,判斷是否為轉移指令,若為真,將PC與帶符號的位移量相加,生成的轉移目標地址寫人PC,在ID段完成對轉移的處理。將上述實現方案修改為流水線實現一條經典的5段流水線

每一個周期作為一個流水段;在各段之間加上鎖存器(流水寄存器)。流水寄存器保證了流水線中不同段的指令不會相互影響。每個時鐘周期結束之后,該段的所有執行結果都保存在流水段寄存器中,在下一個時鐘周期開始作為下一個段的輸入。

第一種描述(類似于時空圖)

5段流水線的兩種描述方式流水線的實現必須關注:需要確定處理器在每一個時鐘周期都進行什么樣的動作。要保證在同一個周期沒有兩條指令使用相同的數據通路資源。可以采用流水線方式下簡化的RISC數據通路圖來表示:第二種描述(按時間錯開的數據通路序列)

采用流水線方式實現時,應解決好以下幾個問題:要保證不會在同一時鐘周期要求同一個功能段做兩件不同的工作。例如:不能要求ALU同時做有效地址計算和算術運算。避免IF段的訪存(取指令)與MEM段的訪存(讀/寫數據)發生沖突。可以采用分離的指令存儲器和數據存儲器;一般采用分離的指令Cache和數據Cache。ID段和WB段都要訪問同一寄存器文件。

ID段:讀WB段:寫寄存器堆在ID段被讀,在WE段被寫,所以在數據通路中出現兩次對于在一個時鐘周期內同一寄存器堆進行操作,在時鐘的前半部分進行寫寄存器的操作,后半部分進行讀寄存器的操作。如何解決對同一寄存器的訪問沖突?把寫操作安排在時鐘周期的前半拍完成,把讀操作安排在后半拍完成。邊框畫實線表示操作,畫虛線表示不做任何操作。考慮PC的問題流水線為了能夠每個時鐘周期啟動一條新的指令,就必須在每個時鐘周期進行PC值的加4操作,并保留新的PC值。這種操作必須在IF段完成,以便為取下一條指令做好準備。

(需設置一個專門的加法器)但分支指令也可能改變PC的值,而且是在MEM段進行,這會導致沖突。請考慮一下,如何處理分支指令?相關:兩條指令之間存在某種依賴關系。如果兩條指令相關,則它們就有可能不能在流水線中重疊執行或者只能部分重疊執行。5.4.2.1相關與流水線沖突5.4.2相關與流水線沖突

流水線沖突是指對于具體的流水線來說,由于相關的存在,使得指令流中的下一條指令不能在指定的時鐘周期執行。流水線沖突有3種類型:結構沖突:因硬件資源滿足不了指令重疊執行的要求而發生的沖突。數據沖突:當指令在流水線中重疊執行時,因需要用到前面指令的執行結果而發生的沖突。控制沖突:流水線遇到分支指令和其它會改變PC值的指令所引起的沖突。流水線沖突導致錯誤的執行結果。流水線可能會出現停頓,從而降低流水線的效率和實際的加速比。我們約定當一條指令被暫停時,在該暫停指令之后流出的所有指令都要被暫停,而在該暫停指令之前流出的指令則繼續進行(否則就永遠無法消除沖突)。帶來的幾個問題:在流水線處理機中,為了能夠使各種組合的指令都能順利地重疊執行,需要對功能部件進行流水或重復設置資源。如果某種指令組合因為資源沖突而不能正常執行,則稱該處理機有結構沖突。常見的導致結構沖突的原因:功能部件不是完全流水資源份數不夠結構沖突結構沖突舉例:訪存沖突

有些流水線處理機只有一個存儲器,將數據和指令放在一起,訪存指令會導致訪存沖突。解決辦法Ⅰ:插入暫停周期(“流水線氣泡”或“氣泡”)引入暫停后的時空圖解決方法Ⅱ:

設置相互獨立的指令存儲器和數據存儲器或設置相互獨立的指令Cache和數據Cache。由于訪問同一個存儲器而引起的結構沖突

訪存沖突返回為消除結構沖突而插入的流水線氣泡引入暫停后的時空圖指令編號時鐘周期12345678910指令iIFIDEXMEMWB指令i+1IFIDEXMEMWB指令i+2IFIDEXMEMWB指令i+3stall

IFIDEXMEMWB指令i+4IFIDEXMEMWB指令i+5IFIDEXMEM有時流水線設計者允許結構沖突的存在主要原因:減少硬件成本如果把流水線中的所有功能單元完全流水化,或者重復設置足夠份數,那么所花費的成本將相當高。

數據沖突當相關的指令靠得足夠近時,它們在流水線中的重疊執行或者重新排序會改變指令讀/寫操作數的順序,使之不同于它們串行執行時的順序,則發生了數據沖突。

舉例:

DADDR1,R2,R3DSUBR4,R1,R5XORR6,R1,R7ANDR8,R1,R9ORR10,R1,R11流水線的數據沖突舉例ADD在WB段寫R1,SUB則在ID段讀R1,產生了數據相關。XOR也受到數據相關的影響AND操作由于前半個周期寫寄存器對,后半個周期讀寄存器堆,可以正確執行。OR操作也能正確執行,此時R1的值已經被正確寫人根據指令讀訪問和寫訪問的順序,可以將數據沖突分為3種類型。考慮兩條指令i和j

,且i在j之前進入流水線,可能發生的數據沖突有:寫后讀沖突(RAW)在

i

寫入之前,j

先去讀。

j讀出的內容是錯誤的。這是最常見的一種數據沖突,它對應于真數據相關。數據沖突的三種類型寫后寫沖突(WAW)在

i

寫入之前,j

先寫。最后寫入的結果是

i

的。錯誤!這種沖突對應于輸出相關。寫后寫沖突僅發生在這樣的流水線中:流水線中不只一個段可以進行寫操作;指令被重新排序了。前面介紹的5段流水線不會發生寫后寫沖突。(只在WB段寫寄存器)讀后寫沖突(WAR)在i

讀之前,j

先寫。

i

讀出的內容是錯誤的!由反相關引起。這種沖突僅發生在這樣的情況下:有些指令的寫結果操作提前了,而且有些指令的讀操作滯后了;指令被重新排序了。

通過定向技術減少數據沖突引起的停頓(定向技術也稱為旁路或短路)關鍵思想:在計算結果尚未出來之前,后面等待使用該結果的指令并不真正立即需要該計算結果,如果能夠將該計算結果從其產生的地方直接送到其它指令需要它的地方,那么就可以避免停頓。采用定向技術消除上例中的相關

DSUB操作是在DADD操作產生了結果之后才使用該結果的,考慮將DADD的結果從EX/MEM寄存器移到DSUB需要的地方,也就是ALU的輸入鎖存器,則不需要引入停頓。采用定向技術后的流水線數據通路

工作過程演示定向的實現EX段和MEM段之間的流水寄存器中保存的ALU運算結果總是回送到ALU的入口。當定向硬件檢測到前一個ALU運算結果寫入的寄存器就是當前ALU操作的源寄存器時,那么控制邏輯就選擇定向的數據作為ALU的輸入,而不采用從通用寄存器組讀出的數據。在使用直通時,如果DSUB操作被停頓,那么DADD操作將被完整執行,沒有必要激活旁路。當兩個操作之間有一個中斷也是如此。直通的實現直通思想可以一般化:可以將結果直接送到需要它的單元,并不限制在同一個單元的輸出到輸入。并不是所有的數據沖突都可以用定向技術來解決。

舉例:LDR1,0(R2)DADDR4,R1,R5ANDR6,R1,R7XORR8,R1,R9增加流水線互鎖機制,插入“暫停”。作用:檢測發現數據沖突,并使流水線停頓,直至沖突消失。

舉例:演示A(資源圖表示)

演示B(時空圖表示)需要停頓的數據沖突無法將LD指令的結果定向到DADD指令

采用定向無法解決返回依靠編譯器解決數據沖突

讓編譯器重新組織指令順序來消除沖突,這種技術稱為指令調度或流水線調度。調度前的代碼調度后的代碼LDRb,BLDRc,CDADDRa,Rb,RcSDRa,ALDRe,ELDRf,FDSUBRd,Re,RfSDRd,DLDRb,BLDRc,CLDRe,EDADDRa,Rb,RcLDRf,FSDRa,ADSUBRd,Re,RfSDRd,D舉例:

請為下列表達式生成沒有暫停的指令序列:

A=B+C;

D=E-F;

假設載入延遲為1個時鐘周期。

題解控制沖突執行分支指令的結果有兩種分支成功:PC值改變為分支轉移的目標地址。在條件判定和轉移地址計算都完成后,才改變PC值。不成功或者失敗:PC的值保持正常遞增,指向順序的下一條指令。處理分支指令最簡單的方法:“凍結”或者“排空”流水線

優點:簡單前述5段流水線中,改變PC值是在MEM段進行的。給流水線帶來了3個時鐘周期的延遲控制沖突分支指令IFIDEXMEMWB

分支目標指令IF

stall

stall

IF

IDEXMEMWB分支目標指令+1IFIDEXMEM

WB分支目標指令+2IFIDEXMEM

分支目標指令+3IFIDEX簡單處理分支指令:分支成功的情況

把由分支指令引起的延遲稱為分支延遲。分支指令在目標代碼中出現的頻度每3~4條指令就有一條是分支指令。假設:分支指令出現的頻度是30%

流水線理想CPI=1

那么:流水線的實際CPI=1.9可采取兩種措施來減少分支延遲。在流水線中盡早判斷出分支轉移是否成功;盡早計算出分支目標地址。下面的討論中,我們假設:

這兩步工作被提前到ID段完成,即分支指令是在ID段的末尾執行完成,所帶來的分支延遲為一個時鐘周期。3種通過軟件(編譯器)來減少分支延遲的方法

共同點:對分支的處理方法在程序的執行過程中始終是不變的,是靜態的。(在整個程序的執行過程中對每個轉移的處理都是一樣的)要么總是預測分支成功,要么總是預測分支失敗。預測分支失敗

允許分支指令后的指令繼續在流水線中流動,就好象什么都沒發生似的;若確定分支失敗,將分支指令看作是一條普通指令,流水線正常流動;若確定分支成功,流水線就把在分支指令之后取出的所有指令轉化為空操作,并按分支目地重新取指令執行。要保證:分支結果出來之前不能改變處理機的狀態,以便一旦猜錯時,處理機能夠回退到原先的狀態。流水線的處理過程轉移不成功和轉移成功兩種情況下的流水線序列預測分支成功:假設分支轉移成功,并從分支目標地址處取指令執行。起作用的前題:先知道分支目標地址,后知道分支是否成功。前述5段流水線中,這種方法沒有任何好處。無論采用預測不成功還是預測成功,編譯器都能通過組織代碼來實現與硬件的最佳匹配。不論采用剛才說的哪種策略,編譯器都能通過組織代碼來實現與硬件的最佳匹配。延遲分支主要思想:從邏輯上“延長”分支指令的執行時間。把延遲分支看成是由原來的分支指令和若干個延遲槽構成,不管分支是否成功,都要按順序執行延遲槽中的指令。有些處理器中也稱為延遲轉移,在早期的RISC處理器中被廣泛使用。在被延遲的轉移中,轉移延遲為1的執行周期如下:轉移指令后續指令1(放在延遲槽內)目標地址的指令(如果轉移被選中)執行過程雖然延遲槽的長度可以大于1,實際上,所有帶轉移延遲的處理器一般只延遲一條指令,并使用其它技術來處理更多有關延遲的開銷任務:在延遲槽中放入有用的指令由編譯器完成。能否帶來好處取決于編譯器能否把有用的指令調度到延遲槽中。三種調度方法:解決究竟將什么指令裝入延遲槽?從前調度(將轉移指令之前的指令裝入延遲槽)從目標處調度(將轉移目標地址處的指令裝入延遲槽)從失敗處調度(將延遲槽后的指令裝入延遲槽)分支延遲指令的調度從前面調度來自前面:將分支指令之前的一條獨立指令調度到延遲槽具有一個分支延遲槽的流水線的執行過程分支失敗分支指令iIFIDEXMEMWB延遲槽指令IFIDEXMEMWB指令i+1IFIDEXMEMWB指令i+2IFIDEXMEMWB指令i+3IFIDEXMEMWB分支延遲槽中的指令“掩蓋”了流水線原來必需插入的暫停周期。分支成功

分支指令iIFIDEXMEMWB

延遲槽指令IFIDEXMEMWB分支目標指令jIFIDEXMEMWB分支目標指令j+1IFIDEXMEMWB分支目標指令j+2IFIDEXMEMWB從目標處調度來自目標地址:將目標處的指令拷貝到延遲槽同時修改分支指令的目標地址。由于從別的路徑可能也要執行到該指令,所以不能簡單的移指令,而是復制。采用這種方法實際上是猜測分支成功,所以對于循環等分支轉移成功概率較高的采用此方法較好分支不跳轉分支指令iIFIDEXMEMWB延遲槽指令IFidle

idleidleidle指令i+1IFIDEXMEMWB指令i+2IFIDEXMEMWB指令i+3IFIDEXMEMWB分支跳轉分支指令iIFIDEXMEMWB

延遲槽指令

IFIDEXMEMWB分支目標指令j+1IFIDEXMEMWB分支目標指令jj+2IFIDEXMEMWB分支目標指令j+3IFIDEXMEMWB預測分支成功的情況下,分支取消機制的執行情況從失敗處調度將延遲槽后的指令裝入延遲槽。分支不跳轉分支指令iIFIDEXMEMWB延遲槽指令i+1

IFIDEXMEMWB指令i+2IFIDEXMEMWB指令i+3IFIDEXMEMWB指令i+4IFIDEXMEMWB分支跳轉分支指令iIFIDEXMEMWB

延遲槽指令i+1

IFidle

idleidleidle分支目標指令jIFIDEXMEMWB分支目標指令j+1IFIDEXMEMWB分支目標指令j+2IFIDEXMEMWB預測分支不轉移的情況下,分支取消機制的執行情況從失敗處調度調度前和調度后的代碼三種方法的要求及效果調度策略對調度的要求什么情況下起作用?從前調度從目標處調度從失敗處調度必須保證在分支失敗時執行被調度

的指令不會導致錯誤。有可能需要

復制指令。被調度的指令必須與分支無關必須保證在分支成功時執行被調度

的指令不會導致錯誤。任何情況

分支成功時(但由于復制指令,有

可能會增大程序空間) 分支失敗時分支延遲受到兩個方面的限制:可以被放入延遲槽中的指令要滿足一定的條件;編譯器預測分支轉移方向的能力。進一步改進:分支取消機制(取消分支)當分支的實際執行方向和事先所預測的一樣時,執行分支延遲槽中的指令,否則就將分支延遲槽中的指令轉化成一個空操作。此時,轉移指令帶有對轉移能否被選中的預測。預測準確時,延遲槽中的指令像通常一樣執行,否則就將延遲槽中的指令變成空操作。5.5流水線的實現5.5.1MIPS的一種簡單實現5.5.2基本的MIPS流水線實現MIPS指令子集的一種簡單數據通路。該數據通路的操作分成5個時鐘周期取指令指令譯碼/讀寄存器執行/有效地址計算存儲器訪問/分支完成寫回只討論整數指令的實現(包括:load和store,等于0轉移,整數ALU指令等。)

5.5.1MIPS的一種簡單實現5.5流水線的實現設置了一些臨時寄存器。其作用如下:PC:程序計數器,存放當前指令的地址。NPC:下一條程序計數器,存放下一條指令的地址。IR:指令寄存器,存放當前正在處理的指令。A:第一操作數寄存器,存放從通用寄存器組讀出來的操作數。B:第二操作數寄存器,存放從通用寄存器組讀出來的另一個操作數。Imm:存放符號擴展后的立即數操作數。Cond:存放條件判定的結果。為“真”表示分支成功。ALUo:存放ALU的運算結果。LMD:存放load指令從存儲器讀出的數據。臨時寄存器的作用MIPS指令系統結構尋址方式編碼到操作碼中所有的指令都是32位的操作碼占6位3種指令格式

3種格式中,同名字段的位置固定不變。MIPS的指令格式MIPS指令系統結構I類指令包括所有的load和store指令,立即數指令,分支指令,寄存器跳轉指令,寄存器鏈接跳轉指令。立即數字段為16位,用于提供立即數或偏移量。MIPS指令系統結構load指令訪存有效地址:Regs[rs]+immediate

從存儲器取來的數據放入寄存器rtstore指令訪存有效地址:Regs[rs]+immediate

要存入存儲器的數據放在寄存器rt中立即數指令

Regs[rt]←Regs[rs]opimmediate分支指令轉移目標地址(PC)+immediate寄存器跳轉、寄存器跳轉并鏈接轉移目標地址為Regs[rs]MIPS指令系統結構R類指令包括ALU指令,專用寄存器讀/寫指令,move指令等。ALU指令

Regs[rd]←Regs[rs]functRegs[rt]funct為具體的運算操作編碼MIPS指令系統結構J類指令包括跳轉指令,跳轉并鏈接指令,自陷指令,異常返回指令。在這類指令中,指令字的低26位是偏移量,它與PC值相加形成跳轉的地址。一條MIPS指令最多需要以下5個時鐘周期:取指令周期(IF)

操作IR←Mem[PC]NPC←PC+4指令譯碼/讀寄存器周期(ID)

操作A←

Regs[rs]B←

Regs[rt]Imm←

IR的立即數字段進行符號擴展

指令的譯碼操作和讀寄存器操作是并行進行的。原因:在MIPS指令格式中,操作碼字段以及rs、rt

字段都是在固定的位置。這種技術稱為固定字段譯碼技術。

由于指令的立即數部分在MIPS格式中都有相同的位置,所以要是下一個時鐘周期需要使用立即數,帶符號立即數的符號擴展操作也在當前時鐘周期完成。執行/有效地址計算周期(EX)不同指令所進行的操作不同:load指令和store指令操作

ALUo←A+Imm寄存器-寄存器ALU指令操作

ALUo←AfunctB寄存器-立即值ALU指令操作

ALUo←AopImm分支指令操作

ALUo←NPC+(Imm<<2);

cond←(A==0)

將有效地址計算周期和執行周期合并為一個時鐘周期,這是因為MIPS指令集采用load/store結構,沒有任何指令需要同時進行數據有效地址的計算、轉移目標地址的計算和對數據進行運算。存儲器訪問/分支完成周期(MEM)所有指令都要在該周期對PC進行更新。除了分支指令,其它指令都是做:PC←NPC在該周期內處理的MIPS指令僅僅有load、store和分支三種指令。load指令和store指令操作LMD←Mem[ALUo]或者Mem[ALUo]←B分支指令操作

if(cond)PC←ALUoelsePC←NPC寫回周期(WB)不同的指令在寫回周期完成的工作也不一樣。寄存器-寄存器ALU指令操作

Regs[rd]←ALUo寄存器-立即數ALU指令操作

Regs[rt]←ALUoload指令操作

Regs[rt]←LMDMIPS的數據通路的實現每一個時鐘周期完成的工作看作是流水線的一段,每個時鐘周期啟動一條新的指令,就可以使前面的數據通路流水。流水實現的數據通路設置了流水寄存器

所有用于在同一條指令的各個時鐘周期之間保存臨時數據的寄存器都要歸入流水寄存器這一類中段與段之間設置流水寄存器流水寄存器的名稱用其相鄰的兩個段的名稱拼合而成。例如:ID段與EX段之間的流水寄存器用ID/EX表示每個流水寄存器是由若干個寄存器構成的5.5.2基本的MIPS流水線流水實現的數據通路寄存器的命名形式為:x.y所包含的字段的命名形式為:x.y[s]

其中:x:流水寄存器名稱

y:具體寄存器名稱

s:字段名稱例如:

ID/EX.IR:流水寄存器ID/EX中的子寄存器IRIRID/EX.IR[op]:該寄存器的op字段(即操作碼字段)流水寄存器的作用

將各段的工作隔開,使得它們不會互相干擾。保存相應段的處理結果。屬于IF/ID部分的指令寄存器IR的各個字段,在用于提供寄存器名時就將其標記。IR[rs]=IR6..10IR[rt]=IR11..15IR[rd]=IR16..20流水線寄存器在兩個相鄰的流水段之間既傳遞數據也傳遞控制信息。后面流水段需要的數據,必須能從一個流水寄存器復制到下一個流水寄存器,直到不再需要為止。所以流水寄存器與非流水通路中使用的臨時寄存器不一樣。例如:EX/MEM.ALUo:保存EX段ALU的運算結果MEM/WB.LMD:保存MEM段從數據存儲器讀出的數據向后傳遞后面將要用到的數據或者控制信息所有有用的數據和控制信息每個時鐘周期會隨著指令在流水線中的流動往后流動一段。

增加了向后傳遞IR和從MEM/WB.IR回送到通用寄存器組的連接。將對PC的修改移到了IF段,以便PC能及時地加

4,為取下一條指令做好準備。流水實現的數據通路流水線的控制主要是如何控制四個多路選擇器。MUX2(根據指令類型是否是轉移操作來設定)if(ID/EX.IR[op]==“分支指令”){MUX2_output=ID/EX.NPC};elseMUX2_output=ID/EX.A;

//MUX2_output表示MUX2的輸出MUX3(根據指令類型是R-R的ALU操作還是其他指令來設定)if(ID/EX.IR[op]==“寄存器-寄存器型ALU指令”){MUX3_output=ID/EX.B};elseMUX3_output=ID/EX.Imm;

//MUX3_output表示MUX3的輸出MUX1if((ID/EX.IR[op]==“分支指令”)&EX/MEM.cond){MUX1_output=EX/MEM.ALUo};elseMUX1_output=PC+4;

//MUX1_output表示MUX1的輸出MUX4if(ID/EX.IR[op]==“load”){MUX4_output=MEM/WB.LMD};elseMUX4_output=MEM/WB.ALUo

//MUX4_output表示MUX4的輸出第5個多路器:從MEM/WB回傳至通用寄存器組的寫入地址應該是從MEM/WB.IR[rd]和MEM/WB.IR[rt]中選一個。寄存器-寄存器型ALU指令:選擇MEM/WB.IR[rd];寄存器-立即數型ALU指令和load指令:選擇MEM/WB.IR[rt]。圖中沒有畫出,但實際存在流水段流水線的每個流水段的操作所有指令類型ALU指令load/store指令分支指令IFIDEXIF/ID.IR←Mem[PC]IF/ID.NPC,PC←(if((EX/MEM.IR[op]==branch)&EX/MEM.cond){EX/MEM.ALUo}else{PC+4});

ID/EX.A←Regs[IF/ID.IR[rs]];ID/EX.B←Regs[IF/ID.IR[rt]];ID/EX.NPC←IF/ID.NPC;ID/EX.IR←IF/ID.IR;ID/EX.Imm←(IF/ID.IR16)16##IF/ID.IR16..31;

EX/MEM.IR←ID/EX.IR;EX/MEM.ALUo←ID/EX.AfunctID/EX.B或EX/MEM.ALUo←ID/EX.AopID/EX.Imm;

EX/MEM.IR←ID/EX.IR;EX/MEM.ALUo←ID/EX.A+ID/EX.Imm;EX/MEM.B←ID/EX.B;

EX/MEM.IR←ID/EX.IR;EX/MEM.ALUo←

(ID/EX.NPC+ID/EX.Imm<<2);EX/MEM.cond←

(ID/EX.A==0);

(動畫演示)(動畫演示)(動畫演示)(動畫演示)(動畫演示)流水段任何指令類型ALU指令load/store指令分支指令MEMWBMEM/WB.IR←EX/MEM.IR;MEM/WB.ALUo←EX/MEM.ALUo;

MEM/WB.IR←EX/MEM.IR;MEM/WB.LMD←Mem[EX/MEM.ALUo];或Mem[EX/MEM.ALUo]←EX/MEM.B;

Regs[MEM/WB.IR[rd]]←MEM/WB.ALUo;或Regs[MEM/WB.IR[rt]]←MEM/WB.ALUo;

Regs[MEM/WB.IR[rt]]←MEM/WB.LMD;

流水線的每個流水段的操作(動畫演示)(動畫演示)(動畫演示)(動畫演示)解決數據沖突的問題讓一條指令從ID段到EX段的操作稱為發射指令。對于MIPS定點流水線,所有的數據沖突均可以在ID段檢測到。如果存在數據沖突,就在相應的指令流出ID段之前(也就是發射前)將之暫停。完成該工作的硬件稱為流水線的互鎖機制。

同樣也可以在ID段確定需要什么樣的定向,并設置相應的控制。這樣可以降低流水線的硬件復雜度。(這樣硬件不需要停頓一條已經更新了機器狀態的指令)也可以在使用操作數的那個時鐘周期的開始檢測沖突和確定必需的定向。實現方法:檢測沖突是通過比較寄存器地址是否相等來實現的。舉例:load互鎖由于使用load的結果而引起的流水線互鎖稱為load互鎖。

ID/EX中的操作碼(ID/EX.IR[op])IF/ID中的操作碼(IF/ID.IR[op])比較的操作數字段loadRRALUID/EX.IR[rt]=IF/ID.IR[rs]loadRRALUID/EX.IR[rt]=IF/ID.IR[rt]loadload、storeALU立即數或分支ID/EX.IR[rt]=IF/ID.IR[rs]在ID段檢測是否存在RAW沖突

(這時load指令在EX段)

若檢測到RAW沖突,流水線互鎖機制必須在流水線中插入停頓,并使當前正處于IF段和ID段的指令不再前進。將ID/EX.IR中的操作碼改為全0

(全0表示空操作)IF/ID寄存器的內容回送到自己的入口冒險更加復雜流水線中也采用的是相同的方法要考慮的情況更多通過比較流水寄存器中的寄存器地址來確定例如:若:(ID/EX.IR.op==RRALU)&(EX/MEM.IR.op==RRALU)&(ID/EX.IR[rt]==EX/MEM.IR[rd])

則:EX/MEM.ALUo定向到ALU的下面一個輸入若:(ID/EX.IR[op]==RRALU)&(MEM/WB.IR[op]==load)&(ID/EX.IR[rt]==MEM/WB.IR[rt])

則:把MEM/WB.LMD定向到ALU的下面一個輸入舉例若:(ID/EX.IR.op==RRALU)&(EX/MEM.IR.op==RRALU)&(ID/EX.IR[rt]==EX/MEM.IR[rd])

則:EX/MEM.ALUo定向到ALU的下面一個輸入若:(ID/EX.IR[op]==RRALU)&(MEM/WB.IR[op]==load)&(ID/EX.IR[rt]==MEM/WB.IR[rt])

則:把MEM/WB.LMD定向到ALU的下面一個輸入控制沖突分支指令的條件測試和分支目標地址計算是在EX段完成,對PC的修改是在MEM段完成。它所帶來的分支延遲是3個時鐘周期。減少分支延遲:作如下改進(把上述工作提前到ID段進行)在ID段增設一個加法器:計算分支目標地址把條件測試“=0?”的邏輯電路移到ID段這些結果直接回送到IF段的MUX1改進后的流水線對分支指令的處理流水段分支指令操作IFIDEXIF/ID.IR←Mem[PC];IF/ID.NPC,PC←(if((IF/ID[op]==branch)&((Regs[IF/ID.IR[rs]]==0)){IF/ID.NPC+(IF/ID.IR16)16##(IF/ID.IR16..31<<2)}else{PC+4});

ID/EX.A←Regs[IF/ID.IR[rs]];ID/EX.B←Regs[IF/ID.IR[rt]];ID/EX.IR←IF/ID.IR;ID/EX.Imm←(IF/ID.IR16

)16##IF/ID.IR16..31;MEMWB改進后流水線的分支操作

5.6開發指令級并行技術5.6.1開發指令級并行的技術——硬件技術5.6.2開發指令級并行的技術——軟件技術指令級并行的概念現在復雜指令也使用流水線技術,但是復雜指令系統的流水線在實現時都是先把復雜的指令指令轉化為簡單的類RISC指令,然后才進行流水線的調度和執行。這樣才效率更高,實現更簡單。自1985年以來,所有的處理器都采用流水線方式使指令的執行可以重疊執行。由于可以將指令間的關系看做是并行的,因此將指令間的這種潛在重疊稱為指令級并行(ILP,Instruction-levelparallelism)指令級并行的概念開發指令級并行的方法大致分為兩類:一種是基于軟件技術,在編譯階段靜態的發現并行;一種方法是依賴硬件,動態的發現和開發指令級的并行。目的都是提高指令序列的并行度。使用基于硬件的動態方法的處理器包括Intel的Pentium處理器,在市場上占主導地位;而采用靜態方法的處理器包括Intel的Itanium,使用范圍局限于科學領域或者特定應用環境中。簡單流水線負責取指令并且發射指令,除非在流水線中的指令與剛取到的指令存在數據相關并且不能通過旁路技術或者直通技術避免,此時檢測沖突的硬件將停止有關指令以及后面指令進入流水線,相關被取消之前不再取出和發射新的指令。為了能減少性能損失,編譯器將試圖調度指令以避免沖突,也就是編譯器調度法,又叫靜態調度法。也可以由硬件動態調整執行指令順序以減少停頓的影響,也就是動態調度法。靜態調度依靠編譯器對代碼進行靜態調度,以減少相關和沖突。它不是在程序執行的過程中、而是在編譯期間進行代碼調度和優化。通過把相關的指令拉開距離來減少可能產生的停頓。動態調度在程序的執行過程中,依靠專門硬件對代碼進行調度,減少數據相關導致的停頓。靜態調度和動態調度的特點能夠處理一些在編譯時情況不明的相關(比如涉及到存儲器訪問的相關),并簡化了編譯器;能夠使本來是面向某一流水線優化編譯的代碼在其它的流水線(動態調度)上也能高效地執行。以硬件復雜性的顯著增加為代價

優點:到目前為止我們所使用流水線的最大的局限性:指令是按序流出和按序執行的考慮下面一段代碼:DIV.D F4,F0,F2ADD.D F10,F4,F6SUB.D F12,F6,F14ADD.D指令與DIV.D指令關于F4相關,導致流水線停頓。SUB.D指令與流水線中的任何指令都沒有關系,但也因此受阻。1動態調度的基本思想5.6.1開發指令級并行的技術——硬件技術指令的動態調度在前面的基本流水線中:ID檢測結構沖突檢測數據沖突

一旦一條指令受阻,其后的指令都將停頓。

指令的動態調度為了使上述指令序列中的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論