《計算機組成原理與系統結構》複習參考

前言

本文檔是作者在準備《計算機組成原理與系統結構》時,一邊複習一邊編撰的,耗時五個白天。今天發出這篇文檔與大家共享,是爲了幫助大家縷清思路,幫助大家更好的複習。具體在複習時還請以課本或老師的PPT等官方資料爲準。

由於文檔寫成時距離考試還有不到18個小時的時間,作者無暇進行較對。如有錯誤敬請包涵。

一、概述

1.1 計算機的基本組成

  • 馮諾依曼結構(存儲程序體系結構):組成:控制器、運算器、存儲器、輸入設備、輸出設備
  • 早期以運算器爲中心,現在以存儲器爲中心

1.2 計算機的執行過程

  • 寄存器分通用寄存器、專用寄存器
  • MDR是存儲器數據寄存器
  • MAR是存儲器地址寄存器
  • MDR的寬度叫存儲字長
  • IR是指令寄存器
  • PC是程序計數器,存放指令地址
  • IR是指令寄存器,存放指令
  • 指令執行:把PC的值放到MAR,PC+4; 存儲器按照MAR取指令存到MDR; MDR的內容放到IR; IR傳給CPU,執行
  • 指令字長:指令的長度
  • 存儲字長:訪存獲得數據的長度,即MDR寬度
  • 機器字長:CPU能同時處理的數據位數

1.3 計算機的性能指標

  • 計算機常用性能指標有執行時間、吞吐率
  • 執行時間(牆上時鐘時間):計算機完成某任務的總時間,性能=1/執行時間
  • 加速比=性能2/性能1=執行時間1/執行時間2
  • 吞吐率(帶寬):單位時間完成的任務數量
  • CPU時間:給定程序任務佔處理器的時間
  • CPU時間 = 指令條數(IC) ×\times 平均每條指令的執行時間
  • 平均每條指令的執行時間 = 平均每條指令所花費的時鐘週期(CPI) ×\times 一個時鐘週期長度(CT)
  • MIPS(Million Instruction Per Second):每秒執行百萬指令條數
  • FLOPS(Floating Point Operation Per Second):每秒浮點運算次數
  • MFLOPS, GFLOPS, TFLOPS

1.4 性能設計的基本原則

  • 性能優化設計基本原則:大概率事件優先、Amdahl定律
  • 系統加速比 = 改進後性能/改進前性能 = 改進前時間/改進後時間
  • Amdahl定律:總時間看作1, 系統加速比 = =1+\Large\frac{改進前時間}{改進後時間} = \frac{1}{未改進部分佔比+\frac{改進部分佔比}{改進部分加速提升比}},加速比上限=1=\frac{1}{未改進部分佔比}
  • 如果僅對計算機一部分性能做改進,改進越多、系統獲得的效果越小
  • 並行計算性能的提升,受到了程序中必須串行的部分的限制

二、整數的表示與運算

2.1 整數的編碼

  • 整數表示:原碼、補碼、反碼
  • 原碼:最高位符號位、剩下的位是絕對值,零有兩種表示,不方便計算
  • 反碼:最高位符號位,如果是負數後面的部分取反,零有兩種表示、不方便計算
  • 補碼:最高位符號位,如果是正數則數值部分不變,否則取反加一,零唯一、沒有正負零,可以直接相加
  • 補碼中減法可以轉化爲加法
  • 補碼是以2n+12^{n+1}爲模的計量系統

2.2 有符號數和無符號數之間的轉換

  • 顯式轉換、隱式轉換
  • 當length是無符號數的時候,i<=length-1有漏洞(length==0)

2.3 按位運算與邏輯運算

  • 位運算有對應的機器指令,邏輯運算沒有
  • 邏輯短路,表達式可以只判斷前面一段

2.4 整數的擴展、截斷、移位

  • 0擴展:用於無符號數,直接添加0
  • 符號擴展:擴展符號位
  • 強行將長數轉化爲短數的時候,發生截斷
  • 左移:拋棄最高位、低位填0
  • 右移:邏輯右移、符號右移(補符號位)

