前言
本文檔是作者在準備《計算機組成原理與系統結構》時,一邊複習一邊編撰的,耗時五個白天。今天發出這篇文檔與大家共享,是爲了幫助大家縷清思路,幫助大家更好的複習。具體在複習時還請以課本或老師的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) 平均每條指令的執行時間
- 平均每條指令的執行時間 = 平均每條指令所花費的時鐘週期(CPI) 一個時鐘週期長度(CT)
- MIPS(Million Instruction Per Second):每秒執行百萬指令條數
- FLOPS(Floating Point Operation Per Second):每秒浮點運算次數
- MFLOPS, GFLOPS, TFLOPS
1.4 性能設計的基本原則
- 性能優化設計基本原則:大概率事件優先、Amdahl定律
- 系統加速比 = 改進後性能/改進前性能 = 改進前時間/改進後時間
- Amdahl定律:總時間看作1, 系統加速比 = ,加速比上限
- 如果僅對計算機一部分性能做改進,改進越多、系統獲得的效果越小
- 並行計算性能的提升,受到了程序中必須串行的部分的限制
二、整數的表示與運算
2.1 整數的編碼
- 整數表示:原碼、補碼、反碼
- 原碼:最高位符號位、剩下的位是絕對值,零有兩種表示,不方便計算
- 反碼:最高位符號位,如果是負數後面的部分取反,零有兩種表示、不方便計算
- 補碼:最高位符號位,如果是正數則數值部分不變,否則取反加一,零唯一、沒有正負零,可以直接相加
- 補碼中減法可以轉化爲加法
- 補碼是以爲模的計量系統
2.2 有符號數和無符號數之間的轉換
- 顯式轉換、隱式轉換
- 當length是無符號數的時候,
i<=length-1
有漏洞(length==0)
2.3 按位運算與邏輯運算
- 位運算有對應的機器指令,邏輯運算沒有
- 邏輯短路,表達式可以只判斷前面一段
2.4 整數的擴展、截斷、移位
- 0擴展:用於無符號數,直接添加0
- 符號擴展:擴展符號位
- 強行將長數轉化爲短數的時候,發生截斷
- 左移:拋棄最高位、低位填0
- 右移:邏輯右移、符號右移(補符號位)
2.5 整數的加減運算
- 一位全加器:輸入
A
,B
,carry_in
,輸出s
和carry_out
- 32個全加器串聯就得到串行進位加法器,簡單、速度慢
- 減法就是把B取反加一,通過添加32個異或門,以及在最低位一位全加器的
carry_in
輸入1來實現。這個也適用於無符號數 - ALU(arithmetic and logic unit),算術邏輯單元可以進行算術運算和邏輯運算
2.6 溢出的判斷
- 符號相異的數做加法或者符號相同的數做減法,都不會溢出;符號相同的數做加法,符號不同的數做減法,可能溢出
- 符號判斷法:兩個正數相加得到負數,或者兩個負數相加得到正數。缺點:速度慢,需要等運算結果產生後才能判斷
- 進位判斷法:次高位和最高位進位位相異或,結果爲1則溢出
- 雙符號位判斷法:符號位擴展一位,正數00,負數11,相加之後看看符號位兩位是否相同,相同就沒溢出,不相同就溢出
- 溢出判斷只適合於有符號整數,不適合於無符號整數
- C編譯器忽略溢出信號
2.7 定點數的乘法
- 用加法器實現原碼乘法:被乘數存放在,乘數存放在,作爲輔助的寄存器。每次檢測的最低位決定是否要把加給,然後把這兩個寄存器組成的整體進行邏輯右移。假設寄存器寬度是位,做次這樣的加法之後,就存着高位,就存着低位。優點:簡單,缺點:慢
- booth算法:針對補碼乘法,流程和原碼乘法大致相同,每次把的值加到上,加完之後要把整體算術右移。從開始,並規定
2.8 整數的乘法
- 有符號數相乘,可以直接當作無符號數相乘,然後取最後位,結果是正確的
三、浮點數的表示與運算
3.1 浮點數的表示
- 浮點數編碼:符號位S、階碼E、尾數M
- 如果用補碼錶示尾數,那麼必須最高位和次高位不同纔是規格化的
3.2 IEEE754浮點數
- 單精度浮點數階碼8位,尾數23位;雙精度階碼11位,尾數52位
- 階碼所表示的數字減去127得到實際的階(雙精度1023)
- 規格化浮點數的真值爲
- 單精度浮點數絕對值的範圍是,精度是十進制下的7位;雙精度浮點數絕對值的範圍是,精度是十進制下的15位
- 階碼全1時,如果尾數爲0則代表無窮(符號位決定是還是);如果尾數不爲則代表
- 階碼全時,如果尾數全則表示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 靜態隨機訪問存儲器
- 靜態:斷電前內容持續保持
- 特點:昂貴、速度快
- 採用雙譯碼可以降低譯碼電路複雜度(表達個地址只需要根線)
4.3 動態隨機訪問存儲器
- 主存一般採用DRAM,相比SRAM密度高、功耗低、價格便宜
- 刷新(refresh):爲防止信息丟失而補充電荷的過程
- 刷新週期:兩次刷新結束的間隔時間
- 最大刷新週期:從信息存儲到信息泄露完畢的時間
- 刷新按行進行,先把一行的信息存入緩衝區(鎖存器),然後再寫回去
- SDRAM(同步動態隨機訪問存儲器),可以猝發傳輸,即把一系列地址相鄰的數據連續傳輸
- DDR-SDRAM(雙倍速率同步動態隨機訪問存儲器)
- DDR-SRAM的命名:DDR266,單位時間傳輸數據量爲266*帶寬,時鐘頻率爲133MHz
4.4 存儲器的構成
- 存儲器性能衡量指標:延遲(Lantency):訪問一個字所畫花的時間;帶寬(bandwidth):單位時間從存儲器傳到處理器的數據
- 訪存過程:內存控制器 內存設備
- 多體交叉:多個存儲體並行以實現猝發傳輸,連續的字存儲在不同的存儲體裏(流水化訪問),降低了平均訪存延遲、增加了帶寬
- 存儲器擴展:位擴展(並聯多個存儲器,以解決CPU接口的數據位數和芯片數據位數不一致的問題),字擴展(增加地址空間),字位擴展(同時用兩種方法)
4.5 高速緩存的原理
- Cache是內存以塊爲單位的一個子集
- 命中率:所有訪問中,命中所佔的比例
- 命中率設爲,表示命中時的訪問時間,表示命中主存時的訪問時間,則平均訪問時間
- Cache的關鍵問題:數據查找(Data Identification)、地址映射(Address Mapping)、替換策略(Placement Policy)、寫入策略(Write Policy)
4.6 高速緩存的地址映射(1)
- 由於以塊爲單位,主存地址 = 主存塊號 | 塊內偏移量;同理Cache內數據的地址 = Cache塊號 | 塊內偏移量;地址映射變換機構將主存塊號映射到Cache塊號
- Cache對程序員是透明的
- 直接映射:假設Cache可以裝n個塊,則主存塊號爲i的塊被映射到,被成爲區號。主存地址 = 區號 | 塊號 | 塊內偏移量 = | | 塊內偏移量;Cache的每一個塊都有一個tag,這個tag就等於當前所存塊的區號;缺點:交替訪問兩個衝突的地址,會發生乒乓效應
- 全相聯映射:任何內存裏的塊都可以映射到任何告Cache中的塊,命中率高,但是硬件開銷大,替換算法複雜。一般用在容量小的Cache中
4.7 高速緩存的地址映射(2)
- 組相聯映射:假設Cache有塊,Cache被分成組,則內存被分成個區,每個區也被分成組,內存中一個區的第組和Cache中的第組是全相聯映射,把Cache中所有塊按照除以的餘數分組,餘數相同的是同一組。
- 主存地址 = Tag | 組號 | 塊內偏移量,其中組號就是塊號除以的餘數
- 假設每一組有個塊,則被成爲路組相聯映射
- 增加關聯度:增加一組之中的路數
- 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:(指令+下一條指令地址)
- ID/EX:(控制信號+下一條指令地址+擴展後的立即數+寄存器取出的兩個數+rt+rd)
- EX/MEM:(控制信號+zero+ALUout+Branch地址+rt或rd的編碼)
- MEM/WB:(控制信號+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
- 控制冒險
- 分支提前決策:把的判斷移至ID段
- 轉移延遲槽:將一條或幾條肯定會執行的指令移到branch之後,隱藏轉移指令的延遲
- 轉移延遲槽大小是,這是體系結構與編譯器之間的約定
8.6 流水線的優化
- 策略1:深度流水。減少時鐘週期的長度(提高時鐘頻率),同時要增加流水線的段數(級數)。但不是段數越多越好,因爲段寄存器的延遲會成爲時間瓶頸,而且段寄存器的延遲會增加單挑指令的執行時間。會引起前向通路增多,硬件開銷增加,性能下降,增加停頓的可能性,功耗增大
- 策略2:多發射,一次取出並執行多條指令,使得CPI<1。靜態多發射:編譯器決定哪些指令可以同時發射;動態發射:執行時確定哪些指令可以並行(超標量處理器)。動態發射可以分爲按序執行、亂序執行。
版權所屬
西北工業大學2018級數據科學專業ACoder