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