《深刻理解計算機系統(第三版)》第四章

4.1 Y86-64 指令集體系結構

1.指令體系結構:處理器支持的指令和指令的字節級編碼。
2.與 X86-64 相比,Y86-64 指令集的數據類型、指令和尋址方式要少一些,字節級編碼也比較簡單,機器代碼沒有 Y86-64 緊湊,雖簡單但足夠完整。
3.定義一個指令集體系結構與包括定義各類狀態單元指令集和它們的編碼、一組編程規範異常事件處理
4.Y86-64 有8個程序寄存器:%rax,%rcx,%rdx,%rbx,%rsi,%rdi,%rsp,%rbp 和 %r8 到 %r14(少了 %r15)。%rsp 被入棧、出棧、調用和返回指令做爲棧指針,其它寄存器沒有固定的含義或固定值。
5.下圖是 Y86-64 指令集。指令編碼長度從1~10個字節不等。字段 fn 指明是某個整數操做(OPL)、數據移動條件(cmovXX)或分支條件(jXX)。編程

  • 除了不容許從內存傳到內存,還不容許將當即數傳送到內存
  • OPq 是 addq、subq、andq、xorq,只對寄存器數據進行操做,而 X86-64 還容許對內存數據進行此類操做
  • jXX表明 jmp、jle、jl、je、jne、jge、jg。

6.每條指令的第一個字節表面指令的類型。本字節分爲兩部分,高4位是代碼部分,低4位是功能部分。rrmovq 與條件傳送的指令代碼都爲2,能夠把它看做是一個「無條件傳送」。緩存

15個程序寄存器中每一個都有一個相對應的範圍在0
~0xE之間的寄存器標識符。程序寄存器存在CPU中的寄存器文件(以寄存器id做爲地址的隨機訪問存儲器)中,當須要指明不該訪問任何寄存器時用 0xF 表示。函數

7.沒有寄存器操做數的指令(分支指令和call指令)沒有寄存器指示符字節;只須要一個寄存器操做數的指令(irmovl,pushl,popl)將另外一個寄存器指示符設爲0xF;有些指令須要附加的4字節常數字,可做 irmovl 的當即數數據,rmmol 和 mrmovl 的地址指示符的偏移量、分支指令和調用指令的目的地址。注意: 分支指令和調用指令的目的地址是一個絕對地址,全部整數採用小端法編碼性能

8.rmmovq %rsp,0x123456789abcd(%rdx)中偏移量要放在8字節的常數字中,因此得先填充0變成8字節,而後再按反序輸出,最後字節編碼爲 4042cdab896745230100。測試

9.狀態碼 Stat 描述程序執行的整體狀態。ADR 表示處理器試圖從一個非法內存地址讀或者向一個非法內存地址寫。INS 表示遇到了非法的指令代碼。編碼

  1. x86-64 和 Y86-64 由 GCC 編譯器產生的代碼有不一樣:
  • Y86-64 將 常數加載到寄存器,由於它在算術指令中不能使用當即數
  • 實現從內存讀取一個數並將其與一個寄存器相加,Y86-64 代碼須要兩條指令(先放到寄存器中再加),而 x86-64 只須要一條 addq 指令
  • Y86-64 實現 subq 指令同時還設置了條件碼

11.pushq %rsp壓入 %rsp 的原始值,popq %rsp將 %rsp 設置爲從內存中讀出來的值。設計

4.2 邏輯設計和硬件控制語言HCL

1.數字系統須要三個主要組成部分:3d

  • 計算對位進行操做的函數的組合邏輯
  • 存儲位的存儲器單元
  • 控制存儲器單元更新的時鐘信號

2.C語言中符號運算符的邏輯門下面是對應的HCL表達式:AND用&&表示,OR用||表示,而NOT用!表示。邏輯門只對單個位的數進行操做。邏輯門老是活動的,輸入變化輸出很快就跟着變化。指針

用HCL來寫這個網的函數:bool eq = (a && b) || (!a && !b)code

多路複用器(根據s的值選擇是輸出a或者b)用HCL來描述:out = (s && a) || (!s && b)

