超标量处理器设计 姚永斌 前言 摘录
目前的通用處理器從指令集方面可分為RISC和CISC。CISC伴隨著處理器的誕生,最開始的處理器都是使用這種指令集,力求在一條指令內完成很多事情,并且使用盡可能多的指令,覆蓋到各種各樣的操作,這就可以降低對存儲器的需求,并且簡化編譯器的設計。
當存儲器和編譯器不在是問題時,RISC產生了。因為80%的CISC指令只在20%被使用,則可以將經常使用的20%的CISC指令使用硬件來實現,剩余80%的指令可以使用軟件來模擬,于是簡化硬件的設計,也便于使用流水線。
不像可以變化長度的CISC指令,RISC指令采用32位等長方法。如此可以降低解碼難度,易于流水線的設計。使得RISC指令集有著更高的頻率,同時功耗和成本相對也更低。
標量處理器是指:每周期最多只能執行一條指令,它一般都是按照程旭中指定的順序來執行指令,這稱為順序執行(in-order)。這制約了處理器性能的提高。
超標量處理器:一個周期執行多條指令。處理器可以按照程旭中指定的順序來執行,也可以不遵守這個順序。只要指令的源操作數都準備好了,它就可以被執行,被稱為亂序執行(out-of-order)。當然有一些方法使這些亂序執行的指令看起來仍然按照程序中指定的順序更改處理器的狀態,在超標量處理器中的這些功能注定了它的復雜性,以及更多的硬件資源和更高的功耗,目的就是性能提升。
上述的CISC和RISC、以及scalar和superscalar是相互正交的。產生四種組合:
Scalar CISC:處理器最開始的時候采用的結構,這種結構一般會直接對CISC指令進行解碼,甚至可能不使用流水線,目前已逐漸淘汰。
Scalar RISC:這是RISC處理器剛剛出現的時候采用的結構。由于RISC指令級降低了對硬件的要求,并且便于流水線的實現,所以此結構處理器多使用流水線來提高性能,它的主頻一般比較高,成本也低。嵌入式低功耗領域的處理器均采用這種結構。
Supercalar RISC:隨著對處理器性能需求越來越高,每周期執行一條指令的處理器已經不能滿足需求了。為什么首先出現在RISC處理器呢?因為RISC指令級比較規整,便于硬件實現。主要服務于嵌入式的高性能應用領域。
Superscalar CISC:盡管CISC并不容易使用流水線來實現,更難直接使用超標量結構來實現,但是Intel和AMD在處理器內部使用硬件將一條CISC的指令轉換為RISC指令,這樣充分使用了RISC指令集的優勢。當然,比普通的RISC處理器要付出更多的硬件資源,功耗也會偏大。
在上述4種結構中,本文重點關注Superscalar RISC處理器設計。該處理器的流水線則貫穿本書的主線,一條指令從程序存儲器中取出來之后,需要經過流水線的各個階段,最后才能得到結果,并更新處理器的狀態。
本書內容按指令的軌跡來組織:
第1章:介紹普通處理器和超標量處理器的一些背景知識。
第2章: Cache,這是由于一般的指令都是從I-Cache中取出來并送到流水線中,因此流水線始于I-Cache。當然,處理器也存在D-Cache。不同結構的Cache對處理器的性能有著重要的影響,尤其在超標量處理器中,每周期需要同時執行多條指令,這給Cache的設計帶來一些挑戰。
第3章:虛擬存儲器(Virtual Memory),因為處理器在取指令的時候,如果送出來的是虛擬地址,那么首先需要轉化為物理地址,然后才能取到指令,對數據的訪問也是類似的,虛擬存儲器是現代操作系統運行的基礎,在處理器中需要軟硬件配合工作,才可以對虛擬存儲器提供完整的支持。
第4章:分支預測(Branch Prediction),也是取指令階段發生的事情,因為超標量處理器的流水線一般比較深,導致分支指令的結果在很晚的時間才可以得到,一旦發現這個結果跟預想的不一樣,那么流水線中很多指令都是沒有用的,需要抹掉并從正確的地址取指令,這樣就降低了處理器的執行效率,因此需要對分支指令使用比較準確的預測算法,從而在取指令階段就得到可以提前知道分支指令的結果。
第5章:指令集體系(ISA),一旦指令在從存儲器中取出來之后,下一步就需要進行解碼,不同的指令集需要不同的解碼方式,因此本書在介紹指令的解碼之前,首先對基本的RISC指令集進行介紹這樣便于對后續流水線的理解。
第6章:指令解碼(Decode),在超標量處理器中,由于每周期需要對多條指令進行解碼,這會引入一些新的問題,比如指令之間的相關性,以及一些復雜指令的處理等,相比于普通的處理器,它的解碼過程要復雜一些,但是相比于超標量CISC處理器這種解碼過程仍然是比較簡單的。
第7章:硬件的寄存器重命名(Register Renaming),指令經過解碼之后,就可以得到它的源寄存器和目的寄存器了,但是為了盡量并行地執行指令,需要消除指令之間存在的假的相關性,這些相關性都是和寄存器的名字相關的,通過使用不同的寄存器名字,可以消除這些相關性,于是在處理器內部使用了數量多于指令級中定義的寄存器,稱之為物理寄存器,而指令集中定義的寄存器則稱為邏輯寄存器,寄存器重命名的過程就是將邏輯寄存器動態地映射到不同的物理寄存器,以消除指令之間存在的假的相關性,從而使這些指令可以并行執行。
第8章:指令發射(Issue),當指令經過寄存器重命名后,就可以在處理器內部的功能單元(FU)中執行了。但是為了獲得更高性能,超標量處理器多采用亂序執行的方式,只要一條指令的操作數準備好了,即使它之前的指令還沒有準備好,它也可以送到FU中執行,這種方式可以最大限度地利用處理器內部的硬件資源,從而提高處理器的執行效率,而發射階段正式用來實現此功能的。所有經過寄存器重命名的指令都會放到一個緩存中,這個緩存稱為發射隊列(Issue Queue),在其中檢測每條指令是否已經準備好了,并按照一定算法,從那些已經準備好的指令中選擇合適的指令送到FU中執行,這個過程就成為發射,指令到了這個階段,就變成亂序執行了。而在此階段之前,都遵循著程序中指定的順序。
第9章:指令在功能單元的執行(Execute),指令被發射之后,就會到相應的FU中開始執行,不同種類的指令需要不同的FU,在超標量處理器中,都會使用多個FU,它們可以并行地執行不同的指令。本章除了介紹常見的FU之外,還會介紹旁路網絡(Bypassing Network),它可以縮短相關指令之間執行的時間,但是卻使處理器內部的布線資源變得更復雜,因此現代的一些處理器采用了Cluster結構來緩解這種矛盾,同時,訪問存儲器的load/store指令也需要一些特殊的方法來加速它們的執行速度。
第10章:流水線最后階段:提交(Commit),指令經過FU的執行而得到結果后,并不會馬上使用這個結果對處理器轉態進行更新,這是由于指令的執行是按照亂序來進行的,由于分支預測失敗(mis-prediction)和異常(exception)等原因,一條指令的結果未必是正確的。而且,為了使程序在處理器內部的執行看起來和程序指定的順序是一樣的(這是串行程序必須的),也需要這些亂序執行的指令按照程序中指定的順序對處理器轉態進行更新。為了實現這個功能,一條指令在FU中執行完畢后,并不會馬上對處理器的狀態進行更新,而是先將它的結果寫到一個緩存中,這個緩存稱為重排序緩存(Reorder Buffer, ROB)。在流水線的寄存器重命名階段,每條指令都已經按照程序中指定的順序寫到ROB中,當一條指令在FU中執行完畢,就可以將結果寫到ROB對應的地方,當ROB中最舊的那條指令(或者幾條指令)已經得到結果,并且不存在分支預測失敗或者異常等特殊情況,它就可以離開ROB,使用它的結果對處理器的狀態進行更新,這個過程稱為指令的退休(retire),一旦指令經過這個狀態,它就在不能被撤銷了。
第11章:RISC處理器案例:Alpha 21264處理器。
總結
以上是生活随笔為你收集整理的超标量处理器设计 姚永斌 前言 摘录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: steamvr自定义按键_SteamVR
- 下一篇: 电气控制及可编程序控制器【1】