計算機的組成與設計(四)處理器

一個基本的MIPS實現

  • 存儲器訪問指令:取字(lw)和存字(sw)
  • 算術邏輯指令:加法(add)、減法(sub)、與運算(and)、或運算(or)和小於則設置(slt)
  • 分支指令:相等則分支(beq)和跳轉(j)
    (1)程序計數器(PC)指向指令所在的存儲單元,並從中取出指令
    (2)通過指令字段內容,選擇讀取一個或兩個寄存器;對於取字指令,只需讀取一個寄存器,而其他大多數指令要求讀取兩個寄存器。
    這兩步之後,步驟取決於具體指令類型:
    例如,除跳轉指令外所有指令在讀取寄存器後,都要使用算術邏輯單元(ALU),存儲訪問指令用ALU計算地址,算術邏輯指令用ALU執行運算,分支指令用ALU進行比較;
    在使用ALU之後,存儲訪問指令需要訪問內存以便讀取和存儲數據;算術邏輯指令或取數指令將來自ALU或存儲器的數據寫入存儲器;分支指令需要根據比較的結果決定是否改變下一條指令的地址
    在這裏插入圖片描述
    (控制信號是由指令的某些字段所決定的)

MIPS實現的數據通路功能部件包括兩種不同的邏輯單元:
(1)處理數據值的單元(組合單元,輸出只取決於當前的輸入;如與門或ALU)
(2)存儲狀態的單元(狀態單元,有內部存儲功能,包含狀態,如指令存儲器、數據存儲器和寄存器)
一個狀態單元至少有兩個輸入和一個輸出,兩個必要的輸入爲要寫入單元的數據值和決定何時寫入的時鐘信號,狀態單元的輸出提供了在前一個時鐘信號寫入單元的數據值。(D觸發器、存儲器、寄存器)

時鐘方法:規定了信號可以讀出和寫入的時間(若一個信號同時讀出和寫入,則讀出的信號不確定)
在這裏插入圖片描述
組合邏輯單元的操作在一個時鐘週期內完成,所有信號在一個時鐘週期內從狀態單元1經組合邏輯到達狀態單元2,信號到達狀態單元2所需的時間決定了時鐘週期的長度。(使用時鐘信號和寫控制信號,來控制狀態單元)
在這裏插入圖片描述
(在一個時鐘週期內讀出一個寄存器的值,然後使之結果一些組合邏輯,同時將新值寫入該寄存器)

對於32位MIPS體系而言,幾乎所有這些狀態和邏輯單元的輸入和輸出都是32位,若某單元的輸入和輸出不是32位的,會特別指出

