引 言
流水線技術通 過多個功能部件并行工作來縮短程序執(zhí)行時間,提高處理器核的效率和吞吐率,從而成為微處理器設計中最為重要的技術之一。ARM7處理器核使用了典型三級流 水線的馮·諾伊曼結構,ARM9系列則采用了基于五級流水線的哈佛結構。通過增加流水線級數(shù)簡化了流水線各級的邏輯,進一步提高了處理器的性能。
ARM7的三級流水線在執(zhí)行單元完成了大量的工作,包括與操作數(shù)相關的寄存器和存儲器讀寫操作、ALU操作以及相關器件之間的數(shù)據傳輸。執(zhí)行單元的工作往 往占用多個時鐘周期,從而成為系統(tǒng)性能的瓶頸。ARM9采用了更為高效的五級流水線設計,增加了2個功能部件分別訪問存儲器并寫回結果,且將讀寄存器的操 作轉移到譯碼部件上,使流水線各部件在功能上更平衡;同時其哈佛架構避免了數(shù)據訪問和取指的總線沖突。
然而不論是三級流水線還是五級流水線,當出現(xiàn)多周期指令、跳轉分支指令和中斷發(fā)生的時候,流水線都會發(fā)生阻塞,而且相鄰指令之間也可能因為寄存器沖突導致 流水線阻塞,降低流水線的效率。本文在對流水線原理及運行情況詳細分析的基礎上,研究通過調整指令執(zhí)行序列來提高流水線運行性能的方法。
1 ARM7/ARM9流水線技術
1.1 ARM7流水線技術
ARM7系列處理器中每條指令分取指、譯碼、執(zhí)行三個階段,分別在不同的功能部件上依次獨立完成。取指部件完成從存儲器裝載一條指令,通過譯碼部件產生下 一周期數(shù)據路徑需要的控制信號,完成寄存器的解碼,再送到執(zhí)行單元完成寄存器的讀取、ALU運算及運算結果的寫回,需要訪問存儲器的指令完成存儲器的訪 問。流水線上雖然一條指令仍需3個時鐘周期來完成,但通過多個部件并行,使得處理器的吞吐率約為每個周期一條指令,提高了流式指令的處理速度,從而可達到 O.9 MIPS/MHz的指令執(zhí)行速度。
在三級流水線下,通過R15訪問PC(程序計數(shù)器)時會出現(xiàn)取指位置和執(zhí)行位置不同的現(xiàn)象。這須結合流水線的執(zhí)行情況考慮,取指部件根據PC取指,取指完 成后PC+4送到PC,并把取到的指令傳遞給譯碼部件,然后取指部件根據新的PC取指。因為每條指令4字節(jié),故PC值等于當前程序執(zhí)行位置+8。
1.2 ARM9流水線技術
ARM9系列處理器的流水線分為取指、譯碼、執(zhí)行、訪存、回寫。取指部件完成從指令存儲器取指;譯碼部件讀取寄存器操作數(shù),與三級流水線中不占有數(shù)據路徑 區(qū)別很大;執(zhí)行部件產生ALU運算結果或產生存儲器地址(對于存儲器訪問指令來講);訪存部件訪問數(shù)據存儲器;回寫部件完成執(zhí)行結果寫回寄存器。把三級流 水線中的執(zhí)行單元進一步細化,減少了在每個時鐘周期內必須完成的工作量,進而允許使用較高的時鐘頻率,且具有分開的指令和數(shù)據存儲器,減少了沖突的發(fā)生, 每條指令的平均周期數(shù)明顯減少。
2 三級流水線運行情況分析
三級流水線在處理簡單的寄存器操作指令時,吞吐率為平均每個時鐘周期一條指令;但是在存在存儲器訪問指令、跳轉指令的情況下會出現(xiàn)流水線阻斷情況,導致流 水線的性能下降。圖1給出了流水線的最佳運行情況,圖中的MOV、ADD、SUB指令為單周期指令。從T1開始,用3個時鐘周期執(zhí)行了3條指令,指令平均 周期數(shù)(CPI)等于1個時鐘周期。
流水線中阻斷現(xiàn)象也十分普遍,下面就各種阻斷情況下的流水線性能進行詳細分析。
2.1 帶有存儲器訪問指令的流水線
對存儲器的訪問指令LDR就是非單周期指令,如圖2所示。這類指令在執(zhí)行階段,首先要進行存儲器的地址計算,占用控制信號線,而譯碼的過程同樣需要占用控 制信號線,所以下一條指令(第一個SUB)的譯碼被阻斷,并且由于LDR訪問存儲器和回寫寄存器的過程中需要繼續(xù)占用執(zhí)行單元,所以下一條(第一個 SUB)的執(zhí)行也被阻斷。由于采用馮·諾伊曼體系結構,不能夠同時訪問數(shù)據存儲器和指令存儲器,當LDR處于訪存周期的過程中時,MOV指令的取指被阻 斷。因此處理器用8個時鐘周期執(zhí)行了6條指令,指令平均周期數(shù)(CPI)=1.3個時鐘周期。
2.2 帶有分支指令的流水線
當 指令序列中含有具有分支功能的指令(如BL等)時,流水線也會被阻斷,如圖3所示。分支指令在執(zhí)行時,其后第1條指令被譯碼,其后第2條指令進行取指,但 是這兩步操作的指令并不被執(zhí)行。因為分支指令執(zhí)行完畢后,程序應該轉到跳轉的目標地址處執(zhí)行,因此在流水線上需要丟棄這兩條指令,同時程序計數(shù)器就會轉移 到新的位置接著進行取指、譯碼和執(zhí)行。此外還有一些特殊的轉移指令需要在跳轉完成的同時進行寫鏈接寄存器、程序計數(shù)寄存器,如BL執(zhí)行過程中包括兩個附加 操作——寫鏈接寄存器和調整程序指針。這兩個操作仍然占用執(zhí)行單元,這時處于譯碼和取指的流水線被阻斷了。
2.3 中斷流水線
處 理器中斷的發(fā)生具有不確定性,與當前所執(zhí)行的指令沒有任何關系。在中斷發(fā)生時,處理器總是會執(zhí)行完當前正被執(zhí)行的指令,然后去響應中斷。如圖4所示,在 Ox90000處的指令ADD執(zhí)行期間IRQ中斷發(fā)生,這時要等待ADD指令執(zhí)行完畢,IRQ才獲得執(zhí)行單元,處理器開始處理IRQ中斷,保存程序返回地 址并調整程序指針指向Oxl8內存單元。在Oxl8處有IRO中斷向量(也就是跳向IRQ中斷服務的指令),接下來執(zhí)行跳轉指令轉向中斷服務程序,流水線 又被阻斷,執(zhí)行0x18處指令的過程同帶有分支指令的流水線。
3 五級流水線技術
五級流水線技術在多種RISC處理器中被廣泛使用,被認為是經典的處理器設計方式。五級流水線中的存儲器訪問部件(訪存)和寄存器回寫部件,解決了三級流水線中存儲器訪問指令在指令執(zhí)行階段的延遲問題。圖5為五級流水線的運行情況(五級流水線也存在阻斷)。
3.1 五級流水線互鎖分析
五級流水線只存在一種互鎖,即寄存器沖突。讀寄存器是在譯碼階段,寫寄存器是在回寫階段。如果當前指令(A)的目的操作數(shù)寄存器和下一條指令(B)的源操 作數(shù)寄存器一致,B指令就需要等A回寫之后才能譯碼。這就是五級流水線中的寄存器沖突。如圖6所示,LDR指令寫R9是在回寫階段,而MOV中需要用到的 R9正是LDR在回寫階段將會重新寫入的寄存器值,MOV譯碼需要等待,直到LDR指令的寄存器回寫操作完成。(注:現(xiàn)在處理器設計中,可以通過寄存器旁 路技術對流水線進行優(yōu)化,解決流水線的寄存器沖突問題。)