ARM流水線

ARM流水線技術

      流水線技術通過多個功能部件並行工作來縮短程序執行時間,提高處理器的效率和吞吐率。ARM7是馮·諾依曼結構,採用了典型的三級流水線,而ARM9則是哈佛結構,採用五級流水線技術,而ARM11則更是使用了7級流水線。通過增加流水線級數,簡化了流水線的各級邏輯,進一步提高了處理器的性能。

      在ARM7中,執行單元完成了大量的工作,包括與操作數相關的寄存器和存儲器的讀寫操作、ALU操作和相關器件之間的數據傳輸,因此佔用了多個時鐘週期。ARM9增加了兩個功能部件,分別訪問存儲器並寫回結果,同時,ARM9將讀寄存器的操作轉移到譯碼部件上,使得流水線各部件的功能更平衡。

三級流水線的最佳運行圖


五級流水線的最佳運行圖


      在執行的過程中,通過R15寄存器直接訪問PC的時候,必須考慮此事流水線執行過程的真實情況。程序計數器R15(PC)總是指向取指的指令,而不是指向正在執行的指令或者正在譯碼的指令。一般情況下,人們總是習慣把正在執行的指令作爲參考點,稱之爲當前第1條指令,因此PC總是指向第3條指令。

對於ARM狀態下指令,PC值=當前程序執行位置+8;對與Thumb指令,則PC值=當前程序執行位置+4.

 

      三級流水線有它的缺點,當出現多週期指令、跳轉分支指令和中斷髮生的時候,流水線都會發生阻塞,而且相鄰指令之間也可能因爲寄存器衝突導致流水線阻塞,降低流水線效率。

帶分支情況下:

      當指令序列中含有具有分支功能的指令(如BL等)時,流水線也會被阻斷,如圖3所示。分支指令在執行時,其後第1條指令被譯碼,其後第2條指令進行取指,但是這兩步操作的指令並不被執行。因爲分支指令執行完畢後,程序應該轉到跳轉的目標地址處執行,因此在流水線上需要丟棄這兩條指令,同時程序計數器就會轉移到新的位置接着進行取指、譯碼和執行。此外還有一些特殊的轉移指令需要在跳轉完成的同時進行寫鏈接寄存器、程序計數寄存器,如BL執行過程中包括兩個附加操作——寫鏈接寄存器和調整程序指針。這兩個操作仍然佔用執行單元,這時處於譯碼和取指的流水線被阻斷了。

中斷流水線

      處理器中斷的發生具有不確定性,與當前所執行的指令沒有任何關係。在中斷髮生時,處理器總是會執行完當前正被執行的指令,然後去響應中斷。如圖4所示,在Ox90000處的指令ADD執行期間IRQ中斷髮生,這時要等待ADD指令執行完畢,IRQ才獲得執行單元,處理器開始處理IRQ中斷,保存程序返回地址並調整程序指針指向Oxl8內存單元。在Oxl8處有IRO中斷向量(也就是跳向IRQ中斷服務的指令),接下來執行跳轉指令轉向中斷服務程序,流水線又被阻斷,執行0x18處指令的過程同帶有分支指令的流水線。

 

      五級流水線也有它的缺點,即使存在一種互鎖,即寄存器衝突。讀寄存器是在譯碼階段,寫寄存器是在回寫階段。如果當前指令(A)的目的操作數寄存器和下一條指令(B)的源操作數寄存器一致,B指令就需要等A回寫之後才能譯碼。這就是五級流水線中的寄存器衝突。

雖然流水線互鎖會增加代碼執行時間,但是爲初期的設計者提供了巨大的方便,可以不必考慮使用的寄存器會不會造成衝突;而且編譯器以及彙編程序員可以通過重新設計代碼的順序或者其他方法來減少互鎖的數量。另外分支指令和中斷的發生仍然會阻斷五級流水線。

 

 [1] ARM流水線關鍵技術分析與代碼優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章