建立數據通路
數據通路部件:
1、要執行一條指令,首先從存儲單元中將指令取出,然後增加程序計數器使其指向下一條指令
在這裏插入圖片描述
2、R型指令有三個寄存器操作數,每條指令都要從寄存器堆讀出兩個數據字,再寫入一個數據字(而寫入一個數據字需要有兩個輸入:一個提供要寫的寄存器號對應的寄存器內容,另一個提供要寫的數據;寄存器堆的讀輸出總是對應於讀寄存器號,不需要其他控制信號,但是寫寄存器必須明確使能寫控制信號,因爲寄存器堆的寫入是邊沿觸發的,所以可以在同一時鐘週期內讀出和寫入同一寄存器;讀操作將讀出以前寫入的內容,而寫入的內容在下一時鐘週期纔可讀)
在這裏插入圖片描述
3、MIPS的存取指令,如果是存儲指令,要從寄存器中讀出要存儲的數據;如果是取數指令,則要從存儲器中讀出數據存入指定的寄存器中(所以需要用到寄存器堆和ALU)
在這裏插入圖片描述
4、beq指令有三個操作數,其中兩個爲寄存器,用於比較是否相等,另一個是16位偏移量,用於計算相對於分支指令所在地址的分支目標地址

  • 指令集計算分支地址時使用的基地址,是分支指令的下一條指令的地址

  • 規定偏移量左移2位以指示以字爲單位的偏移量,這樣偏移量的有效範圍就擴大4倍
    在這裏插入圖片描述
    創建一個簡單的數據通路
    (1)訪存指令和R型指令數據通路的合併

  • 算術邏輯指令使用ALU,並且其輸入來自兩個寄存器。存儲指令也使用ALU來進行地址計算,但ALU的第二個輸入是對指令中16位偏移地址進行符號擴展後的值

  • 存入目標寄存器的值來自於ALU(R型指令而言)或者存儲器(對取數操作而言)
    在這裏插入圖片描述
    (2)增加分支指令,由於分支指令用主ALU對寄存器操作數進行比較,所以還需要加法器完成分支目標地址的計算,還增加一個多選器,用於選擇是將順序的指令地址還是分支目標地址寫入PC
    在這裏插入圖片描述
    ALU控制
    在這裏插入圖片描述
    對於取字和存儲字指令,ALU用加法計算存儲器地址
    對於R型指令,根據指令低6位的funct字段,執行(與、或、減、加、小於則置位)
    對於相等則分支指令,ALU執行減法操作
    (使用一個控制單元生成4位的ALU控制信號,其輸入爲指令的funct字段和2位ALUop字段)
    在這裏插入圖片描述
    爲了設計這個邏輯單元,生成一張真值表
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 操作碼,31:26位

  • 對於R型指令、分支指令和存取指令,要讀取兩個寄存器爲rs和rt字段,分別是25:21位和20:16位

  • 基址寄存器在25:21位中

  • 目標寄存器,對於取數指令爲20:16位(rt字段),對R型指令爲15:11位(rd字段)
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    對於R型指令的數據通路操作

  • 從指令存儲器中取出指令,PC自增

  • 從寄存器堆中讀出寄存器$t2和 $t3,同時計算出各控制信號的狀態

  • ALU根據funct字段確定ALU的功能,對從寄存器堆讀出的數據進行操作

  • 將ALU的結果寫入寄存器堆,根據指令的15:11位選擇目標寄存器($t1)

取數指令的執行:

  • 從指令存儲器取指,PC自增
  • 從寄存器堆讀出寄存器$t2的值
  • ALU將從寄存器堆讀出的值與符號擴展後的指令低16位值相加
  • 將ALU的結果作爲數據存儲器的地址
  • 存儲單元的數據寫入寄存器堆,目標寄存器由指令20:16位($t1)指出

相等則分支指令:

  • 從指令存儲器取指,PC自增
  • 從寄存器堆讀出寄存器$t1和 $t2的值
  • ALU將從寄存器堆讀出的兩數相減,PC+4的值與符號擴展並左移2位後的指令低16位相加,即分支目標地址
  • 根據ALU的輸出決定哪個加法器的結果存入PC

跳轉指令的實現
實現跳轉指令即將下面3個部分拼接爲跳轉地址

  • 當前PC+4的高4位
  • 跳轉指令的26位立即數字段
  • 低位00
    在這裏插入圖片描述

單週期的設計:由於取數指令的時間過長,導致時間週期過長,可採用流水線的處理方式。

MIPS經典5級流水線:
(1)從指令存儲器中讀取指令
(2)指令譯碼的同時,讀取寄存器
(3)執行操作或者計算地址
(4)從數據存儲器中讀取操作數
(5)將結果寫回寄存器

在這裏插入圖片描述
在理想情況下,流水線上的指令執行時間爲:
指令執行時間(非流水線)/流水線的級數
但是流水線引入了一些開銷,因此流水線能夠獲得的加速比也就小於流水線的級數。

MIPS指令集的設計:
(1)MIPS指令的長度相同;簡化了流水線的第一級取指與第二級譯碼
(2)MIPS只有很少的指令格式,並且每一個指令中的源寄存器的字段位置相同,意味着流水線的第二級在確定取指類型的同時,就能夠開始讀寄存器堆
(3)MIPS中的存儲器操作數僅出現在存取指令中
(4)所有操作數必須在存儲器中對齊

