有通用CPU和嵌入式CPU,通用CPU和嵌入式CPU的區別主要是根據應用模式的不同來劃分的。通用CPU芯片壹般功能強大,可以運行復雜的操作系統和大型應用軟件。嵌入式CPU具有廣泛的功能和性能。隨著集成度的提高,在嵌入式應用中,人們傾向於將CPU、存儲器和壹些外圍電路集成到壹個芯片上,形成所謂的系統芯片(簡稱SOC),SOC上的CPU成為CPU核心。
現在,教學系統的優化設計有兩個相反的方向。壹種是增強指令的功能,設置壹些功能復雜的指令,利用硬件的指令系統實現壹些原來由軟件實現的常用功能。這種計算機成為具有復雜指令系統的計算機。早期的Intel X86指令系統是CISC指令結構。
RISC是精簡指令集計算機(Reduced Instruction Set Computer)的縮寫,是20世紀80年代發展起來的。它盡可能地簡化了指令功能,只保留那些功能簡單可以壹拍執行的指令,比較復雜的功能由壹個子程序來實現。這個計算機系統成為壹個簡化指令系統計算機。目前,RISC架構處理器的芯片廠商有SUN、SGI、IBM的Power PC系列、DEC的Alpha系列、摩托羅拉的龍珠和Power PC等。
介紹MIPS系統。
MIPS是世界上非常流行的RISC處理器。MIPS的意思是“沒有互鎖流水線級的微處理器”,其機制是通過盡可能使用軟件來避免流水線中的數據相關問題。它最初是由斯坦福大學教授Hennessy領導的研究小組在20世紀80年代初開發的。MIPS公司的R系列就是在此基礎上開發的RISC工業產品的微處理器。這些系列產品被許多計算機公司用來組成各種工作站和計算機系統。
指令系統
要說CPU,首先要說指令系統。指令系統是指CPU能夠處理的所有指令。
命令集是CPU的基本屬性。比如我們現在用的CPU都是采用x86指令集,而且都是同壹類型的CPU,無論是PIII、速龍還是約書亞。我們也知道世界上有比PIII和Athlon快很多的CPU,比如Alpha,但是他們不使用x86指令集,不能使用大量基於x86指令集的程序,比如Windows98。之所以說指令系統是CPU的根本屬性,是因為指令系統決定了CPU能運行什麽程序。
所有用高級語言編寫的程序都需要翻譯(編譯或解釋)成機器語言才能運行。這些機器語言包含指令。
1,指令格式
壹條指令壹般包括兩部分:操作碼和地址碼。操作碼其實就是指令序列號,用來告訴CPU需要執行哪條指令。地址碼比較復雜,主要包括源操作數的地址、目的地址和下壹條指令的地址。在某些指令中,地址碼可以部分或全部省略,例如壹條空指令只有操作碼而沒有地址碼。
比如壹個指令系統的指令長度是32位,操作碼長度是8位,地址長度是8位,第壹條指令是加法,第二條指令是減法。當它收到“0000000100000001000000100000110”的指令時,首先取出它的前八個操作碼,即000000010,分析出這是壹條指令。然後CPU取出內存地址00000100的被減數,取出0000001的被減數,送到ALU做減法,然後把結果送到00000110。
這只是壹個相當簡單化的例子,實際情況要復雜得多。
2.指令的分類和尋址方式
壹般來說,當前的指令系統有以下類型的指令:
(1)算術邏輯運算指令
算術邏輯運算指令包括加、減、乘、除等算術運算指令和與或異或等邏輯運算指令。現在指令系統還增加了壹些十進制運算指令和字符串運算指令。
(2)浮點運算指令
用於對浮點數進行操作。浮點運算比整數運算復雜得多,所以CPU中通常有壹個浮點運算單元負責浮點運算。現在壹般在浮點指令中加入矢量指令,用來直接操作矩陣,對於多媒體和3D處理非常有用。
(3)位操作指令
學過C的人都應該知道,C語言中有壹套位操作語句,相應的,指令系統中也有壹套位操作指令,比如左移壹位,右移壹位。對於計算機中用二進制代碼表示的數據,這個操作非常簡單快捷。
(4)其他說明
以上三條都是操作指令,還有很多其他指令都是不可操作的。這些指令包括:數據傳輸指令、棧操作指令、轉移指令、輸入輸出指令和壹些特殊指令,如特權指令、多處理器控制指令和等待、關機、空操作等。
對於指令中的地址碼,會有很多不同的尋址方式,主要包括直接尋址、間接尋址、寄存器尋址、基址尋址、索引尋址等。壹些復雜的指令系統會有幾十種甚至更多的尋址模式。
3.CISC和RISC
CISC,復雜指令集計算機,復雜指令系統計算機。精簡指令集計算機,精簡指令系統計算機。雖然這兩個術語是針對計算機的,但是下面我們還是只研究指令集。
(1)CISC的產生、發展和現狀
壹開始,計算機的指令系統只有幾條基本指令,其他復雜指令都是在軟件編譯時通過簡單指令的組合來實現的。舉個最簡單的例子,a乘以b的壹個運算可以轉化為a和b的相加,所以不需要乘法指令。當然,最早的指令系統已經有乘法指令了。為什麽?因為用硬件實現乘法比加法合並快得多。
因為當時的計算機部件相當昂貴且速度慢,為了提高速度,越來越多的復雜指令被添加到指令系統中。然而,很快又出現了另壹個問題:壹個指令系統中的指令數量受到指令操作碼數量的限制。如果操作碼是8位,指令的最大數量是256 (2的8次方)。
那麽我們該怎麽辦呢?增加指令寬度很難,聰明的設計者想出了壹個方案:操作碼擴展。前面說過,操作碼後面是地址碼,有些指令不需要地址碼或者只用少量地址碼。然後,您可以將操作碼擴展到這些位置。
舉個簡單的例子,如果壹個指令系統的操作碼是2位,那麽可以有四種不同的指令:00,01,10,11。現在保留11,操作碼擴展為4位,所以可以有00,01,1100,1101,65438。包括1100,1101,1110,111。
然後,為了實現操作碼擴展的前提:減少地址碼,設計者們開動腦筋,發明了基址尋址、相對尋址等各種尋址方式,最大限度地壓縮地址碼長度,給操作碼留出空間。
就這樣,慢慢地,CISC指令系統誕生了。大量復雜的指令、可變的指令長度、多種尋址方式是CISC的特點,也是CISC的短板:因為這些都大大增加了解碼的難度,而且隨著高速硬件的發展,復雜指令帶來的速度提升早已小於在解碼上浪費時間。除了仍在個人電腦市場使用的x86指令集,CISC已不再用於服務器和更大的系統。x86之所以還存在,唯壹的原因就是為了兼容x86平臺上的大量軟件。
]:(2)RISC的產生、發展和現狀。
1975年,IBM的設計者約翰·科克研究了當時的IBM370CISC系統,發現只占指令總數20%的簡單指令卻占了程序調用的80%,而占指令80%的復雜指令只用了20%的時間。因此,他提出了RISC的概念。
事實證明RISC是成功的。80年代末,各公司的RISC CPU如雨後春筍般出現,占領了大量市場。90年代,奔騰、k5等x86 CPUs也開始使用先進的RISC內核。
RISC的特點是指令長度固定,指令格式少,尋址方式少。其中大多數是簡單的指令,可以在壹個時鐘周期內完成。超標量和流水線很容易設計,寄存器數量多,寄存器之間的運算量大。因為下面提到的CPU核大部分都是關於RISC核的,所以這裏就不介紹了,我來詳細說說RISC核的設計。
RISC現在發展的如火如荼,英特爾的安騰最終也會拋棄x86,轉向RISC架構。
二、CPU內核結構
好了,我們來看CPU。CPU核心主要分為兩部分:運算器和控制器。
(1)算術單元
1,算術邏輯單元(ALU)
ALU主要完成對二進制數據的定點算術運算(加減乘除)、邏輯運算(與或非異或)和移位運算。在某些CPU中,還有專門處理移位操作的移位器。
通常ALU由兩個輸入和壹個輸出組成。整數單元有時被稱為IEU(整數執行單元)。我們通常所說的“CPU是XX位”是指ALU能夠處理的數據位數。
2.浮點單元
FPU主要負責浮點運算和高精度整數運算。有些fpu也有向量運算的功能,有些則有專門的向量處理單元。
3.通用寄存器組
通用寄存器組是壹組速度最快的存儲器,用於存儲參與運算的操作數和中間結果。
RISC與CISC在通用寄存器的設計上有很大的不同。CISC通常寄存器很少,這主要是受當時硬件成本的限制。例如,x86指令集只有八個通用寄存器。因此,CISC的CPU執行大部分時間是訪問內存中的數據,而不是寄存器中的數據。這會降低整個系統的速度。RISC系統往往有很多通用寄存器,使用重疊的寄存器窗口和寄存器文件來充分利用寄存器資源。
針對x86指令集只支持8個通用寄存器的缺點,Intel和AMD的最新CPU都采用了壹種叫做“寄存器重命名”的技術,使得x86CPU突破了8個寄存器的限制,達到了32個甚至更多。但是,與RISC相比,該技術的寄存器操作需要多壹個時鐘周期來重命名寄存器。
4.專用寄存器
專用寄存器通常是壹些狀態寄存器,不能被程序改變,由CPU自己控制,表示某種狀態。
(2)控制器
運算器只能完成運算,而控制器用來控制整個CPU。
1,指令控制器
指令控制器是控制器中非常重要的壹部分。它需要取出並分析指令,然後交給執行單元(ALU或FPU)執行。同時還需要形成下壹條指令的地址。
2.定時器
時序控制器的作用是為時序中的每條指令提供控制信號。時序控制器包括時鐘發生器和倍頻定義單元,時鐘發生器通過石英晶體振蕩器發出非常穩定的脈沖信號,該脈沖信號是CPU的主頻;倍頻定義單元定義CPU的主頻是內存主頻(總線頻率)的幾倍。
3.總線控制器
總線控制器主要用於控制CPU的內部和外部總線,包括地址總線、數據總線、控制總線等。
4.中斷控制器
中斷控制器用於控制各種中斷請求,並將中斷請求按優先級排隊,交給CPU逐壹處理。
(CPU內核的設計
是什麽決定了CPU的性能?單個ALU的速度在壹個CPU中起不到決定性的作用,因為ALU的速度都差不多。CPU性能的決定性因素在於CPU內核的設計。
1,超標量
既然ALU的速度無法大幅提升,有什麽替代方法?並行處理的方法再次發揮了強大的作用。所謂超標量CPU,就是只集成多個alu、多個fpu、多個譯碼器和多個流水線,通過並行處理來提高性能的CPU。
超標技術應該很好理解,但是有壹點需要註意,就是不要關註“超標”前的數字,比如“9路超標”。不同的廠商對這個數字有不同的定義,更多的它只是壹種商業宣傳手段。
2.管道
流水線是現代RISC核的重要設計,它極大地提高了性能。
對於壹個特定的指令執行過程,通常可以分為五個部分:取指令、指令解碼、取操作數、運算(ALU)、結果寫入。前三步壹般由指令控制器完成,後兩步由運算器完成。按照傳統的方式,所有指令都是按順序執行的,所以首先指令控制器工作完成第壹條指令的前三步,然後運算器工作完成後兩步,然後指令控制器工作完成第二條指令的前三步,現在運算器完成第二條指令的後兩部分...很明顯,指令控制器工作的時候,運算器基本都在休息,但是運算器工作的時候,指令控制器在休息,造成了相當大的資源浪費。解決辦法很容易想到。當指令控制器完成第壹條指令的前三步時,它將直接開始第二條指令的操作,算術單元也是如此。這樣就形成了壹個管道系統,就是兩級管道。
如果是超標量體系,假設有三個指令控制單元和兩個運算器,那麽第壹條指令的地址完成後,可以直接開始第二條指令的地址。這時第壹條指令是解碼,然後第三條指令是尋址,第二條指令是解碼,第壹條指令帶操作數...這是五級水線。顯然,5級流水線的平均理論速度是無流水線的4倍。
流水線系統最大限度的利用了CPU資源,使得每個部件都在每個時鐘周期工作,大大提高了效率。然而,管道有兩個非常大的問題:相關性和傳輸。
在流水線系統中,如果第二條指令需要第壹條指令的結果,這種情況稱為相關性。以上面的五級管道為例。當第二條指令需要取操作數時,第壹條指令的操作還沒有完成。如果此時第二條指令取出操作數,將會得到錯誤的結果。所以,這個時候,整個流水線不得不停下來,等待第壹條指令的完成。這是壹個很煩人的問題,尤其是對於壹個很長的流水線,比如20級,這個暫停通常會損失十幾個時鐘周期。目前解決這個問題的方法是亂序執行。亂序執行的原理是將不相關的指令插入到兩條相關的指令中,使整個流水線順暢。比如上面的例子,第壹條指令執行完之後直接開始執行第三條指令(假設第三條指令無關),然後開始執行第二條指令,這樣當第二條指令需要取操作數的時候,第壹條指令剛剛結束,第三條指令快結束了,整個流水線也不會停止。然而,流水線阻塞是不能完全避免的,尤其是當有許多相關指令時。
另壹個大問題是有條件轉移。在上面的例子中,如果第壹條指令是條件分支指令,那麽系統將不知道接下來應該執行哪條指令?這時,妳必須等待第壹條指令的判斷結果,才能執行第二條指令。條件轉移導致的流水線停頓甚至比相關性更嚴重。因此,現在使用分支預測技術來處理轉移問題。盡管我們的程序充滿了分支,而且任何分支都是可能的,但在大多數情況下,我們總是選擇壹個分支。例如,在循環的末端有壹個分支。除了最後壹次需要跳出循環,我們總是選擇繼續循環。根據這些原理,分支預測技術可以在得到結果並執行之前預測下壹條指令是什麽。現在的分支預測技術可以達到90%以上的準確率,但是壹旦預測錯誤,CPU還是要清理整個流水線,回到分支點。這樣會損失很多時鐘周期。因此,進壹步提高分支預測的準確性也是正在研究的課題。
流水線越長,關聯和轉移這兩個問題就越嚴重。所以流水線越長越好,多余的數量越多。找到速度和效率的平衡點才是最重要的。
1,解碼單元
這是x86CPU獨有的東西,它的作用是把不定長的x86指令轉換成類RISC的定長指令,交給RISC內核。解碼可以分為硬件解碼和微解碼。對於簡單的x86指令,硬件解碼就夠了,速度更快,而對於復雜的x86指令,需要進行微解碼,並分成幾個簡單的指令,速度慢且復雜。幸運的是,這些復雜的指令很少使用。
Athlon、PIII和舊的CISC x86指令集嚴重限制了他們的性能。
2.壹級緩存和二級緩存
而緩存和二級緩存就是為了緩解更快的CPU和更慢的內存之間的矛盾而產生的,緩存通常集成在CPU內核中,而二級緩存以OnDie或板載的方式運行速度比內存快。對於壹些數據交換量大的作業,CPU緩存尤為重要。