很多人對計算機體系結(jié)構(gòu)有一定的了解,但要問起什么是計算機體系結(jié)構(gòu),多半答不上來。
計算機體系結(jié)構(gòu)(Computer Architecture)是描述計算機各組成部分及其相互關(guān)系的一組規(guī)則和方法,是程序員所看到的計算機屬性。計算機體系結(jié)構(gòu)主要研究內(nèi)容包括指令系統(tǒng)結(jié)構(gòu)(Instruction Set Architecture,簡稱ISA)和計算機組織結(jié)構(gòu)(Computer Organization)。微體系結(jié)構(gòu)(Micro-architecture)是微處理器的組織結(jié)構(gòu),并行體系結(jié)構(gòu)是并行計算機的組織結(jié)構(gòu)。馮·諾依曼結(jié)構(gòu)的存儲程序和指令驅(qū)動執(zhí)行原理是現(xiàn)代計算機體系結(jié)構(gòu)的基礎(chǔ)。
計算機體系結(jié)構(gòu)可以有不同層次和形式的表現(xiàn)方式。計算機體系結(jié)構(gòu)通常用指令系統(tǒng)手冊和結(jié)構(gòu)框圖來表示,結(jié)構(gòu)框圖中的方塊表示計算機的功能模塊,線條和箭頭表示指令和數(shù)據(jù)在功能模塊中的流動,結(jié)構(gòu)框圖可以不斷分解一直到門級或晶體管級。計算機體系結(jié)構(gòu)也可以用高級語言如C語言來表示,形成結(jié)構(gòu)模擬器,用于性能評估和分析。用硬件描述語言(如Verilog)描述的體系結(jié)構(gòu)可以通過電子設(shè)計自動化(Electronic Design Automation,簡稱EDA)工具進行功能驗證和性能分析,轉(zhuǎn)換成門級及晶體管級網(wǎng)表,并通過布局布線最終轉(zhuǎn)換成版圖,用于芯片制造。
01
馮·諾依曼結(jié)構(gòu)及其基本原理
1945年匈牙利數(shù)學(xué)家馮·諾依曼結(jié)合EDVAC計算機的研制提出了世界上第一個完整的計算機體系結(jié)構(gòu),被稱為馮·諾依曼結(jié)構(gòu)。馮·諾依曼結(jié)構(gòu)的主要特點是:①計算機由存儲器、運算器、控制器、輸入設(shè)備、輸出設(shè)備五部分組成,其中運算器和控制器合稱為中央處理器(Central Processing Processor,簡稱CPU)或處理器。②存儲器是按地址訪問的線性編址的一維結(jié)構(gòu),每個單元的位數(shù)固定。指令和數(shù)據(jù)不加區(qū)別混合存儲在同一個存儲器中。③控制器從存儲器中取出指令并根據(jù)指令要求發(fā)出控制信號控制計算機的操作。控制器中的程序計數(shù)器指明要執(zhí)行的指令所在的存儲單元地址。程序計數(shù)器一般按順序遞增,但可按指令要求而改變。④以運算器為中心,輸入/輸出(Input/Output,簡稱IO)設(shè)備與存儲器之間的數(shù)據(jù)傳送都經(jīng)過運算器。
隨著技術(shù)的進步,馮·諾依曼結(jié)構(gòu)得到了持續(xù)改進,主要包括:①以運算器為中心改進為以存儲器為中心,數(shù)據(jù)流向更加合理,從而使運算器、存儲器和IO設(shè)備能夠并行工作。②由單一的集中控制改進為分散控制。早期的計算機工作速度低,運算器、存儲器、控制器和IO設(shè)備可以在同一個時鐘信號的控制下同步工作?,F(xiàn)在運算器、存儲器與IO設(shè)備的速度差異很大,需要異步分散控制。③從基于串行算法改進為適應(yīng)并行算法,出現(xiàn)了流水線處理器、超標(biāo)量處理器、向量處理器、多核處理器、對稱多處理機(Symmetric Multi-Processor,簡稱SMP)、大規(guī)模并行處理機(Massively Parallel Processor,簡稱MPP)和機群系統(tǒng)等。④出現(xiàn)了為適應(yīng)特殊需要的專用計算機,如圖形處理器(Graphic Processing Unit,簡稱GPU)、數(shù)字信號處理器(Digital Signal Processor,簡稱DSP)等。
雖然經(jīng)過了長期的發(fā)展,以存儲程序和指令驅(qū)動執(zhí)行為主要特點的馮·諾依曼結(jié)構(gòu)仍是現(xiàn)代計算機的主流結(jié)構(gòu)。非馮·諾依曼計算機的研究成果包括依靠數(shù)據(jù)驅(qū)動的數(shù)據(jù)流計算機、圖約計算機等。
02
指令系統(tǒng)結(jié)構(gòu)
計算機系統(tǒng)為軟件編程提供不同層次的功能和邏輯抽象,主要包括應(yīng)用程序編程接口(Application Programming Interface,簡稱API)、應(yīng)用程序二進制接口(Application Binary Interface,簡稱ABI)以及ISA三個層次。
API是應(yīng)用程序的高級語言編程接口,在編寫程序的源代碼時使用。常見的API包括C語言、Fortran語言、Java語言、JavaScript語言接口以及OpenGL圖形編程接口等。使用一種API編寫的應(yīng)用程序經(jīng)重新編譯后可以在支持該API的不同計算機上運行。
ABI是應(yīng)用程序訪問計算機硬件及操作系統(tǒng)服務(wù)的接口,由計算機的用戶態(tài)指令和操作系統(tǒng)的系統(tǒng)調(diào)用組成。為了實現(xiàn)多進程訪問共享資源的安全性,處理器設(shè)有“用戶態(tài)”與“核心態(tài)”。用戶程序在用戶態(tài)下執(zhí)行,操作系統(tǒng)向用戶程序提供具有預(yù)定功能的系統(tǒng)調(diào)用函數(shù)來訪問只有核心態(tài)才能訪問的硬件資源。當(dāng)用戶程序調(diào)用系統(tǒng)調(diào)用函數(shù)時,處理器進入核心態(tài)執(zhí)行諸如訪問IO設(shè)備、修改處理器狀態(tài)等只有核心態(tài)才能執(zhí)行的指令。處理完系統(tǒng)調(diào)用后,處理器返回用戶態(tài)執(zhí)行用戶代碼。相同的應(yīng)用程序二進制代碼可以在相同ABI的不同計算機上運行。
ISA是計算機硬件的語言系統(tǒng),也叫機器語言,是計算機軟件和硬件的界面,反映了計算機所擁有的基本功能。計算機硬件設(shè)計人員采用各種手段實現(xiàn)指令系統(tǒng),軟件設(shè)計人員使用指令系統(tǒng)編制各種軟件,用這些軟件來填補指令系統(tǒng)與人們習(xí)慣的計算機使用方式之間的語義差距。設(shè)計指令系統(tǒng)就是要選擇應(yīng)用程序和操作系統(tǒng)中一些基本操作應(yīng)由硬件實現(xiàn)還是由軟件通過一串指令實現(xiàn),然后具體確定指令系統(tǒng)的指令格式、類型、操作以及對操作數(shù)的訪問方式。相同的應(yīng)用程序及操作系統(tǒng)二進制代碼可以在相同ISA的不同計算機上運行。
ISA通常由指令集合、處理器狀態(tài)和例外三部分組成。
指令包含操作編碼和操作數(shù)編碼,操作編碼指明操作類型,操作數(shù)編碼指明操作對象。常見的指令編碼方式包括復(fù)雜指令系統(tǒng)(Complex Instruction Set Computer,簡稱CISC)、精簡指令系統(tǒng)(Reduced Instruction Set Computer,簡稱RISC)和超長指令字(Very Long Instruction Word,簡稱VLIW)等。
指令的操作主要包括:運算指令,如加減乘除、邏輯運算、移位等;數(shù)據(jù)傳送指令,如取數(shù)和存數(shù);程序控制指令,如條件和非條件轉(zhuǎn)移、函數(shù)調(diào)用和返回等;處理器狀態(tài)控制指令,如系統(tǒng)調(diào)用指令、調(diào)試指令、同步指令等。
指令的操作數(shù)包括立即數(shù)、寄存器、存儲器、IO設(shè)備寄存器等。立即數(shù)是指令中直接給出的數(shù)據(jù)。寄存器用于保存處理器最常用的數(shù)據(jù),包括通用寄存器、浮點寄存器、控制寄存器等,處理器訪問寄存器時直接在指令中指明要訪問的寄存器號。存儲器是計算機中保存指令和數(shù)據(jù)的場所,計算機取指令和存取數(shù)據(jù)都要先計算指令和數(shù)據(jù)所處的存儲單元地址并根據(jù)地址來讀寫存儲器。IO設(shè)備都有專門的設(shè)備控制器,設(shè)備控制器向處理器提供一組IO設(shè)備寄存器,處理器通過讀寫IO設(shè)備寄存器來獲知IO設(shè)備狀態(tài)并控制IO設(shè)備,處理器寫入IO設(shè)備寄存器的數(shù)據(jù),會被設(shè)備控制器解釋成控制IO設(shè)備的命令。
指令需要明確操作數(shù)的數(shù)據(jù)表示、編址方式、尋址方式和定位方式等。數(shù)據(jù)表示給出指令系統(tǒng)可直接調(diào)用的數(shù)據(jù)類型,包括整數(shù)、實數(shù)、布爾值、字符等。編址方式給出編址單位、編址方法和地址空間等,其中:編址單位有字編址、字節(jié)編址和位編址,普遍使用的是字節(jié)編址;常見的編址方法有大尾端(Big Endian)和小尾端(Little Endian)兩種;地址空間包括寄存器空間、存儲器空間和IO設(shè)備空間,有些ISA把存儲器和IO設(shè)備統(tǒng)一編址,有些ISA把寄存器、存儲器和IO設(shè)備統(tǒng)一編址。尋址方式主要有:立即數(shù)尋址、寄存器尋址、直接尋址、間接尋址、變址尋址(包括相對尋址和基址尋址)和堆棧尋址等。定位方式確定指令和數(shù)據(jù)的物理地址,包括以下幾種:直接定位方式在程序裝入主存儲器之前確定指令和數(shù)據(jù)的物理地址;靜態(tài)定位方式在程序裝入主存儲器的過程中進行地址變換,確定指令和數(shù)據(jù)的物理地址;動態(tài)定位方式在程序執(zhí)行過程中,當(dāng)訪問到相應(yīng)的指令或數(shù)據(jù)時才進行地址變換,確定指令和數(shù)據(jù)的物理地址,現(xiàn)代計算機多采用動態(tài)定位方式。
通用計算機至少要有兩種工作狀態(tài):核心態(tài)和用戶態(tài)。兩個狀態(tài)下所能使用的指令和存儲空間等硬件資源有差別。一般來說,只有操作系統(tǒng)才能工作在核心態(tài),用戶程序只能工作在用戶態(tài)并可以通過例外和系統(tǒng)調(diào)用進入核心態(tài)。有些處理器有更多工作狀態(tài),如核心態(tài)(Kernel)、監(jiān)督態(tài)(Hypervisor)、管理態(tài)(Supervisor)、用戶態(tài)(User)等。
例外(Exception)系統(tǒng)是現(xiàn)代計算機的重要組成部分,除了管理外部設(shè)備之外,還承擔(dān)了包括故障處理、實時處理、分時操作系統(tǒng)、程序的跟蹤調(diào)試、程序的監(jiān)測、用戶程序與操作系統(tǒng)的聯(lián)系等任務(wù)。發(fā)生例外時,處理器需要保存例外原因、例外指令的程序計數(shù)器內(nèi)容等信息,把處理器狀態(tài)切換為核心態(tài)并跳轉(zhuǎn)到事先指定的操作系統(tǒng)例外處理入口地址;執(zhí)行完例外處理程序后,處理器狀態(tài)切換回發(fā)生例外前的狀態(tài)并跳轉(zhuǎn)回發(fā)生例外的指令繼續(xù)執(zhí)行。指令系統(tǒng)要指明例外源的分類組織、例外系統(tǒng)的軟硬件功能分配、例外現(xiàn)場的保存和恢復(fù)、例外優(yōu)先級、例外響應(yīng)方式和屏蔽方式等。
03
計算機組織結(jié)構(gòu)
計算機組織結(jié)構(gòu)指計算機的組成部分及各部分之間的互連實現(xiàn)。典型計算機的基本組成包括CPU、存儲器、IO設(shè)備,其中CPU包括運算器和控制器,IO設(shè)備包括輸入設(shè)備和輸出設(shè)備。計算機從輸入設(shè)備接收程序和數(shù)據(jù),存放在存儲器中;CPU運行程序處理數(shù)據(jù);最后將結(jié)果數(shù)據(jù)通過輸出設(shè)備輸出。
運算器包括算術(shù)和邏輯運算部件、移位部件、寄存器等。復(fù)雜運算如乘除法、開方及浮點運算可用程序?qū)崿F(xiàn)或由運算器實現(xiàn)。寄存器既可用于保存數(shù)據(jù),也可用于保存地址。運算器還可設(shè)置條件碼寄存器等專用寄存器,條件碼寄存器保存當(dāng)前運算結(jié)果的狀態(tài),如運算結(jié)果是正數(shù)、負(fù)數(shù)或零,是否溢出等。
控制器控制指令流和每條指令的執(zhí)行,內(nèi)含程序計數(shù)器和指令寄存器等。程序計數(shù)器存放當(dāng)前執(zhí)行指令的地址,指令寄存器存放當(dāng)前正在執(zhí)行的指令。指令通過譯碼產(chǎn)生控制信號,用于控制運算器、存儲器、IO設(shè)備的工作。這些控制信號可以用硬連線邏輯產(chǎn)生,也可以用微程序產(chǎn)生,也可以兩者結(jié)合產(chǎn)生。為了獲得高指令吞吐率,可以采用指令重疊執(zhí)行的流水線技術(shù),以及同時執(zhí)行多條指令的超標(biāo)量技術(shù)。當(dāng)遇到執(zhí)行時間較長或條件不具備的指令時,把條件具備的后續(xù)指令提前執(zhí)行(稱為亂序執(zhí)行)可以提高流水線效率??刂破鬟€產(chǎn)生一定頻率的時鐘脈沖,用于計算機各組成部分的同步。
存儲器存儲程序和數(shù)據(jù),又稱主存儲器或內(nèi)存,一般用動態(tài)隨機存儲器(Dynamic Random Access Memory,簡稱DRAM)實現(xiàn)。CPU可以直接訪問它,IO設(shè)備也頻繁地和它交換數(shù)據(jù)。存儲器的存取速度往往滿足不了CPU的快速要求,容量也滿足不了應(yīng)用的需要,為此將存儲系統(tǒng)分為高速緩存(Cache)、主存儲器和輔助存儲器三個層次。Cache存放當(dāng)前CPU最頻繁訪問的部分主存儲器內(nèi)容,可以采用比DRAM速度快但容量小的靜態(tài)隨機存儲器(Static Random Access Memory,簡稱SRAM)實現(xiàn)。數(shù)據(jù)和指令在Cache和主存儲器之間的調(diào)動由硬件自動完成。為擴大存儲器容量,使用磁盤、磁帶、光盤等能存儲大量數(shù)據(jù)的存儲器作為輔助存儲器。計算機運行時所需的應(yīng)用程序、系統(tǒng)軟件和數(shù)據(jù)等都先存放在輔助存儲器中,在運行過程中分批調(diào)入主存儲器。數(shù)據(jù)和指令在主存儲器和輔助存儲器之間的調(diào)動由操作系統(tǒng)完成。CPU訪問存儲器時,面對的是一個高速(接近于Cache的速度)、大容量(接近于輔助存儲器的容量)的存儲器。現(xiàn)代計算機中還有少量只讀存儲器(Read Only Memory,簡稱ROM)用來存放引導(dǎo)程序和基本輸入輸出系統(tǒng)(Basic Input Output System,簡稱BIOS)等。現(xiàn)代計算機訪問內(nèi)存時采用虛擬地址,操作系統(tǒng)負(fù)責(zé)維護虛擬地址和物理地址轉(zhuǎn)換的頁表,集成在CPU中的存儲管理部件(Memory Management Unit,簡稱MMU)負(fù)責(zé)把虛擬地址轉(zhuǎn)換為物理地址。
IO設(shè)備實現(xiàn)計算機和外部世界的信息交換。傳統(tǒng)的IO設(shè)備有鍵盤、鼠標(biāo)、打印機和顯示器等;新型的IO設(shè)備能進行語音、圖像、影視的輸入輸出和手寫體文字輸入,并支持計算機之間通過網(wǎng)絡(luò)進行通信;磁盤等輔助存儲器在計算機中也當(dāng)作IO設(shè)備來管理。處理器通過讀寫IO設(shè)備控制器中的寄存器來訪問及控制IO設(shè)備。高速IO設(shè)備可以在處理器安排下直接與主存儲器成批交換數(shù)據(jù),稱為直接存儲器訪問(Directly Memory Access,簡稱DMA)。處理器可以通過查詢設(shè)備控制器狀態(tài)與IO設(shè)備進行同步,也可以通過中斷與IO設(shè)備進行同步。
由若干個CPU、存儲器和IO設(shè)備可以構(gòu)成比單機性能更高的并行處理系統(tǒng)。
現(xiàn)代計算機各部件之間采用總線互連。為了便于不同廠家生產(chǎn)的設(shè)備能在一起工作以及設(shè)備的擴充,總線的標(biāo)準(zhǔn)化非常重要。常見的總線包括片上總線如AXI總線,系統(tǒng)總線如QPI和HT總線,內(nèi)存總線如SDRAM總線,IO總線如PCIE、SATA、USB總線等。
04
微體系結(jié)構(gòu)
半導(dǎo)體工藝的發(fā)展允許在單個芯片內(nèi)部集成CPU,稱為微處理器(Microprocessor)。微體系結(jié)構(gòu)(簡稱微結(jié)構(gòu))是微處理器的組織結(jié)構(gòu),描述處理器的組成部分及其互連關(guān)系,以及這些組成部分及其互連如何實現(xiàn)指令系統(tǒng)的功能。對于同一個指令系統(tǒng),復(fù)雜的微結(jié)構(gòu)性能高,功耗和成本也高;簡單的微結(jié)構(gòu)性能低,功耗和成本也低。隨著半導(dǎo)體工藝的不斷發(fā)展,實現(xiàn)相同指令系統(tǒng)的處理器微結(jié)構(gòu)不斷升級并不斷提高性能。
計算機執(zhí)行指令一般包含以下過程:從存儲器取指令并對取回的指令進行譯碼,從存儲器或寄存器讀取指令執(zhí)行需要的操作數(shù),執(zhí)行指令,把執(zhí)行結(jié)果寫回存儲器或寄存器。上述過程稱為一個指令周期。計算機不斷重復(fù)指令周期直到完成程序的執(zhí)行。體系結(jié)構(gòu)研究的一個永恒主題就是不斷加速上述指令執(zhí)行周期,從而提高計算機運行程序的效率。人們提出了很多提高指令執(zhí)行效率的技術(shù),包括RISC技術(shù)、指令流水線技術(shù)、高速緩存技術(shù)、轉(zhuǎn)移預(yù)測技術(shù)、亂序執(zhí)行技術(shù)、超標(biāo)量(又稱為多發(fā)射)技術(shù)等。
RISC技術(shù)。自20世紀(jì)40年代發(fā)明電子計算機以來,處理器結(jié)構(gòu)和指令系統(tǒng)經(jīng)歷了一個由簡單到復(fù)雜,由復(fù)雜到簡單,又由簡單到復(fù)雜的否定之否定過程。早期的處理器結(jié)構(gòu)及其指令系統(tǒng)由于工藝技術(shù)的限制,不可能做得很復(fù)雜。隨著工藝技術(shù)的發(fā)展,20世紀(jì)60年代后流水線技術(shù)、動態(tài)調(diào)度技術(shù)、向量機技術(shù)被廣泛使用,處理器結(jié)構(gòu)和指令系統(tǒng)變得復(fù)雜。20世紀(jì)80年代提出的RISC技術(shù)通過減少指令數(shù)目、定長編碼、降低編碼密度等以簡化指令的取指、譯碼、執(zhí)行的邏輯來提高頻率,通過增加寄存器數(shù)目及l(fā)oad-store結(jié)構(gòu)來提高效率。后來隨著深度流水、超標(biāo)量、亂序執(zhí)行的實現(xiàn),RISC結(jié)構(gòu)變得越來越復(fù)雜。
RISC指令采用load-store結(jié)構(gòu),運算指令從寄存器讀取操作數(shù)并把結(jié)果寫回寄存器,訪存指令則負(fù)責(zé)在寄存器和存儲器間交換數(shù)據(jù),運算指令和訪存指令分別在不同的功能部件執(zhí)行。在load-store結(jié)構(gòu)中,運算器只需比較指令的寄存器號來判斷指令間的數(shù)據(jù)相關(guān),訪存部件只需比較訪存指令的地址來判斷指令間的數(shù)據(jù)相關(guān),從而支持高效的流水線、多發(fā)射及亂序執(zhí)行技術(shù)。X86系列從Pentium Ⅲ開始,把CISC指令翻譯成若干RISC微操作以提高指令流水線效率,如Haswell微結(jié)構(gòu)最多允許192個內(nèi)部微操作亂序執(zhí)行。
指令流水線技術(shù)。指令流水線把一條指令的執(zhí)行劃分為若干階段(如分為取指、譯碼、執(zhí)行、訪存、寫回階段)來減少每個時鐘周期的工作量,從而提高主頻;并允許多條指令的不同階段重疊執(zhí)行實現(xiàn)并行處理(如一條指令處于執(zhí)行階段時,另一條指令處于譯碼階段)。雖然同一條指令的執(zhí)行時間沒有變短,但處理器在單位時間內(nèi)執(zhí)行的指令數(shù)增加了。
指令流水線的執(zhí)行單元包括算術(shù)和邏輯運算部件(Arithmetic Logic Unit,簡稱ALU)、浮點運算部件(Floating Point Unit,簡稱FPU)、向量運算部件、訪存部件、轉(zhuǎn)移部件等。這些部件在流水線的調(diào)度下具體執(zhí)行指令規(guī)定的操作。運算部件的個數(shù)和延遲,訪存部件的存儲層次、容量和帶寬,以及轉(zhuǎn)移部件的轉(zhuǎn)移猜測算法是決定微結(jié)構(gòu)性能的重要因素。
Cache技術(shù)。隨著工藝技術(shù)的發(fā)展,處理器的運算速度和內(nèi)存容量按摩爾定律的預(yù)測指數(shù)增加,但內(nèi)存速度提高非常緩慢,與處理器速度的提高形成了“剪刀差”。
工藝技術(shù)的上述特點使得訪存延遲成為以存儲器為中心的馮·諾依曼結(jié)構(gòu)的主要瓶頸。Cache技術(shù)利用程序訪問內(nèi)存的時間局部性(一個單元如果當(dāng)前被訪問,則近期很有可能被訪問)和空間局部性(一個單元被訪問后,與之相鄰的單元也很有可能被訪問),使用速度較快、容量較小的Cache臨時保存處理器常用的數(shù)據(jù),使得處理器的多數(shù)訪存操作可以在Cache上快速進行,只有少量訪問Cache不命中的訪存操作才訪問內(nèi)存。Cache是內(nèi)存的映像,其內(nèi)容是內(nèi)存內(nèi)容的子集,處理器訪問Cache和訪問內(nèi)存使用相同的地址。從20世紀(jì)80年代開始,RISC處理器就開始在處理器芯片內(nèi)集成KB級的小容量Cache?,F(xiàn)代處理器則普遍在片內(nèi)集成多級Cache,典型的多核處理器每個處理器核的一級指令和數(shù)據(jù)Cache各幾十KB,二級Cache為幾百KB,而多核共享的三級Cache為幾MB到幾十MB。
Cache技術(shù)和指令流水線技術(shù)相得益彰。訪問處理器片外內(nèi)存的長延遲使流水線很難發(fā)揮作用,使用片內(nèi)Cache可以有效降低流水線的訪存時間,提高流水線效率。Cache容量越大,則流水線效率越高,處理器性能越高。
轉(zhuǎn)移預(yù)測技術(shù)。馮·諾依曼結(jié)構(gòu)指令驅(qū)動執(zhí)行的特點使轉(zhuǎn)移指令成為提高流水線效率的瓶頸。典型應(yīng)用程序平均每5~10條指令中就有一條轉(zhuǎn)移指令,而轉(zhuǎn)移指令的后續(xù)指令需要等待轉(zhuǎn)移指令執(zhí)行結(jié)果確定后才能取指,導(dǎo)致轉(zhuǎn)移指令和后續(xù)指令之間不能重疊執(zhí)行,降低了流水線效率。隨著主頻的提高,現(xiàn)代處理器流水線普遍在10~20級之間,由于轉(zhuǎn)移指令引起的流水線阻塞成為提高指令流水線效率的重要瓶頸。
轉(zhuǎn)移預(yù)測技術(shù)可以消除轉(zhuǎn)移指令引起的指令流水線阻塞。轉(zhuǎn)移預(yù)測器根據(jù)當(dāng)前轉(zhuǎn)移指令或其他轉(zhuǎn)移指令的歷史行為,在轉(zhuǎn)移指令的取指或譯碼階段預(yù)測該轉(zhuǎn)移指令的跳轉(zhuǎn)方向和目標(biāo)地址并進行后續(xù)指令的取指。轉(zhuǎn)移指令執(zhí)行后,根據(jù)已經(jīng)確定的跳轉(zhuǎn)方向和目標(biāo)地址對預(yù)測結(jié)果進行修正。如果發(fā)生轉(zhuǎn)移預(yù)測錯誤,還需要取消指令流水線中的后續(xù)指令。為了提高預(yù)測精度并降低預(yù)測錯誤時的流水線開銷,現(xiàn)代高性能處理器采用了復(fù)雜的轉(zhuǎn)移預(yù)測器。
亂序執(zhí)行技術(shù)。如果指令i是條長延遲指令,如除法指令或Cache不命中的訪存指令,那么在順序指令流水線中指令i后面的指令需要在流水線中等待很長時間。亂序執(zhí)行技術(shù)通過指令動態(tài)調(diào)度允許指令i后面的源操作數(shù)準(zhǔn)備好的指令越過指令i執(zhí)行(需要使用指令i的運算結(jié)果的指令由于源操作數(shù)沒有準(zhǔn)備好,不會越過指令i執(zhí)行),以提高指令流水線效率。為此,在指令譯碼之后的讀寄存器階段,判斷指令需要的操作數(shù)是否準(zhǔn)備好。如果操作數(shù)已經(jīng)準(zhǔn)備好,就進入執(zhí)行階段;如果操作數(shù)沒有準(zhǔn)備好,就進入稱為保留站或者發(fā)射隊列的隊列中等待,直到操作數(shù)準(zhǔn)備好后再進入執(zhí)行階段。為了保證執(zhí)行結(jié)果符合程序規(guī)定的要求,亂序執(zhí)行的指令需要有序結(jié)束。為此,執(zhí)行完的指令均進入一個稱為重排序緩沖(Re-Order Buffer,簡稱ROB)的隊列,并把執(zhí)行結(jié)果臨時寫入重命名寄存器。ROB根據(jù)指令進入流水線的次序有序提交指令的執(zhí)行結(jié)果到目標(biāo)寄存器或存儲器。CDC6600和IBM 360/91分別使用記分板和保留站最早實現(xiàn)了指令的動態(tài)調(diào)度。
重命名寄存器與指令訪問的結(jié)構(gòu)寄存器相對應(yīng)。為了避免多條指令訪問同一個結(jié)構(gòu)寄存器而使該寄存器成為串行化瓶頸,指令流水線可以把對該結(jié)構(gòu)寄存器的訪問定向到重命名寄存器。亂序執(zhí)行流水線把指令執(zhí)行結(jié)果寫入重命名寄存器而不是結(jié)構(gòu)寄存器,以避免破壞結(jié)構(gòu)寄存器的內(nèi)容,到順序提交階段再把重命名寄存器內(nèi)容寫入結(jié)構(gòu)寄存器。兩組執(zhí)行不同運算但使用同一結(jié)構(gòu)寄存器的指令可以使用不同的重命名寄存器,從而實現(xiàn)并行執(zhí)行。
超標(biāo)量。工藝技術(shù)的發(fā)展使得在20世紀(jì)80年代后期出現(xiàn)了超標(biāo)量處理器。超標(biāo)量結(jié)構(gòu)允許指令流水線的每一階段同時處理多條指令。例如Alpha 21264處理器每拍可以取4條指令、發(fā)射6條指令、寫回6條指令、提交11條指令。如果把單發(fā)射結(jié)構(gòu)比作單車道馬路,多發(fā)射結(jié)構(gòu)就是多車道馬路。
由于超標(biāo)量結(jié)構(gòu)的指令和數(shù)據(jù)通路都變寬了,使得寄存器端口、保留站端口、ROB端口、功能部件數(shù)都需要增加,例如Alpha 21264的寄存器堆有8個讀端口和6個寫端口,數(shù)據(jù)Cache的RAM通過倍頻支持一拍兩次訪問?,F(xiàn)代超標(biāo)量處理器一般包含兩個以上訪存部件、兩個以上定點運算部件以及兩個以上浮點運算部件。超標(biāo)量結(jié)構(gòu)在指令譯碼或寄存器重命名時不僅要判斷前后拍指令的數(shù)據(jù)相關(guān),還需要判斷同一拍中多條指令間的數(shù)據(jù)相關(guān)。
05
并行體系結(jié)構(gòu)
并行體系結(jié)構(gòu)是并行計算機系統(tǒng)的組織結(jié)構(gòu),通過把任務(wù)劃分為多個進程或線程,讓不同的處理器并行運行不同的進程或線程來提高性能。此外,隨著處理器訪存延遲的增加,Cache失效導(dǎo)致流水線長時間堵塞,處理器可以在一個線程等待長時間訪存時快速切換到另一個線程執(zhí)行以提高流水線效率。
多進程并行存在于多個操作系統(tǒng)之間或一個操作系統(tǒng)之內(nèi)。用于高性能計算的MPI并行程序以及機群數(shù)據(jù)庫是存在于多個操作系統(tǒng)之間的多進程并行的典型應(yīng)用;由操作系統(tǒng)調(diào)度的多道程序則是操作系統(tǒng)之內(nèi)多進程并行的典型應(yīng)用。多線程并行只存在于一個操作系統(tǒng)之內(nèi)。線程的粒度比進程小,線程的上下文也比進程簡單。傳統(tǒng)的多線程切換由操作系統(tǒng)調(diào)度并保留上下文,現(xiàn)代處理器通過硬件實現(xiàn)多份線程上下文來支持單周期的多線程切換。同時多線程(Simultaneous Multi-Threading,簡稱SMT)技術(shù)甚至允許超標(biāo)量指令流水線的同一流水級同時運行來自不同線程的指令?,F(xiàn)代處理器還通過硬件實現(xiàn)多份操作系統(tǒng)上下文來支持多個操作系統(tǒng)的快速切換,從而提高云計算虛擬機的效率。
并行處理結(jié)構(gòu)普遍存在于傳統(tǒng)的大型機、服務(wù)器和高端工作站中。包含2~8個CPU芯片的小規(guī)模并行服務(wù)器和工作站一直是事務(wù)處理市場的主流產(chǎn)品;包含16~1024個CPU芯片的大型計算機在大型企業(yè)的信息系統(tǒng)中比較普遍;用于科學(xué)和工程計算的高性能計算機則往往包含上萬個CPU芯片。隨著集成電路集成度的不斷提高,把多個CPU集成在單個芯片內(nèi)部的多核CPU逐漸成為主流的CPU芯片產(chǎn)品。多核CPU芯片最早出現(xiàn)在嵌入式領(lǐng)域,把多個比較簡單的CPU集成在一個芯片上。2005年的個人計算機CPU芯片開始集成兩個CPU核?,F(xiàn)在的市場主流個人計算機CPU芯片一般集成2~4個CPU核,服務(wù)器CPU芯片則集成8~32個CPU核,專用處理器如GPU則集成幾百到上千個CPU核。
并行處理系統(tǒng)通過互連網(wǎng)絡(luò)把多個處理器連接成一個整體。常見的互連網(wǎng)絡(luò)包括總線、交叉開關(guān)、環(huán)狀網(wǎng)絡(luò)、樹形網(wǎng)絡(luò)、二維或更多維網(wǎng)格等。并行系統(tǒng)的多個處理器之間需要同步機制來協(xié)同多處理器工作。常見的同步機制包括鎖(Lock)、柵欄(Barrier)以及事務(wù)內(nèi)存(Transaction Memory)等,計算機指令系統(tǒng)通常要設(shè)置專用的同步指令。
在共享存儲的并行處理系統(tǒng)中,同一個內(nèi)存單元(一般以Cache行為單位)在不同的處理器中有多個備份,需要通過存儲一致性模型(Memory Consistency Model)規(guī)定多個處理器訪問共享內(nèi)存的一致性標(biāo)準(zhǔn)。典型的存儲一致性模型包括順序一致性(Sequential Consistency)、處理器一致性(Processor Consistency)、弱一致性(Weak Consistency)、釋放一致性(Release Consistency)等。高速緩存一致性協(xié)議(Cache Coherence Protocol)把一個處理器新寫的值傳播給其他處理器,以達(dá)到存儲一致性的目的。在偵聽協(xié)議(Snoopy Protocol)中,寫共享單元的處理器把寫信息通過廣播告知其他處理器;在基于目錄的協(xié)議(Directory-based Protocol)中,每個存儲單元對應(yīng)一個目錄項記錄擁有該存儲單元的副本的那些處理器號,寫共享單元的處理器根據(jù)目錄項的記錄把寫信息告知其他處理器。
6.體系結(jié)構(gòu)的設(shè)計目標(biāo)和方法
體系結(jié)構(gòu)設(shè)計的主要指標(biāo)包括性能、價格和功耗,其他指標(biāo)包括安全性、可靠性、使用壽命等。體系結(jié)構(gòu)設(shè)計的主要目標(biāo)經(jīng)歷了大型機時代一味追求性能(Performance per Second),到個人計算機時代追求性能價格比(Performance per Dollar),再到移動互聯(lián)時代追求性能功耗比(Performance per Watt)的轉(zhuǎn)變。性能是計算機體系結(jié)構(gòu)的首要設(shè)計目標(biāo)。
性能的最本質(zhì)定義是“完成一個或多個任務(wù)所需要的時間”。完成一個任務(wù)所需要的時間由完成該任務(wù)需要的指令數(shù)、完成每條指令需要的拍數(shù)以及每拍需要的時間三個量相乘得到。完成任務(wù)需要的指令數(shù)與算法、編譯器和指令的功能有關(guān);每條指令執(zhí)行拍數(shù)(Cycles Per Instruction,簡稱CPI)或每拍執(zhí)行指令數(shù)(Instructions Per Cycle,簡稱IPC)與編譯、指令功能、微結(jié)構(gòu)設(shè)計相關(guān);每拍需要的時間,也就是時鐘周期,與微結(jié)構(gòu)、電路設(shè)計、工藝等因素有關(guān)。
為了滿足應(yīng)用需求并不斷提高性能,計算機體系結(jié)構(gòu)在發(fā)展過程中遵循一些基本原則和方法,包括平衡性、局部性、并行性和虛擬化。
結(jié)構(gòu)設(shè)計的第一個方法就是平衡設(shè)計。計算機是個復(fù)雜系統(tǒng),影響性能的因素很多。結(jié)構(gòu)設(shè)計要統(tǒng)籌兼顧,使各種影響性能的因素達(dá)到均衡。通用CPU設(shè)計有一個關(guān)于計算性能和訪存帶寬平衡的經(jīng)驗法則,即峰值浮點運算速度(MFLOPS)和峰值訪存帶寬(MB/s)為1∶1左右。計算機體系結(jié)構(gòu)中有一個著名的阿姆達(dá)爾(Amdahl)定律。該定律指出通過使用某種較快的執(zhí)行方式所獲得的性能提高,受限于不可使用這種方式提高性能的執(zhí)行時間所占總執(zhí)行時間的百分比,例如一個程序的并行加速比,最終受限于不能被并行化的串行部分。
結(jié)構(gòu)設(shè)計的第二個方法是利用局部性。當(dāng)結(jié)構(gòu)設(shè)計基本平衡以后,性能優(yōu)化要抓主要矛盾,重點改進最頻繁發(fā)生事件的執(zhí)行效率。結(jié)構(gòu)設(shè)計經(jīng)常利用局部性加快經(jīng)常性事件的速度。RISC指令系統(tǒng)利用指令的事件局部性對頻繁發(fā)生的指令進行重點優(yōu)化。硬件轉(zhuǎn)移預(yù)測利用轉(zhuǎn)移指令跳轉(zhuǎn)方向的局部性,即同一條轉(zhuǎn)移指令在執(zhí)行時經(jīng)常往同一個方向跳轉(zhuǎn)。Cache和預(yù)取利用訪存的時間和空間局部性優(yōu)化性能。
結(jié)構(gòu)設(shè)計的第三個方法是開發(fā)并行性。計算機中可以開發(fā)三種層次的并行性。第一個層次的并行性是指令級并行,包括時間并行即指令流水線,以及空間并行即超標(biāo)量技術(shù)。20世紀(jì)80年代RISC出現(xiàn)后,指令級并行開發(fā)達(dá)到了一個頂峰,2010年后進一步挖掘指令級并行的空間已經(jīng)不大。第二個層次的并行性是數(shù)據(jù)級并行,主要指單指令流多數(shù)據(jù)流(Single Instruction Multiple Data,簡稱SIMD)的向量結(jié)構(gòu)。20世紀(jì)七八十年代以Cray為代表的向量機十分流行;現(xiàn)代通用CPU普遍支持短向量運算,如X86的AVX指令支持256位短向量運算。第三個層次的并行性是任務(wù)級并行,包括進程級和線程級并行。上述三種并行性在現(xiàn)代計算機中都存在,多核CPU運行線程級或進程級并行的程序,每個核采用超標(biāo)量流水線結(jié)構(gòu),并支持SIMD向量指令。
結(jié)構(gòu)設(shè)計的第四個方法是虛擬化。所謂虛擬化,就是“用起來是這樣的,實際上是那樣的”,或者“邏輯上是這樣的,物理上是那樣的”。結(jié)構(gòu)設(shè)計者寧愿自己多費事,也要盡量為用戶提供一個友好的使用界面。如虛擬存儲為每個進程提供獨立的存儲空間,虛實地址轉(zhuǎn)換和物理內(nèi)存分配都由CPU和操作系統(tǒng)自動完成,大大解放了程序員的生產(chǎn)力。多線程和虛擬機技術(shù)通過硬件支持多個線程上下文或操作系統(tǒng)上下文的快速切換,在一個CPU上“同時”運行多個線程或操作系統(tǒng),把單個CPU虛擬成多個CPU。此外,流水線和多發(fā)射技術(shù)在維持串行編程模型的情況下提高了速度;Cache技術(shù)使程序員看到一個像Cache那么快,像內(nèi)存那么大的存儲空間;Cache一致性協(xié)議在分布式存儲的情況下給程序員提供一個統(tǒng)一的存儲空間。這些都是虛擬化方法的體現(xiàn)。
審核編輯 :李倩
-
計算機
+關(guān)注
關(guān)注
19文章
7721瀏覽量
92257 -
微處理器
+關(guān)注
關(guān)注
11文章
2405瀏覽量
84956 -
模擬器
+關(guān)注
關(guān)注
2文章
969瀏覽量
45158
原文標(biāo)題:一文帶你掌握計算機體系結(jié)構(gòu)核心內(nèi)容
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
多核時代計算機體系結(jié)構(gòu)面臨重新設(shè)計
計算機體系結(jié)構(gòu)是由哪些部分組成的?可劃分哪幾個層次?
視頻教程-《計算機體系結(jié)構(gòu) 硬件篇2》之 計算機通信-嵌入式 精選資料分享
計算機體系結(jié)構(gòu)的硬件存儲器簡單介紹
馮·諾依曼計算機體系結(jié)構(gòu)缺陷有哪些?
計算機體系結(jié)構(gòu)的相關(guān)資料推薦
馮諾依曼計算機體系結(jié)構(gòu)是怎樣組成的
計算機體系結(jié)構(gòu)的發(fā)展及技術(shù)問題探討
有關(guān)計算機體系結(jié)構(gòu)的思考匯總
計算機體系結(jié)構(gòu)_量化研究方法(中文第三版)
本源量子受邀參加2022中國計算機大會量子計算機體系結(jié)構(gòu)論壇

《RVfpga:理解計算機體系結(jié)構(gòu)》3.0 版本更新上線

智能化的計算機體系結(jié)構(gòu)設(shè)計方案

評論