流水線冒險
(1)結構冒險:因缺乏硬件支持而導致指令不能在預定的時鐘週期內執行的情況
(2)數據冒險:因無法提供指令執行所需數據而導致指令不能在預定的時鐘週期內執行的情況(可使用旁路和插入氣泡)
(3)控制冒險:也稱分支冒險,因爲指令的地址變化並不是流水線所預期的(可以使用旁路減小分支的延遲)
在這裏插入圖片描述
由於分支冒險引入預測的概念:
(1)靜態預測
(2)動態預測
如同其他解決控制冒險的方法一樣,較長的流水線會惡化預測的性能,並會提高錯誤預測的代價。

在這裏插入圖片描述
在從左到右的指令流中有兩個例外:

  • 寫回階段,把結果寫回數據通路中間的寄存器堆中
  • 選擇PC的下一個值時,需在自增的PC和MEM級的分支地址間進行選擇
    當前指令之後的指令纔會受到影響:第一個會導致數據冒險,第二個會導致控制冒險

通過增加保存中間數據的寄存器,使得在指令執行過程中可以共享部分數據通路
(類似於籃子存放下一步的衣服)
在這裏插入圖片描述
需要注意的是,在寫回階段的後面沒有流水線寄存器。所有的指令都會更新某些狀態,如寄存器堆、存儲器或PC等,因此各個流水線寄存器對於更新後的狀態而言是多餘的;每條指令都會更新PC,不管是自增還是設置爲分支目的地址,PC可以看成流水線寄存器:給流水線的IF級提供數據,PC是可見體系結構寄存器的一部分,發生異常時,必須保存內容,而流水線寄存器的內容可被丟棄。