3.將不少的邏輯門組合成一個網,就能構建計算塊,稱爲組合電路。構建這些網時,兩個或多個邏輯門的輸出不能連在一塊兒且這個網必須是無環的。一般設計的是能對字進行操做的電路:

在HCL中,全部字級的信號都聲明爲int,不指定字的大小。此電路的函數在字級上表達成 bool Eq = ( A == B )

4.在處理器設計中,不少時候須要將一個信號與許多可能匹配的信號作比較,以此來檢驗正在處理的信號是否屬於某一類指令代碼:

此電路中,兩位信號code可控制對4個數據字A、B、C、D作選擇,根據code值,能夠用相等測試來表示信號 s1 和 s0 的產生:bool si = code in { 2, 3 };bool s0 = code in { 1, 3 };

5.組合電路自己不能存儲信息。爲了產生時序電路,必須引入按位存儲信息的設備。一類是時鐘寄存器(簡稱寄存器),儲存單個位或字。另外一類是隨機訪問儲存器(簡稱儲存器):儲存多個字,用地址選擇該讀/寫哪一個字,例子包括處理器的虛擬內存系統和寄存器文件。

6.寄存器文件有內部存儲,不是組合電路。有A、B兩個讀端口,和一個W寫端口。容許同時進行多個讀寫操做,能夠同時讀兩個寄存器,同時更新第三個寄存器的狀態。兩個讀端口有地址輸入srcA、srcB和數據輸入valA和valB。寫端口有地址輸入dstW,數據輸入valW。向寄存器文件寫入字是由時鐘信號控制的,每次時鐘上升時,輸入valW上的值會被寫入輸入dstW上的寄存器ID指示的程序寄存器。

7.隨機訪問存儲器從內存中讀的操做方式相似於組合邏輯,寫內存時由時鐘控制的。

4.3 Y86-64的順序實現

1.處理一條指令包含不少操做,將它們組織成某個特殊的階段序列。分爲如下幾個階段:

  • 取指:取指階段從存儲器讀取指令字節,地址爲程序計數器(PC)的值
  • 譯碼:譯碼階段從寄存器文件讀入最多兩個操做數,獲得val A 和 / 或 val B
  • 執行:執行階段,算術/邏輯單元要麼執行指令明確的操做(根據ifun的值),計算存儲器引用的有效地址,要麼增長或減小棧指針。獲得的值爲valE
  • 訪存:訪存階段可將數據寫入存儲器或從存儲器讀出數據
  • 寫回:最多可寫兩個結果到寄存器文件
  • 更新PC:將PC設置成下一指令的地址

2.如下是各個 Y86-64 指令在順序實現中的計算:

jXX Dest在執行階段,檢查條件碼和跳轉條件來肯定是否要選擇分支,產生出一個一位信號 Cnd 。在更新 PC 階段,檢查這個標誌,若是標誌爲1,就將PC設爲valC(跳轉目標),若是爲0,就設爲valP(下一條指令的地址)。

3.咱們要將上述計算映射到硬件上,就是要實現邏輯控制,它能在不一樣硬件單元之間傳送數據,以及操做這些單元,使得對每一個不一樣的指令執行指定的運算。SEQ 硬件結構中灰色圓角方框表示的就是控制邏輯塊:

4.要控制處理器中活動的時序,只須要寄存器和內存的時鐘控制。經過時鐘週期來控制元素的更新,經過組合邏輯來傳播,每次時鐘週期由低到高時,處理器開始執行一條新指令。處理器歷來不須要爲了完成一條指令的執行而去讀該指令更新了的狀態。

4.4 流水線的通用原理

1.非流水線化的硬件系統:

2.流水線化的硬件系統:

流水線階段之間的指令轉移是由時鐘信號來控制的。每隔120ps信號從0上升至1,開始下一組流水線階段的計算。

3.流水線的侷限性:

  • 不一致的劃分:因爲階段的延遲並不同,這樣空閒的空間就增長了延遲
  • 流水線過深,收益反而降低

4.5 Y86-64 的流水線實現