2.5 整數的加減運算

  • 一位全加器:輸入A,B,carry_in,輸出scarry_out
  • 32個全加器串聯就得到串行進位加法器,簡單、速度慢
  • 減法就是把B取反加一,通過添加32個異或門,以及在最低位一位全加器的carry_in輸入1來實現。這個也適用於無符號數
  • ALU(arithmetic and logic unit),算術邏輯單元可以進行算術運算和邏輯運算

2.6 溢出的判斷

  • 符號相異的數做加法或者符號相同的數做減法,都不會溢出;符號相同的數做加法,符號不同的數做減法,可能溢出
  • 符號判斷法:兩個正數相加得到負數,或者兩個負數相加得到正數。缺點:速度慢,需要等運算結果產生後才能判斷
  • 進位判斷法:次高位和最高位進位位相異或,結果爲1則溢出
  • 雙符號位判斷法:符號位擴展一位,正數00,負數11,相加之後看看符號位兩位是否相同,相同就沒溢出,不相同就溢出
  • 溢出判斷只適合於有符號整數,不適合於無符號整數
  • C編譯器忽略溢出信號

2.7 定點數的乘法

  • 用加法器實現原碼乘法:被乘數存放在R2R2,乘數存放在R1R1R0R0作爲輔助的寄存器。每次檢測R1R1的最低位決定是否要把R2R2加給R0R0,然後把R0,R1R0,R1這兩個寄存器組成的整體進行邏輯右移。假設寄存器寬度是ww位,做ww次這樣的加法之後,R0R0就存着高ww位,R1R1就存着低ww位。優點:簡單,缺點:慢
  • booth算法:針對補碼乘法,流程和原碼乘法大致相同,每次把(yiyi+1)x(y_i-y_{i+1})x的值加到R0R0上,加完之後要把R0,R1R0,R1整體算術右移。ii1-1開始,並規定y1=0y_{-1}=0

2.8 整數的乘法

  • 有符號數相乘,可以直接當作無符號數相乘,然後取最後ww位,結果是正確的

三、浮點數的表示與運算

3.1 浮點數的表示

  • 浮點數編碼:符號位S、階碼E、尾數M
  • 如果用補碼錶示尾數,那麼必須最高位和次高位不同纔是規格化的

3.2 IEEE754浮點數

  • 單精度浮點數階碼8位,尾數23位;雙精度階碼11位,尾數52位
  • 階碼所表示的數字減去127得到實際的階(雙精度1023)
  • 規格化浮點數的真值爲(1)s×(1+f)×2E127(-1)^s \times (1+f)\times 2^{E-127}
  • 單精度浮點數絕對值的範圍是2×1038<N<2×10382 \times 10^{-38} < N < 2 \times 10^{38},精度是十進制下的7位;雙精度浮點數絕對值的範圍是2×10308<N<2×103082 \times 10^{-308} < N < 2 \times 10^{308},精度是十進制下的15位
  • 階碼全1時,如果尾數爲0則代表無窮(符號位決定是++\infin還是-\infin);如果尾數不爲00則代表NanNan
  • 階碼全00時,如果尾數全00則表示0,否則是非規格化數

3.3 浮點數運算

  • 浮點數加法:對階(小階往大階對)、尾數相加、規格化檢查、舍入、溢出檢測
  • 浮點數乘法:階碼相加、尾數相乘、規格化、舍入、檢查溢出
  • 四種舍入:向0舍入(直接截斷)、向上舍入、向下舍入、最近舍入(恰好0.5的時候舍入到偶數)
  • 浮點數轉換爲int型,向0舍入
  • int轉化爲double沒有精度問題,int轉化爲float採用最近舍入
  • 當兩個單精度浮點數階數

3.4 數據在存儲器中的存放格式

  • 大數端(Big Endian),最低字節存放在高地址;小數端(Little Endian),最低字節存放在低地址
  • 數據對齊方式:字對齊、字不對齊
  • 對齊存儲規律:數據所在位置的起始地址是該數據類型長度(按字節)的倍數
  • 通過調整變量定義的順序,可以減少字節對齊產生的內存空間浪費

