計算機系統 流水線技術
Mar 31, 2022 ✧ 字數統計:3.3k(字) ♨︎ 閱讀時長:11(分鍾)
本文介紹計算機系統中采用的流水線技術,包括流水線相關的基礎知識、工作原理、流水線技術對性能的改進、吞吐率、加速比和效率等相關的計算以及存在的問題等內容。

流水線技術簡單介紹
流水線技術通過並行硬件(利用時間並行性,區別於空間並行性)來提高計算機系統的性能。
流水線技術把一項任務分解成若干項順序執行的子任務,不同的子任務由不同的操作部件來負責執行,而這些部件可以同時並行工作,這項技術的關鍵在於重疊執行,通過這種方式可以在不增加硬件或者只增加少量硬件的前提下數倍的提升處理機運算速度。

流水線的分級
根據使用情況的不同,流水線可以分成三個級別:
(1)操作部件級流水線(運算符操作流水線) 將復雜的算術運算和邏輯運算組成流水線的工作方式。
(2)指令級流水線 把一條指令的執行過程分解成多個階段,比如可以把某個指令分解為:取指令、分析指令、執行指令三個階段。
(3)處理機間級流水線(宏流水線) 由 N(N>=2)個處理機通過存儲器串行連接,每個處理機完成某項專門的任務,各個處理機所得到的結果需要存放到跟下一個處理機所共享的存儲器里面。
流水線的分類
根據流水線的實際應用,可以從不同角度進行分類。
靜態流水線:在同一時間內只能按照一種運算的連接方式進行工作(一定是單功能)。
動態流水線:在同一時間內允許按照多種不同運算的連接方式工作(一定是多功能)。

線性流水線:從輸入到輸出,每個功能段只允許經過一次,不存在反饋回路。
非線性流水線:從輸入到輸出,某些功能段將數次通過流水線,存在反饋回路,常用於遞歸調用。
單功能流水線:只能實現某種固定的功能,比如加法運算。
多功能流水線:各段可以進行不同的連接,通過不同的連接方式來實現不同的功能(資源利用率較高也更靈活,但控制更復雜)。
流水線的特點和工作原理
-
流水線中處理的必須是連續的任務。
-
在流水線每個操作部件的后面,都要有一個緩沖寄存器(鎖存器),稱為流水寄存器,這個緩沖寄存器用於保存本階段的執行結果,以保證各個部件之間的速度是匹配的,以及各個部件獨立、並行運行。換句話說,流水寄存器用於在相鄰的兩段“操作”之間傳送數據,以保證提供后面要用到的數據的供應,並把各段的處理工作相互隔離。
-
因為流水線的主要工作方式是把大的操作任務分解為多個獨立的、小的操作部件,依靠多個操作部件並行工作來縮短程序執行時間的。因為流水線中各段的執行時間應該盡量相等,執行時間最長的一段將成為整個流水線的瓶頸。
-
流水技術適合於大量重復的時序過程,只有在輸入端連續不斷提供任務的情況下,才能充分發揮流水線的效率。
-
流水線中存在排入時間和排空時間。

上面這張圖是我畫的抽象之后的典型 5 級 CPU 執行流水線,但這張圖其實沒有辦法表述清楚“多道工序同時執行”這個流水線技術最重要的特征,所以下面我通過時空圖來描述流水線的工作。流水線的處理方向與之相對應的是多個任務按照順序挨個執行。