1.對 SEQ 中五個階段的順序進行調整,使得更新 PC 階段在一個時鐘週期開始時執行,而不是在結束時才執行。這種修改過的設計爲「SEQ+」。SEQ+中沒有單獨的硬件寄存器來存放pc,而是經過pIconde、pCnd等寄存器(保存的是前一個週期中產生的控制信號),在一個新的時鐘週期開始時用一樣的邏輯來計算 pc 值。

  1. 在 SEQ+ 的各個階段之間插入流水線寄存器,並對信號從新排列,獲得PIPE-處理器。

  • F : 保存pc預測值
  • D :位於取指和譯碼之間,保存最新的指令信息,即將由譯碼階段處理
  • E :位於譯碼和執行之間,保存最新譯碼指令和從寄存器讀出的值,即將由執行階段處理
  • M :位於執行和訪存之間,保存最新執行指令的結果,條件分支和分支目標,即將由訪存處理
  • W :位於訪存和反饋之間,提供給寄存器文件寫,完成ret指令,向pc提供返回地址

3.D_stat、E_stat、M_stat、W_stat指的是流水線寄存器的狀態碼字段,而小寫的 f、d、e、m、w指的是流水線階段,是爲了引用某些在一個階段內剛剛計算出來的信號。

4.數據相關和控制相關可能會致使流水線產生計算錯誤,成爲冒險。首先關心數據冒險,而後再考慮控制冒險。

5.避免數據冒險的方法:

  • 暫停:將指令阻滯在譯碼階段,至關於加入一條nop指令,直到產生它的源操做數指令經過了寫會階段。

  • 轉發:將結果值直接從一個流水線階段傳到較早階段。不是在被動的等待 irmovq 執行完畢,而是在addq指令須要用到rax值時將 irmovq 的W階段的中間值 W_valE 轉發到 addq 指令中做爲源操做數 valB :

  • 使用暫停和轉發相結合的方法來避免加載/使用數據冒險。

6.異常處理方法:

  • 由流水線最深的指令引發的異常,優先級最高
  • 多條分支中有異常,取消預測指令
  • 根據狀態碼stat發現異常,禁止其餘指令更新程序狀態

7.PIPE 是使用了轉發技術的流水線化的 Y86-64 處理器:

  • PC選擇和取指階段:當預測錯誤分支進入訪存階段,PC選擇邏輯會選擇M_valA中讀出該指令valP的值(下一條指令的地址);當ret指令進入寫回階段時從W _valM中讀出的返回地址;其餘狀況下選擇F_predPC。

  • 譯碼和寫回階段:提供給寫端口的寄存器ID來自於寫回階段(W_dstE和W_dstM),而不是譯碼階段。「Sel+Fwd A」實現 select A 和對 valA 的轉發邏輯,「Fwd B」實現對 valB 的轉發邏輯:

  • 執行階段:

  • 訪存階段:PIPE 中用「Sel+Fwd A」執行SEQ中的「Data」塊:

8.流水線控制邏輯根據來自流水線寄存器和流水線階段的信號,控制邏輯產生流水線寄存器的暫停和睦泡控制信號,同時也決定是否要更新條件碼寄存器。PIPE流水線控制邏輯覆蓋了經過流水線的正常指令流,以處理特殊條件,例如過程返回、預測錯誤的分支、加載/使用冒險和程序異常:

9.經過肯定往流水線中插入氣泡的頻率來衡量效率的損失。一條返回指令會產生三個氣泡,一個加載/使用冒險會產生一個,一個預測錯誤的分支會產生兩個。經過計算PIPE執行一條指令所須要的平均時鐘週期數的估計值來量化處罰對總體性能的影響(CPI)。CPI = 1.0 + lp + mp + rp

算出CPI的值爲1.27。咱們的目標是設計一個每一個週期發射一條指令的流水線,即CPII爲1.0。要想下降CPI,要集中注意力預測錯誤的分支

10.實現多週期指令能夠簡單擴展執行階段邏輯的功能,添加一些整數和浮點算術運算單元;用暫停來處理短期的高速緩存不命中和用異常處理來處理長時間的缺頁結合起來可以顧及到存儲器訪問時因爲存儲器層次結構引發的全部不可預測性。

相關文章
相關標籤/搜索