【ARM】ARM流水线技术
00. 目錄
文章目錄
- 00. 目錄
- 01. 流水線概述
- 02. 流水線分類
- 03. 影響流水線性能的因素
- 04. 附錄
01. 流水線概述
處理器按照一系列步驟來執行每一條指令,典型的步驟如下:
(1)從存儲器讀取指令(Fetch)。
(2)譯碼以鑒別它屬于哪一條指令(Decode)。
(3)從指令中提取指令的操作數(這些操作數往往存在于寄存器 Reg 中)。
(4)將操作數進行組合以得到結果或存儲器地址(ALU)。
(5)如果需要,則訪問存儲器以存儲數據(Mem)。
(6)將結果寫回到寄存器堆(Res)。
并不是所有的指令都需要上述每一個步驟,但是,多數指令需要其中的多個步驟。這些步驟往往使用不同的硬件功能,如 ALU 可能只在
第 4 步中用到。因此,如果一條指令不是在前一條指令結束之前就開始,那么在每一步驟內處理器只有少部分的硬件在使用。
有一種方法可以明顯改善硬件資源的使用率和處理器的吞吐量,這就是在當前一條指令結束之前就開始執行下一條指令,即通常所說的流
水線(Pipeline)技術。流水線是 RISC處理器執行指令時采用的機制。使用流水線,可在取下一條指令的同時譯碼和執行其他指令,從而
加快執行的速度。可以把流水線看作是汽車生產線,每個階段只完成專門的處理器任務。
采用上述操作順序,處理器可以這樣來組織:當一條指令剛剛執行完步驟(1)并轉向步驟(2)時,下一條指令就開始執行步驟(1)。
從原理上說,這樣的流水線應該比沒有重疊的指令執行快 6 倍,但由于硬件結構本身的一些限制,實際情況會比理想狀態差一些。
02. 流水線分類
2.1 3級流水線
到 ARM7 為止的 ARM 處理器使用簡單的 3 級流水線,它包括下列流水線級。
(1)取指令(Fetch):從寄存器裝載一條指令。
(2)譯碼(Decode):識別被執行的指令,并為下一個周期準備數據通路的控制信號。在這一級,指令占有譯碼邏輯,不占用數據通
路。
(3)執行(Excute):處理指令并將結果寫回寄存器。
下圖 所示為 3 級流水線指令的執行過程。
當處理器執行簡單的數據處理指令時,流水線使得平均每個時鐘周期能完成1條指令。但1條指令需要3個時鐘周期來完成,因此,有3
個時鐘周期的延時(Latency),但吞吐率(Throughput)是每個周期1條指令。
2.2 5 級流水線
所有的處理器都要滿足對高性能的要求,直到 ARM7 為止,在 ARM 核中使用的 3 級流水線的性價比是很高的。但是,為了得到更高的性
能,需要重新考慮處理器的組織結構。有兩種方法來提高性能。
(1)提高時鐘頻率。時鐘頻率的提高,必然引起指令執行周期的縮短,所以要求簡化流水線每一級的邏輯,流水線的級數就要增加。
(2)減少每條指令的平均指令周期數 CPI。這就要求重新考慮 3 級流水線 ARM 中多于 1 個流水線周期的實現方法,以便使其占有較少的
周期,或者減少因指令相關造成的流水線停頓,也可以將兩者結合起來。
3 級流水線 ARM 核在每一個時鐘周期都訪問存儲器,或者取指令,或者傳輸數據。只是抓緊存儲器不用的幾個周期來改善系統性能,效
果并不明顯。為了改善 CPI,存儲器系統必須在每個時鐘周期中給出多于一個的數據。方法是在每個時鐘周期從單個存儲器中給出多于 32
位數據,或者為指令或數據分別設置存儲器。
基于以上原因,較高性能的 ARM 核使用了 5 級流水線,而且具有分開的指令和數據存儲器。把指令的執行分割為 5 部分而不是 3 部分,
進而可以使用更高的時鐘頻率,分開的指令和數據存儲器使核的 CPI 明顯減少。
在 ARM9TDMI 中使用了典型的 5 級流水線,5 級流水線包括下面的流水線級。
(1)取指令(Fetch):從存儲器中取出指令,并將其放入指令流水線。
(2)譯碼(Decode):指令被譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆有 3 個操作數讀端口,因此,大多數 ARM 指令能在
1 個周期內讀取其操作數。
(3)執行(Execute):將其中 1 個操作數移位,并在 ALU 中產生結果。如果指令是Load 或 Store 指令,則在 ALU 中計算存儲器的地
址。
(4)緩沖/數據(Buffer/Data):如果需要則訪問數據存儲器,否則 ALU 只是簡單地緩沖 1 個時鐘周期。
(5)回寫(Write-Back):將指令的結果回寫到寄存器堆,包括任何從寄存器讀出的數據。
下圖所示為 5 級流水線指令的執行過程。
在程序執行過程中,PC 值是基于 3 級流水線操作特性的。5 級流水線中提前 1 級來讀取指令操作數,得到的值是不同的(PC + 4 而不是
PC + 8)。這里產生代碼不兼容是不容許的。但 5 級流水線 ARM 完全仿真 3 級流水線的行為。在取指級增加的 PC 值被直接送到譯碼級
的寄存器,穿過兩級之間的流水線寄存器。下一條指令的 PC + 4 等于當前指令的PC + 8,因此,未使用額外的硬件便得到了正確的R15。
2.3 13級流水線
在 Cortex-A8 中有一條 13 級的流水線,但是由于 ARM 公司沒有對其中的技術公開任何相關的細節,這里只能簡單介紹一下,從經典
ARM 系列到現在的 Cortex 系列,ARM 處理器的結構在向復雜的階段發展,但沒改變的是 CPU 的取指指令和地址關系,不管是幾級流水
線,都可以按照最初的 3 級流水線的操作特性來判斷其當前的 PC 位置。這樣做主要還是為了軟件兼容性上的考慮,由此可以判斷的是,
后面 ARM 所推出的處理核心都想滿足這一特點,感興趣的讀者可以自行查閱相關資料。
03. 影響流水線性能的因素
3.1 互鎖
在典型的程序處理過程中,經常會遇到這樣的情形,即一條指令的結果被用作下一條指令的操作數。例如,有如下指令序列:
LDR R0,[R0,#0] ADD R0,R0,R1 ;在 5 級流水線上產生互鎖從例子可以看出,流水線的操作產生中斷,因為第 1 條指令的結果在第 2 條指令取數時還沒有產生。第 2 條指令必須停止,直到結果產
生為止。
3.2 跳轉指令
跳轉指令也會破壞流水線的行為,因為后續指令的取指步驟受到跳轉目標計算的影響,因而必須推遲。但是,當跳轉指令被譯碼時,在它
被確認是跳轉指令之前,后續的取指操作已經發生。這樣一來,已經被預取進入流水線的指令不得不被丟棄。如果跳轉目標的計算是在
ALU 階段完成的,那么在得到跳轉目標之前已經有兩條指令按原有指令流讀取。顯然,只有當所有指令都依照相似的步驟執行時,流水線
的效率達到最高。如果處理器的指令非常復雜,每一條指令的行為都與下一條指令不同,那么就很難用流水線實現。
04. 附錄
4.1 ARM處理器開發詳解筆記
總結
以上是生活随笔為你收集整理的【ARM】ARM流水线技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ARM】Cortex存储系统
- 下一篇: 【ARM】ARM处理器寻址方式