四、存儲系統(一)

4.1 存儲器層次結構

  • 按存儲介質,存儲器分爲:半導體存儲器、磁存儲器、激光存儲器
  • 按存儲方式分:隨機存儲器、順序訪問存儲器
  • 按信息的可保存性分:易失性存儲器(斷電後信息消失)、非易失性存儲器
  • 高速緩存(SRAM)和主存(DRAM)統稱爲內存,固態硬盤(SSD)、磁盤、光盤都是外存
  • 訪存局部性原理:程序傾向於使用最近訪問過的相同地址、或相鄰地址的數據和指令
  • 時間局部性(Temporal locality):最近訪問的項目,在不久的將來還會再次被訪問
  • 空間局部性(Spatial locality):與當前訪問項目相鄰的項目很可能會被同時訪問

4.2 靜態隨機訪問存儲器

  • 靜態:斷電前內容持續保持
  • 特點:昂貴、速度快
  • 採用雙譯碼可以降低譯碼電路複雜度(表達nn個地址只需要2n2\sqrt n根線)

4.3 動態隨機訪問存儲器

  • 主存一般採用DRAM,相比SRAM密度高、功耗低、價格便宜
  • 刷新(refresh):爲防止信息丟失而補充電荷的過程
  • 刷新週期:兩次刷新結束的間隔時間
  • 最大刷新週期:從信息存儲到信息泄露完畢的時間
  • 刷新按行進行,先把一行的信息存入緩衝區(鎖存器),然後再寫回去
  • SDRAM(同步動態隨機訪問存儲器),可以猝發傳輸,即把一系列地址相鄰的數據連續傳輸
  • DDR-SDRAM(雙倍速率同步動態隨機訪問存儲器)
  • DDR-SRAM的命名:DDR266,單位時間傳輸數據量爲266*帶寬,時鐘頻率爲133MHz

4.4 存儲器的構成

  • 存儲器性能衡量指標:延遲(Lantency):訪問一個字所畫花的時間;帶寬(bandwidth):單位時間從存儲器傳到處理器的數據
  • 訪存過程:CPUCPU \leftrightarrow內存控制器\leftrightarrow 內存設備
  • 多體交叉:多個存儲體並行以實現猝發傳輸,連續的字存儲在不同的存儲體裏(流水化訪問),降低了平均訪存延遲、增加了帶寬
  • 存儲器擴展:位擴展(並聯多個存儲器,以解決CPU接口的數據位數和芯片數據位數不一致的問題),字擴展(增加地址空間),字位擴展(同時用兩種方法)

4.5 高速緩存的原理

  • Cache是內存以塊爲單位的一個子集
  • 命中率:所有訪問中,命中所佔的比例
  • 命中率設爲hhtct_c表示命中時的訪問時間,tmt_m表示命中主存時的訪問時間,則平均訪問時間ta=htc+(1h)tmt_a = ht_c+(1-h)t_m
  • Cache的關鍵問題:數據查找(Data Identification)、地址映射(Address Mapping)、替換策略(Placement Policy)、寫入策略(Write Policy)

4.6 高速緩存的地址映射(1)

  • 由於以塊爲單位,主存地址 = 主存塊號 | 塊內偏移量;同理Cache內數據的地址 = Cache塊號 | 塊內偏移量;地址映射變換機構將主存塊號映射到Cache塊號
  • Cache對程序員是透明的
  • 直接映射:假設Cache可以裝n個塊,則主存塊號爲i的塊被映射到imod  ni \mod ni/n\lfloor i/n\rfloor被成爲區號。主存地址 = 區號 | 塊號 | 塊內偏移量 = i/n\lfloor i/n \rfloor | imod  n\lfloor i \mod n \rfloor | 塊內偏移量;Cache的每一個塊都有一個tag,這個tag就等於當前所存塊的區號;缺點:交替訪問兩個衝突的地址,會發生乒乓效應
  • 全相聯映射:任何內存裏的塊都可以映射到任何告Cache中的塊,命中率高,但是硬件開銷大,替換算法複雜。一般用在容量小的Cache中

