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