我們假設某個處理機的執行指令分成三個階段,分別是取指、分析和執行,假設每個階段執行需要時間都是 t,那么上面左側的圖片描述的指令順序執行的時空圖,上面右側的圖片描述的是指令流水線執行的時空圖。
我們可以通過上面的圖示看出,順序執行 3 條指令,需要的時間是 9t,流水線方式執行需要的時間是 5t,流水線采用的執行方式其實就是取指、分析和執行三個階段部件在同時並發的工作,在第 1 條指令的執行階段,同時分析第 2 條指令,取第 3 條指令。
如果不好理解的話,可以把這個場景類比為一個三個人 A\B\C 在對蘋果進行操作的過程,其中 A 負責把蘋果放入到水槽中,B 負責清洗水槽中的蘋果,C 負責把水槽中的蘋果撈起來裝到袋子中,每次只能操作一個蘋果。嚴格的順序執行,類似於 A 在做“把第一個蘋果放入到水槽中”這個動作的時候,B 和 C 處於等待的狀態,當這個動作完成后,B 執行“清洗水槽中的這個蘋果”這個操作,此時 A 處於無事可做的狀態,C 處於等待的狀態,當清洗完成后,C 開始執行“把水槽中的蘋果撈起來裝到袋子中”這個動作,此時 A 和 B 處於空閑的狀態。

假設有 n 個蘋果需要處理,每個蘋果處理的三個階段的單位時間都是 t,那么:
順序執行的工作方式需要的時間為:n x 3 x t
流水線執行工作方式需要的時間可以這樣計算:3 x t + (n-1) x t
這里在進行計算的時候,其實我們涉及到了多個參與量,它們包括指令的數量、指令的執行階段、每個指令執行階段需要的單位時間,在上面的案例中,指令的數量為 3 條,指令的執行階段為 3 個,每個指令執行階段需要的單位時間我們假設都是相等的。接下來,我們來看一個稍微復雜點的情況。
假設:
指令的數量(n):4條
指令的執行階段(k):4個
每個指令執行階段需要的單位時間:為t

我們來看個更復雜的情況
假設:
指令的數量(n):3條
指令的執行階段(k):4個
每個指令執行階段需要的單位時間:A(1t) B(3t) C(2t) D(1t)

由此,我們可以總結出一個指令流水線完成 n 個任務所需要總時間的計算公式:
另外,從上圖我們也能看出,流水線的性能瓶頸取決於多個操作中每個執行階段所需要的最長單位時間(取 t1,t2,t3,t4,···tk 的最大值),在設計流水線的時候應該盡可能的讓每個操作的執行單位時間都相等。
流水線的性能指標
我們可以通過吞吐率、加速比和流水線的效率等指標衡量某段流水線性能的優劣。
吞吐率( Though Put rate, TP )
吞吐率指的是在單位時間內流水線所完成的任務數量或輸出的結果數量。
吞吐率的計算公式為:
其中,n 表示任務(指令)的數量。
假設,現在有一條線性流水線共分成 k 段,各段的執行時間分別是 t1,t2,···tk,那么該流水線完成 n 個連續任務需要的總時間為:
通過推斷,我們可以得出該流水線的實際吞吐率為:
此時,該流水線的最大吞吐率為:
從上面的公式可以看出,當流水線中各段執行時間不完全相等的時候,吞吐率主要由流水線中執行最長的那個功能段來決定,這個功能段也就成了整個流水線的瓶頸,它的執行時間被稱為瓶頸時間。解決可以問題,可以考慮把瓶頸段再進行細分,讓瓶頸的時間變小。
說明 流水線的實際吞吐率要小於最大吞吐率。只有當 n >= k 的時候,它們才約等。
假設現在有一條6段線性流水線,它們的單位執行時間分別是1ns,2ns,3ns,4ns,3ns,2ns,那么:
該流水線完成10個連續任務需要的總時間 = (1 + 2 + 3 + 4 + 3 + 2) + (10 -1)4 = 15 + 36 = 51ns
該流水線的實際吞吐率 = 10 / 51 = 0.196
該流水線的最大吞吐率 = 1 / 4 = 0.25
比較理想的情況是,一條 k 段連續流水線中的每段執行時間均相等(設為 t),那么:
該流水線完成 n 個連續任務需要的總時間可以表示為:
因此,實際的吞吐率為:
此時,最大的吞吐率為:
假設上面這段流水線中每一段執行時間都是等量的,比如2ns,那么我們再計算一遍:
該流水線完成10個連續任務需要的總時間 = (2 + 2 + 2 + 2 + 2 + 2) + (10 -1)2 = 12 + 18 = 30ns
該流水線的實際吞吐率 = 10 / 30 = 0.333
該流水線的最大吞吐率 = 1 / 2 = 0.5
加速比( Speedup Ratio, S )
加速比是衡量流水線性能的另一個關鍵指標,它其實指的是不使用流水線(順序)執行和使用流水線來執行同一段任務所用總時間的比。
計算流水線加速比的基本公式為:
當流水線的各個流水段的執行時間不相等的時候,一條 k 段線性流水線完成 n 個連續任務的實際加速比可以表示為:
假設,某流水線分為 5 段,若每一段所需要的時間分別為 1ns、2ns、3ns、4ns、2ns,那么該流水線的加速比為:
假設現在有一條4段線性流水線,它們的單位執行時間分別是1ns,2ns,3ns,1ns那么:
順序執行完成10個連續任務需要的總時間 = (1 + 2 + 3 + 1) * 10 = 70
該流水線完成10個連續任務需要的總時間 = (1 + 2 + 3 + 1) + 3 * (10 -1) = 34
該流水線的實際加速比 = 70 / 34
備注:3的值來自於取(1ns,2ns,3ns,1ns)中的最大值
同理,理想的情況是,一條 k 段連續流水線中的每段執行時間均相等(設為 t),那么:
該流水線完成 n 個連續任務的實際加速比為:

這種情況下的最大的加速比為:
假設現在有一條4段線性流水線,它們的單位執行時間都是1ns那么:\
順序執行完成10個連續任務需要的總時間 = (1 + 1 + 1 + 1) * 10 = 40\
該流水線完成10個連續任務需要的總時間 = (1 + 1 + 1 + 1) + 1 * (10 -1) = 13\
該流水線的實際加速比 = 40 / 13
效率(E)
流水線的效率指的是流水線的設備利用率,流水線的效率包含時間和空間兩部分的因素。
流水線的效率被定義為 n 項任務所占用的時空區與 k 個流水段總的時空區之比。
實際上,n 項任務所占用的時空區其實就是順序執行 n 項任務所使用的總時間。
計算流水線效率的一般公式為

如果流水線各段的執行時間不相等,那么連續執行 n 項任務時的流水線效率為:

如果流水線中的每段執行時間均相等(設為 t),而且輸入的 n 項任務是連續的,那么一條 k 段流水線的效率為:

此時,流水線的最高效率為:
由上面的數學公式可以看出,當流水線的效率達到最大值 1 的時候,這時流水線的各段均處於忙碌的狀態。
結合計算流水線加速比的公式,流水線的效率可以表示為:
公式轉換一下,則流水線的吞吐率可以理解為流水線的效率和單位時間的比值。
從上面的公式,我們可以看出當時鍾周期t不變的時候,流水線的效率與吞吐率成正比。
吞吐率、加速比和效率這些指標都可以用來衡量一條流水線的性能,為了得到比較高的性能,流水線應該盡可能滿負荷工作。
綜合來看,增加流水線的段數(k的值),流水線的吞吐率和加速比都能提高,但因為每個操作段的輸出端都必須要設置一個鎖存器(緩沖寄存器),因此當段數增多的時候,鎖存器(緩沖寄存器)的總延遲時間也會隨之增加,且增加鎖存器(緩沖寄存器)的數量,不可避免的要增加流水線的價格成本。因此,在設計流水線的時候需要綜合考慮各方便的因素,以選擇流水線的最佳段數。
系統中也可能存在多條流水線,假如采用度量為i的超標量流水線處理機來連續處理n條指令,那么因為同時運行了i條流水線,因此平均每條流水線只需要執行n/i條指令。
此外,在實際的情況中,還需要注意流水線中的各段可能會相互影響,阻塞流水線以影響性能。