4.7 高速緩存的地址映射(2)

  • 組相聯映射:假設Cache有nn塊,Cache被分成uu組,則內存被分成mn\frac{m}{n}個區,每個區也被分成uu組,內存中一個區的第ii組和Cache中的第ii組是全相聯映射,把Cache中所有塊按照除以uu的餘數分組,餘數相同的是同一組。
  • 主存地址 = Tag | 組號 | 塊內偏移量,其中組號就是塊號除以uu的餘數
  • 假設每一組有s=nus = \frac{n}{u}個塊,則被成爲ss路組相聯映射
  • 增加關聯度:增加一組之中的路數
  • Cache容量小的場合用組相聯或全相聯映射
  • Cache容量大的場合用直接映射
  • Cache訪問速度要求高的場合用直接相聯映射
  • Cache訪問速度要求低的場合用全相聯或組相聯映射

五、存儲系統(二)

5.1 高速緩存替換策略

  • 常用替換策略:隨機替換法、先進先出法(FIFO)、近期最久未使用法(LRU)
  • FIFO:記錄進入時間,替換最早進入的
  • LRU:記錄多久未訪問,替換最久未使用的
  • LRU一般優於FIFO,但是LRU可能出現顛簸現象
  • LRU硬件開銷大,可以使用僞LRU,使用二叉樹,硬件開銷更少、速度更快

5.2 高速緩存的更新策略

  • 緩存命中時的寫策略:寫直達法(write through),同時修改Cache和內存;寫回法(write back),該塊被替換時修改內存(需要增加Drity位)
  • 高速緩存行 = 高速緩存塊 + valid位 + tag位 + (dirty位) + (LRU/FIFO位)
  • 緩存不命中時的寫策略:按寫分配法(write-allocate),將數據讀入緩存,在緩存中更新內容,常與寫回法搭配使用;不按寫分配法(No-write-allocate),直接修改內存中的內容,常與寫直達搭配使用
  • 對效率要求高,使用寫回法;對安全性要求高,使用寫直達法

5.3 高速緩存友好的代碼

  • 重複引用同一變量(時間局部性)、優先訪問鄰近的變量(空間局部性),可以降低失效率
  • 關注最內層循環的失效率
  • 矩陣乘法可以通過調整循環次序、矩陣分塊來提高效率

5.4 虛擬存儲器

  • 一個程序的內存空間可以分成多個大小相同的頁
  • 如果不劃分成大小相同的頁,會發生碎片化
  • 啓動程序只需要調入部分頁
  • 頁表項:頁號、頁框架號、狀態位、訪問字段(記錄多久未被訪問或者最近訪問次數,替換頁時參考)、修改位(類似dirty)、外存地址
  • 地址轉換策略:虛擬地址->物理地址
  • 虛擬地址:虛頁號+頁內偏移量
  • 頁表很大,駐留在內存裏
  • 由於頁表很大,不能線性存儲,而採用多級頁表
  • TLB(Translation Lookaside Bffers)快表,將經常訪問的虛實頁關係放在高速緩存裏
  • VPN(Virtual page number),虛頁號。VPO(Vritual page offset),虛頁內偏移量。TLBT(TLB tag)。TLBI(TLB index),TLB組號,組相聯時使用。

六、指令系統

6.1 MIPS指令系統簡介

  • MIPS-32發展到MIPS-64,寄存器數目沒變,只是寄存器位寬從32變成了64
  • 三種指令類型:I型(immediate,op|rs|rt|immediate),J型(Jump,op|target),R型(Register,op|rs|rt|rd|sa|funct)

