文章目錄
- 指令流水線的基本概念
-
- 指令流水的定義
- 流水線的表示方法
- 流水線的性能名額
-
- 1.吞吐率
- 2.加速比
- 3.效率
- 指令流水線的影響因素喝分類
-
- 指令周期的設定
- 影響流水線的因素
- 流水線的分類
- 流水線的多發技術
- 五段式指令流水線
-
- 運算類指令的執行過程
- LOAD指令的執行過程
- STORE指令的執行過程
- 條件轉移指令的執行過程
- 無條件轉移指令的執行過程
指令流水線的基本概念
指令流水的定義
一條指令的執行過程可以分成多個階段(或過程)
根據計算機的不同,具體的分法也不同。下面是一般的指令執行的幾個階段:

取指:根據PC内容通路主存儲器(這裡也可以是cache),取出一條指令送到IR中。
分析:對指令操作碼進行譯碼,按照給定的尋址方式和位址字段中的内容形成操作數的有效位址EA,并從有效位址EA中取出操作數。PS:這裡的操作數可能在寄存器 R i R_i Ri中,也可能在cache中
執行:根據操作碼字段,完成指令規定的功能,即把運算結果寫到通用寄存器或主存中。
設取指、分析、執行3個階段的時間都相等,用t表示,按以下幾種執行方式分析n條指令的執行時間:
1.順序執行方式 總耗時= n × 3 t = 3 n t n×3t=3nt n×3t=3nt
一共n條指令,每條需要3t。
傳統馮·諾依曼機采用順序執行方式,又稱串行執行方式。
優點:控制簡單,硬體代價小。
缺點:執行指令的速度較慢,在任何時刻,處理機中隻有一條指令在執行,各功能部件的使用率很低。
2.一次重疊執行方式 總耗時= 3 t + ( n − 1 ) × 2 t = ( 1 + 2 n ) t 3t+(n-1)×2t=(1+2n)t 3t+(n−1)×2t=(1+2n)t
除了第一個指令3t執行完,其餘隻需要2t就行,因為每個指令的第一都在前一條指令最後執行時候一起開始了。
優點:程式的執行時間縮短了1/3,各功能部件的使用率明顯提高。
缺點:需要付出硬體上較大開銷的代價,控制過程也比順序執行複雜了。
3.二次重疊執行方式 總耗時= 3 t + ( n − 1 ) × t = ( 2 + n ) t 3t+(n-1)×t=(2+n)t 3t+(n−1)×t=(2+n)t
這裡跟上面那個類似。
與順序執行方式相比,指令的執行時間縮短近2/3。這是一種理想的指令執行方式,在正常情況下,處理機中同時有3條指令在執行。
注:也可以把每條指令的執行過程分成4個或5個階段,分成5個階段是比較常見的做法。
流水線的表示方法
1.指令執行過程圖
主要用于分析指令執行過程以及影響流水線的因素。
2.時空圖
空間:不同的階段所對應的不同的硬體資源。
主要哦用于分析流水線的性能。
流水線的性能名額
1.吞吐率
1.吞吐率 \space\space 吞吐率是指在機關時間内流水線所完成的任務數量,或是輸出結果的數量。
設任務數為 n n n;處理完成 n n n個任務所用的時間為 T k T_k Tk
則計算流水線吞吐率( T P TP TP)的最基本的公式為 T P = n T k TP=\frac{n}{T_k} TP=Tkn
理想情況下,流水線的時空圖如下:
裝入時間:第一條指令開始到結束。
排空時間:最後一條指令開始到結束。
設一條指令的執行分為 k k k個階段,每個階段耗時 Δ t \Delta t Δt,一般取 Δ t = \Delta t= Δt=一個時鐘周期
T k = ( k + n − 1 ) Δ t T_k=(k+n-1)\Delta t Tk=(k+n−1)Δt
流水線的實際吞吐率為
T P = n ( k + n − 1 ) Δ t TP=\frac{n}{(k+n-1)\Delta t} TP=(k+n−1)Δtn
當連續輸入的任務 n → ∞ n\rightarrow\infty n→∞時,得最大吞吐率為 T P m a x = 1 / Δ t TP_{max}=1/\Delta t TPmax=1/Δt
2.加速比
完成同樣一批任務,不使用流水線所用的時間與使用流水線所用的時間之比。
設 T 0 T_0 T0表示不使用流水線時的執行時間,即順序執行所用的時間: T k T_k Tk表示使用流水線時的執行時間
則計算流水線加速比( S S S)的基本公式為 S = T 0 T k S=\frac{T_0}{T_k} S=TkT0
單獨完成一個任務消耗為 k Δ t k\Delta t kΔt,則順序完成n個任務消耗 T 0 = n k Δ t T_0=nk\Delta t T0=nkΔt
T k = ( k + n − 1 ) Δ t T_k=(k+n-1)\Delta t Tk=(k+n−1)Δt
實際加速比
S = k n Δ t ( k + n − 1 ) = k n k + n − 1 S=\frac{kn\Delta t}{(k+n-1)}=\frac{kn}{k+n-1} S=(k+n−1)knΔt=k+n−1kn
當連續輸入的任務 n → ∞ n\rightarrow\infty n→∞時,得最大加速比為 S m a x = k S_{max}=k Smax=k
3.效率
流水線的裝置使用率稱為流水線的效率。
在時空圖上,流水線的效率定義為完成n個任務占用的時空區有效面積與n個任務所用的時間與k個流水段所圍成的時空區總面積之比。
則流水線效率( E E E)的一般公式為 E E E= n 個任務占用 k 時空區有效面積 n 個任務所用的時間與 k 個流水段所圍成的時空區總面積 = T 0 k T k \frac{n個任務占用k時空區有效面積}{n個任務所用的時間與k個流水段所圍成的時空區總面積}=\frac{T_0}{kT_k} n個任務所用的時間與k個流水段所圍成的時空區總面積n個任務占用k時空區有效面積=kTkT0
當連續輸入的任務 n → ∞ n\rightarrow\infty n→∞時,最高效率為 E m a x = 1 E_{max}=1 Emax=1
這裡的情況都是在理想情況下,所謂理想情況就是各階段花費時間相同,每個階段結束後能立即進入下一個階段。
指令流水線的影響因素喝分類
指令周期的設定
流水線每一個功能段部件後面都要有一個緩沖寄存器,或稱為鎖存器,其作用是儲存本流水段的執行結果,提供給下一流水段使用。
為友善流水線的設計,将每個階段的耗時取成一樣,以最長耗時為準。即此處應将機器周期設定為100ns.
1.取指階段:根據PC所指向的位置,去Instruction Cache裡面找出目前要執行的指令,把取出的指令放到功能段的鎖存器裡面。
2.指令譯碼:除了指令譯碼,還要取數,從通用寄存器取放到鎖存器A和B(在RISC下都是來自于通用寄存器的,如果要用貯存的,先将主存的放入到通用寄存器)。
3.執行階段:用ALU運算A和B。Imm:立即數(可能會使用立即尋址)。運算結果可能需要寫回主存也可能直接寫回寄存器。
4.通路主存:通路指令要操作的資料Data cache(Cache分為指令cache和資料cache,可以使第一個階段和第四個階段硬體布線更加獨立的工作)
5.寫回階段:将ALU運算後的資料寫回到ID(隻是指明是圖ID位置,并不是實際的ID中的)時候的通用寄存器中。
影響流水線的因素
1.結構相關(資源沖突)互斥
由于多條指令在同一時刻争用同一資源而形成的沖突稱為結構相關。
這裡Load的Mem和Instr3的Mem發生了沖突。
解決辦法;
1.後一相關指令暫停一周期(等前一個用完了再讓後一個使用)
2.資源重複配置:
資料存儲器+指令存儲器
這裡的Im指令存儲器,DM是資料寄存器。他們可以是獨立開來的,是以可以一起使用。
2.資料相關(資料沖突)同步
資料相關指在一個程式中,存在必須等前一條指令執行完才能執行後一條指令的情況,則這兩條指今即為資料相關。
第一條執行了加法,将r2,r3相加給r1。第二條和第三條第四條第五條都要用到r1的内容。
第二條運作時候,必須保證第一條的資料已經寫回給r1了。
解決辦法:
1.把遇到資料相關的指令及其後續指令都暫停一至幾個時鐘周期,直到資料相關問題消失後再繼續執行。可分為硬體阻塞(stall)和
軟體插入“NOP”兩種方法。
2.資料旁路技術。
可以在中途進行轉發。
3.編譯優化:通過編譯器調整指令順序來解決資料相關。
可以将後面的指令先放到前面來執行,然後再執行沖突的。
3.控制相關(控制沖突)
當流水線遇到轉移指令和其他改變PC值的指令而造成斷流時,會引起控制相關。
解決辦法:
1.轉移指令分支預測。簡單預測(永遠猜ture或false) 、動态預測(根據曆史情況動态調整)
2.預取轉移成功和不成功兩個控制流方向上的目标指令
3.加快和提前形成條件碼(類似一位全加器)
4.提高轉移方向的猜準率
流水線的分類
1.部件功能級、處理機級和處理機間級流水線
根據流水線使用的級别的不同,流水線可分為部件功能級流水線、處理機級流水線和處理機間流水線。
部件功能級流水就是将複雜的算術邏輯運算組成流水線工作方式。例如,可将浮點加法操作分成求階差、對階、尾數相加以及結果規格化等4個子過程。下面是四個子過程的示例圖:
處理機級流水是把一條指令解釋過程分成多個子過程,如前面提到的取指、譯碼、執行、訪存及寫回5個子過程。
處理機間流水是一種宏流水,其中每一個處理機完成某一專門任務,各個處理機所得到的結果需存放在與下一個處理機所共享的存儲器中。
2.單功能流水線和多功能流水線
按流水線可以完成的功能,流水線可分為單功能流水線和多功能流水線。
單功能流水線指隻能實作一種固定的專門功能的流水線;例如浮點數加法。
多功能流水線指通過各段間的不同連接配接方式可以同時或不同時地實作多種功能的流水線。
3.動态流水線和靜态流水線
按同一時間内各段之間的連接配接方式,流水線可分為靜态流水線和動态流水線。
靜态流水線指在同一時間内,流水線的各段隻能按同一種功能的連接配接方式工作。
動态流水線指在同一時間内,當某些段正在實作某種運算時,另一些段卻正在進行另一種運算。這樣對提高流水線的效率很有好處,但會使流水線控制變得很複雜。
4.線性流水線和非線性流水線
按流水線的各個功能段之間是否有回報信号,流水線可分為線性流水線與非線性流水線。
線性流水線中,從輸入到輸出,每個功能段隻允許經過一次,不存在回報回路。
非線性流水線存在回報回路(例如資料沖突中ALU可以回報給自己),從輸入到輸出過程中,某些功能段将數次通過流水線(例如硬體沒有乘法,那麼需要數次執行加法才行,也就是數次EX),這種流水線适合進行線性遞歸的運算。
流水線的多發技術
1.超标量技術
類似于空分複用技術。
每個時鐘周期内可并發多條獨立指令
要配置多個功能部件 比如IR ALU。
不能調整指令的執行順序 這裡要看CPU是否亂序發射
通過編譯優化技術,把可并行執行的指令搭配起來
2.超流水技術
有點類似于時分複用技術,将一個時間段分為多段。
在一個時鐘周期内再分段( 3段)
在一個時鐘周期内(更應該說成一個機器周期,最理想情況下是一個時鐘周期)一個功能部件使用多次( 3次)
不能調整指令的執行順序
靠編譯程式解決優化問題
3.超長指令字
由編譯程式挖掘出指令間潛在的并行性,
将多條能并行操作的指令組合成一條
具有多個操作碼字段的超長指令字(可達幾百位)
采用多個處理部件
五段式指令流水線
運算類指令的執行過程
注:
R s R_s Rs指源操作數(source)
R d R_d Rd指目的操作數(destination)
運算類指令
IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:對指令操作碼進行譯碼,取出操作數至ID段鎖存器
EX:根據上一個階段得到的操作數的資訊進行運算,将結果存入EX段鎖存器
M:空段對于RISC的都是來自于寄存器或者立即數。
WB:将運算結果寫回指定寄存器
LOAD指令的執行過程
LOAD指令
IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:将基址寄存器的值放到鎖存器A,将偏移量的值放到Imm
EX:運算,得到有效位址
M:從資料Cache中取數并放入鎖存器(一般都會在cache中就命中,如果沒有命中才需要去訪存)
WB:将取出的數寫回寄存器
STORE指令的執行過程
STORE指令
IF:根據PC從指令Cache取指令至IlF段的鎖存器
ID:将基址寄存器的值放到鎖存器A,将偏移量的值放到Imm。将要存的數放到B
EX:運算,得到有效位址。并将鎖存器B的内容放到鎖存器Store。
M:寫入資料Cache
WB:空段
條件轉移指令的執行過程
轉移類指令嘗采用相對尋址,相對于PC偏移多少
這裡假設指令字長是4B,偏移量是100,那麼就需要(PC)+4+(100×4) → \rightarrow →PC。這裡的(PC)+指令字長 就是PC+1。(通常在IF段結束之後PC就會自動+1)
條件轉移指令
IF:根據PC從指令Cache取指令至IlF段的鎖存器
ID:進行比較的兩個數放入鎖存器A、B;偏移量放入lmm
EX:運算,比較兩個數
M:将目标Pc值寫回PC,PC比較特殊,是以不用WB階段。
WB:空段
有些地方寫回PC有一個單獨的功能段比M段短,稱為“WrPC段"。
無條件轉移指令的執行過程
無條件轉移指令
IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:偏移量放入Imm
EX:将目标PC值寫回PC
M:空段
wB:空段
這裡的WrPC可以放在EX執行。WrPC段越早完成,就越能避免控制沖突。有些地方會在WB段時間内才修改PC的值。
注:隻有上一條指令進入ID段後,後一條指令才能進入到IF段,因為不進入的話IF的鎖存器還是前一條的内容。
本章節内容是我在進行計算機組成原理時候所做的筆記内容。如果有問題可以私聊一起探讨。