處理器按照一系列步驟來執行每一條指令,典型的步驟如下:
(1)從儲存器讀取指令(fetch)。
(2)解碼以鑑別它屬於哪一條指令(decode)。
(3)從指令中提取指令的運算元(這些運算元往往存在於暫存器 reg 中)。
(4)將運算元進行組合以得到結果或儲存器位址(alu)。
(5)如果需要,則訪問儲存器以儲存資料(mem)。
(6)將結果寫回到暫存器堆(res)。
並不是所有的指令都需要上述每乙個步驟,但是,多數指令需要其中的多個步驟。這些步驟往往使用不同的硬體功能,如 alu 可能只在
第 4 步中用到。因此,如果一條指令不是在前一條指令結束之前就開始,那麼在每一步驟內處理器只有少部分的硬體在使用。
有一種方法可以明顯改善硬體資源的使用率和處理器的吞吐量,這就是在當前一條指令結束之前就開始執行下一條指令,即通常所說的流
水線(pipeline)技術。流水線是 risc處理器執行指令時採用的機制。使用流水線,可在取下一條指令的同時解碼和執行其他指令,從而
加快執行的速度。可以把流水線看作是汽車生產線,每個階段只完成專門的處理器任務。
從原理上說,這樣的流水線應該比沒有重疊的指令執行快 6 倍,但由於硬體結構本身的一些限制,實際情況會比理想狀態差一些。
2.1 3級流水線
到 arm7 為止的 arm 處理器使用簡單的 3 級流水線,它包括下列流水線級。
(1)取指令(fetch):從暫存器裝載一條指令。
路。(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 所推出的處理核心都想滿足這一特點,感興趣的讀者可以自行查閱相關資料。
3.1 互鎖
ldr r0,[r0,#0]
add r0,r0,r1 ;在 5 級流水線上產生互鎖
從例子可以看出,流水線的操作產生中斷,因為第 1 條指令的結果在第 2 條指令取數時還沒有產生。第 2 條指令必須停止,直到結果產
生為止。
3.2 跳轉指令
跳轉指令也會破壞流水線的行為,因為後續指令的取指步驟受到跳轉目標計算的影響,因而必須推遲。但是,當跳轉指令被解碼時,在它
被確認是跳轉指令之前,後續的取指操作已經發生。這樣一來,已經被預取進入流水線的指令不得不被丟棄。如果跳轉目標的計算是在
alu 階段完成的,那麼在得到跳轉目標之前已經有兩條指令按原有指令流讀取。顯然,只有當所有指令都依照相似的步驟執行時,流水線
的效率達到最高。如果處理器的指令非常複雜,每一條指令的行為都與下一條指令不同,那麼就很難用流水線實現。
4.1 arm處理器開發詳解筆記
流水線技術理解
流水線,這個詞語最早出於工廠裡面,是資本家為了提高產品的產量而採用的一種技術。我們姑且不去看他的定義,我們從生活中的例子理解什麼是流水線技術 假如我們有很多衣服要洗,現在有一台洗衣機和一台乾衣機,洗衣機用時30分鐘,乾衣機用時60分鐘。如果洗一桶衣服,如下圖所示 很顯然,總時間 洗衣時間 乾衣時間 ...
體系結構 五段流水線 流水線技術
目錄 一條經典的5段流水線 一條指令的執行過程分為以下5個週期 取指令週期 if 指令解碼 讀暫存器週期 id 執行 有效位址計算週期 ex 儲存器訪問 分支完成週期 mem 寫回週期 wb 體系結構 流水線 流水線相關 流水線衝突 以程式計數器 pc中的內容作為位址,從儲存器中取出指令並放入指令暫...
體系結構 五段流水線 流水線技術
以程式計數器pc中的內容作為位址,從儲存器中取出指令並放入指令暫存器ir 同時pc值加4 假設每條指令佔4個位元組 指向順序的下一條指令 對指令進行解碼,並用ir中的暫存器位址去訪問通用暫存器組,讀出所需的運算元 不同指令所進行的操作不同 暫存器 暫存器alu指令 alu按照操作碼指定的操作對從通用...