6.2 MIPS控制流指令

  • 條件跳轉指令,立即數後面加上兩個零,然後符號擴展,再與PC+4的結果相加
  • beq,bnq,條件跳轉
  • slt和bne配合使用,可以表示小於跳轉
  • j,立即數無條件跳轉(後面補兩個0,然後與PC+4的高位拼接)
  • jr,跳轉到寄存器所存儲的地址
  • jal(jump and link),跳轉到指定立即數地址之前,把當前的PC+4(下地址)存下來

6.3 MIPS過程調用指令

  • 過程調用的六個步驟
    • 主程序(調用者)將參數放置在過程(被調用者)可以訪問到的位置($a0~$a3)
    • 調用程序將系統控制權移交給被調用過程(jal)
    • 被調用過程申請所需的內存資源
    • 被調用過程執行相應的任務
    • 被調用過程將結果放在主程序可以訪問的位置($v0~$v1)
    • 被調用過程將系統控制權移交給調用程序(jr $ra)
  • stack是一塊從高地址向低地址增長的存儲空間,寄存器不夠用時傳參可以使用棧
  • 爲了防止過程調用時寄存器信息被覆蓋,要把寄存器的內容存入棧
  • $sp指向當前棧頂,$fp指向當前棧幀第一個字或者結構

七、處理器設計

7.1 處理器設計步驟

  • 寄存器文件
    • 讀操作看作組合電路,ra、rb有效則輸出busA和busB。
    • 寫操作,CLK邊沿觸發,當write enable=1時,將busW上的數據寫入rw指定的寄存器
  • 存儲器
    • 讀操作,看作組合電路,一定時間內完成從address取出數據到data out
    • 寫存儲器操作,時序電路,當clk邊沿來到,且write enable=1時,將data in的數據寫入address選中的字
  • 加法器,組合邏輯單元
  • 譯碼器,用於在多個輸出中選中一個(比如3-8譯碼器,5-32譯碼器),組合邏輯
  • ALU,算術邏輯單元,組合邏輯
  • 多路選擇器,組合邏輯

7.2 處理器的數據通路

  • PC寄存器存儲當前指令地址,時序邏輯
  • 指令存儲器存儲指令,組合邏輯
  • 這一節主要講了如何連線,所以電路圖比較多,難以描述,建議直接看ppt或者看書

7.3 控制信號

  • 控制信號
    • ALUCtr 運算操作碼(指定操作類型)
    • ALUSrc ALU數據選擇(立即數/寄存器讀出來的值)
    • ExtOp 是否帶符號擴展
    • Branch 是否爲條件轉移指令
    • Jump 是否爲無條件轉移指令
    • MemWrite 存儲器寫
    • MemtoReg 用ALU的結果還是Mem讀出的數寫進Reg
    • RegWrite 寄存器寫使能
    • RegDst 用哪個字段作爲寫目的寄存器(rt/rd)
  • 機器指令輸入控制器,控制器輸出這些信號,同時ALU的零標誌位fz也會作爲控制器的輸入

7.4 控制邏輯

  • 這部分講了控制器中如何根據輸入輸出的邏輯關係,建立邏輯表達式,從而建立邏輯電路,這部分主要是大量的推導,而且比較偏實踐,掌握方法即可,理論考試中應該大概率不會詳細考察

7.5 多週期處理器

  • 單週期處理器的週期必須設置爲耗費時間最長的指令所消耗的時間
  • 單週期處理器在一個週期內只進行一次譯碼,直接確定所有的控制信號
  • 多週期處理器在部件之間添加了寄存器,因此執行單條指令所化的時間會長於單週期處理器
  • 多週期處理器在一個時鐘週期只能完成一個最基本的動作
  • 機器週期/CPU週期:從內存中讀取一個指令字的最短時間,包含若干時鐘週期
  • 指令週期:從內存中取一條指令並執行指令所用的時間,又若干個CPU週期組成。

注意

  • 這一部分光看提綱應該無法較好的掌握,需要結合電路圖才能深刻理解,建議去看一下ppt、教材或者網課

八、流水線處理器