異常
異常和中斷——除分支之外改變正常指令執行順序的事件
在這裏插入圖片描述
MIPS體系結構中的異常處理
(未定義指令的執行和算術溢出)
異常發生時處理器必須進行的基本操作:在異常程序計數器(Exception Program Counter,EPC)中保存出錯指令的地址,並把控制權交給操作系統的特定地址。(操作系統採取適當的行動,如給用戶程序提供一些服務,對溢出情況進行事先定義的操作,或者終止程序的執行並報告錯誤;完成處理異常所需動作後,由EPC決定重新開始執行的地方。

異常的原因:有兩種方法用以表示異常的原因,1、設置一個狀態寄存器(cause)2、使用向量中斷,在向量中斷中,控制權被轉移到由異常原因決定的地址處。
在這裏插入圖片描述
操作系統根據引起異常的地址得知導致異常的原因。當出現的異常不屬於向量異常時,單個入口點供所有異常使用,並且操作系統對狀態寄存器進行譯碼以找到原因。

假如add產生了一個算術溢出,必須清除流水線中add指令後的一系列指令並從新的地址開始取指
分別使用IF.Flush、ID.Flush、EX.Flush信號清除IF級、ID級和EX級的指令,爲了從地址80000180開始取指令,只要簡單地加入一個額外的輸入到PC的多選器,由它將80000180傳遞到PC,(如果不在指令執行期間中止指令的執行,程序員將無法看到導致溢出的寄存器的原始值;先清除這條指令,然後在異常處理完後再重新執行這條指令)異常處理最後一步是將導致異常的指令的地址保存到EPC中,實際上,保存的地址是原始地址+4,因此異常處理例程必須先從保存的地址中減去4.
在這裏插入圖片描述
判斷異常的一個重要依據是某一類異常可能在哪一個流水線階段發生,例如:未定義的指令異常發生在ID級,而調用操作系統異常發生在EX級。如果cause寄存器中保存有多個異常,當優先級最高的異常處理之後,會導致硬件中斷,從而處理後面的異常。

指令級並行(Instruction level parallelism)
1、增加流水線的深度以重疊更多的指令
2、複製計算機內部部件的數量,(多發射,IPC<1)
實現一個多發射處理器主要有兩種方式,其區別是將主要工作分給編譯器還是硬件來做,由於不同的實現方式將導致某些決策是靜態進行(編譯時)還是動態進行的(執行時),所以這兩種方式也成爲靜態多發射和動態多發射。
多發射流水線必須處理以下問題:
(1)處理器如何確定在給定的始終週期發射多少條指令以及發射何種指令?
靜態發射處理器->編譯器完成;動態發射處理器->由處理器在運行時處理
(2)處理數據冒險和控制冒險:在靜態發射處理器中,部分甚至全部的數據冒險和控制冒險是由編譯器靜態處理的;絕大多數動態發射處理器通過硬件技術在執行時至少消除某些類別的冒險

推測:使依賴於被推測指令的其他指令可以執行,而允許編譯器或處理器猜測指令結果的方法,可以尋找更大的ILP

推測錯誤時的恢復機制對軟硬件是不同的,軟件:編譯器經常插入額外的指令來檢查推測的正確性並提供專門的修復例程供推測錯誤時使用;硬件:處理器緩存推測的結果直至推測的結果得到確認,如果推測是正確的,寫回寄存器堆和存儲器;否則,硬件將清除緩存並重新執行正確的指令。(推測可能會導致原本不存在的異常發生)

靜態多發射處理器
在一個靜態發射處理器中,可以在給定時鐘週期內發射多條指令,發射包(可視爲一條完成多個操作的長指令,超長指令字(Very long instruction word)VLIW)
絕大多數靜態多發射處理器也依賴編譯器處理數據冒險和控制冒險,編譯器的任務可能包括靜態分支預測和代碼調度。
嚴格限制可同時發射指令的所處位置以簡化譯碼和發射過程:
在這裏插入圖片描述
靜態多發射處理器之間的不同在於處理潛在的數據冒險和控制冒險的方式:在有的設計中,編譯器負責避免所有的冒險,通過調度指令和插入no-ops等方法使得代碼在執行時完全不需要冒險檢測和硬件產生阻塞。在另外一些設計中,編譯器只負責避免一個指令對中兩條指令的依賴

循環展開:一種從存取數組的循環中獲取更多性能的技術,其中循環體會被複制多份並且不同循環體中的指令可能會調度到一起。(在循環展開過程中,編譯器引入幾個臨時寄存器,寄存器重命名消除虛假的數據依賴)

動態多發射處理器(超標量處理器)
在超標量處理器中,不管代碼是否經過調度,都是由硬件來保證執行的正確性。並且,編譯得到的代碼應當始終正確執行,而與指令發射速率和處理器的流水線結構無關。
動態流水線調度選擇下一條要執行的指令,可能會重排指令以避免阻塞,流水線劃分爲3個主要單元:取指與發射單元、多個功能單元和一個提交單元。
第一個單元取指並譯碼,然後把每條指令發送到相應的功能單元執行,每個功能單元都有緩衝區(保留站reservation station),用來保存操作數和操作。當緩衝區中包含了所有的操作數,並且功能單元就緒,結果就被計算出來,併發送到等待該結果的保留站和提交單元,提交單元緩存這個結果(重排序緩衝區reorder buffer),確認安全後,再將結果寫回寄存器堆或存儲器。
在這裏插入圖片描述
即亂序指令與順序提交(當異常發生時,只有導致異常之前的指令才能對寄存器狀態進行修改),且動態調度常與基於硬件的推測機制相結合。
爲什麼需要超標量處理器進行動態調度?
1、並不是所有的阻塞可以事先知道(例如cache缺失)
2、如果處理器採用動態分支預測分支結果,那麼由於這些信息依賴預測和分支指令真實執行情況,編譯器無法得知指令的精確順序。
3、由於流水線延遲和發射寬度根據處理器的具體實現有很大的差別,所以最佳的編譯代碼順序也並不固定
(但是通過動態多發射和推測執行開發指令級並行的負面問題是功耗問題)
在這裏插入圖片描述

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