8.1 流水線處理器的原理

  • 五個流水段
    • Ifetch(IF): 取指令,PC+4
    • Reg/Dec(ID):讀寄存器、指令譯碼
    • Exec(EX):計算
    • Mem(MEM):訪問存儲器
    • Wr(WB):寫寄存器
  • R型指令的Mem階段,sw指令的Wr階段,beq的Wr階段等等,都是空操作,添加空操作是爲了統一每條指令的階段數,從而避免衝突;beq的Mem階段寫入PC
  • 流水線提高了吞吐率
  • 理想情況下,流水線CPI=1

8.2 流水線處理器的實現

  • 流水線處理器要設置段寄存器
  • 譯碼階段將控制信號裝入段寄存器,後面每個階段取一部分信號使用
  • 擴展立即數在第二階段,譯碼結束之後立刻擴展(譯碼得出ExtOp )
  • 在EX階段使用RegDst信號,將rd和rt保留其中一個,可以減少EX/MEM寄存器的位寬
  • 條件轉移指令在MEM階段修改PC
  • 每個段寄存器需要的位數:
    • IF/ID:32+32=6432+32=64(指令+下一條指令地址)
    • ID/EX:9+32×4+5×2=1479+32\times 4+5\times 2=147(控制信號+下一條指令地址+擴展後的立即數+寄存器取出的兩個數+rt+rd)
    • EX/MEM:4+1+32×3+5=1064+1+32\times 3+5=106(控制信號+zero+ALUout+Branch地址+rt或rd的編碼)
    • MEM/WB:2+32×2+5=712+32\times 2+5=71(控制信號+ALUout+MEMout+rt或rd的編碼)

8.3 相關性與冒險

  • MIPS流水線簡化表達:IM,Reg,ALU,DM,Reg
  • 結構冒險:所需的部件正在爲之前的指令工作
  • 數據冒險:需要等待之前的指令完成讀寫
  • 控制冒險:需要根據指令的結果決定下一步
  • 解決結構冒險方案:插入空指令(nop)
  • 爲了防止取指令和取數據的時候發生結構冒險,現在都採用指令cache與數據cache分離的方法
  • 由於Reg的讀寫時間比較快,爲了避免發生讀寫寄存器的結構冒險,採用前半個週期寫寄存器(clock下降沿)、後半個週期讀寄存器的方法(clock上升沿)

8.4 數據冒險

  • 兩類數據冒險:使用寄存器引發的數據冒險、讀存儲器-使用數據冒險
  • 一種解決數據冒險的硬件方法:流水線停頓(stall),將指令停頓幾個週期,需要在譯碼時增加檢測電路。
  • 軟件解決方法:編譯器插入NOP
  • 另一種硬件解決方法:前向傳遞(forwarding),不等寫回寄存器,就將結果直接送至需要結果的單元

8.5 控制冒險

  • 由轉移指令引起
  • 解決控制指令最簡單的方法:清空,把錯誤執行的指令對應的段寄存器清空。代價較大,會導致無條件跳轉指令CPI變成2,條件跳轉指令CPI變成4
  • 控制冒險
  • 分支提前決策:把=0=0的判斷移至ID段
  • 轉移延遲槽:將一條或幾條肯定會執行的指令移到branch之後,隱藏轉移指令的延遲
  • 轉移延遲槽大小是nn,這是體系結構與編譯器之間的約定

8.6 流水線的優化

  • 策略1:深度流水。減少時鐘週期的長度(提高時鐘頻率),同時要增加流水線的段數(級數)。但不是段數越多越好,因爲段寄存器的延遲會成爲時間瓶頸,而且段寄存器的延遲會增加單挑指令的執行時間。會引起前向通路增多,硬件開銷增加,性能下降,增加停頓的可能性,功耗增大
  • 策略2:多發射,一次取出並執行多條指令,使得CPI<1。靜態多發射:編譯器決定哪些指令可以同時發射;動態發射:執行時確定哪些指令可以並行(超標量處理器)。動態發射可以分爲按序執行、亂序執行。

版權所屬

西北工業大學2018級數據科學專業ACoder

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