[轉載自: http://www.it.com.cn/f/diy/058/24/162683.htm]
什麼是CPU指令集?
CPU作為一台電腦中的核心,它的作用是無法替代的。而CPU本身只是在塊矽晶片上所整合的超大規模的整合電路,整合的晶體管數量可達到上億個,是由非常先進複雜的製造工藝製造出來的,擁有相當高的科技含量。然而如此一顆精密的晶片為什麼能夠控制一個龐大而複雜的電腦系統呢?這就是CPU中所整合的指令集。所謂指令集,就是CPU中用來計算和控制電腦系統的一套指令的集合,而每一種新型的CPU在設計時就規定了一系列與其他硬體電路相配合的指令系統。而指令集的先進與否,也關係到CPU的效能發揮,它也是CPU效能體現的一個重要標誌。
再強大的處理器也需要指令集的配合才行(圖片出自電影《機械公敵》)
CPU的指令集從主流的體繫結構上分為精簡指令集和複雜指令集,而在普通的電腦處理器基本上是使用的複雜指令集。在電腦早期的發展過程中,CPU中的指令集是沒有劃分類型的,而是都將各種程式需要相配合的指令整合到CPU中,但是隨著科技的進步,電腦的功能也越來越強大,電腦內部的元件也越來越多,而且越來越複雜,CPU的指令也相應的變得十分複雜,而在使用過程中,並不是每一條指令都要完全被執行,在技術人員的研究過程中發現,約有80%的程式只用到了20%的指令,而一些過於冗餘的指令嚴重影響到了電腦的工作效率,就這一現象,精簡指令集的概念就被提了出來。
精簡指令集RISC就是(Reduced Instruction Set Computing)的縮寫,而複雜指令集CISC則是(Complex Instruction Set Computing)的縮寫。它們之間的不同之處就在於RISC指令集的指令數目少,而且每條指令採用相同的位元組長度,一般長度為4個位元組,並且在字邊界上對齊,欄位位置固定,特別是作業碼的位置。而CISC指令集特點就是指令數目多而且複雜,每條指令的長度也不相等。在操作上,RISC指令集中大多數操作都是寄存器到寄存器之間的操作,只以簡單的Load(讀取)和Sotre(儲存)操作訪問記憶體位址。因此,每條指令中訪問的記憶體位址不會超過1個,指令訪問記憶體的操作不會與算術操作混在一起。在功能上,RISC指令集也要比複雜指令集具有優勢,精簡指令集可以大大簡化處理器的控制器和其他功能單元的設計,不必使用大量專用寄存器,特別是允許以硬體線路來實現指令操作,從而節約的處理器的製造成本。而採用CISC指令集的處理器是使用微程式來實現指令操作,在執行速度上不如RISC指令集。另外,RISC還加強了平行處理能力,非常適合於採用處理器的流水線、超流水線和超標量技術,從而實現指令級並行操作,提高處理器的效能。而且隨著VLSI(Very Large Scale Integration超大規模整合電路)技術的發展,整個處理器的核心甚至多個處理器核心都可以整合在一個晶片上。RISC指令集的體繫結構可以給設計單芯多核處理器帶來很多好處,有利於處理器的效能提高。
由於RISC指令集自身的優勢,在處理器的高端伺服器領域的處理器上得到了廣泛的運用,而CISC指令集主要運用案頭領域的處理器產品中,比如Intel的Pentium系列和AMD的K8系列處理器。然而現在RISC指令集也不斷地向案頭領域滲入,相信以後的處理器指令集會慢慢的向RISC體系靠攏,使得處理器的指令集結構更加完善,功能更為強大,技術也越來越成熟。
指令集的發展史
而說到指令集的發展,就不得提到目前主流處理器所採用的X86架構。所謂X86架構的處理器就是採用了Intel X86指令集的處理器,X86指令集是Intel公司為其第一塊16位處理器i8086所專門開發的。而IBM在1981年所推出的第一台PC機上所使用的處理器i8088(i8086的簡化版)也是使用的X86指令集,但是為了增加電腦的浮點運算能力,增加了X87數學協助處理器和加入了X87指令集,於是就將採用了X86指令集和X87指令集的處理器統稱為X86架構的處理器。
第一塊支援X86指令集的Intel i8086處理器
到目前為止,Intel公司所生產的大部分處理器都是屬於X86架構的處理器,包括像i80386、i80486和Pentium系列處理器等等。而Intel公司以外,AMD和Cyrix等廠商也在生產整合了X86指令集的處理器產品,而這些處理器都能夠與支援Intel處理器的軟體和硬體相相容,所以也就形成了今天龐大的X86架構的處理器陣容。
然而隨著處理器技術的發展,雖然處理器的主頻和製造工藝都有一定的進步,但是處理器的效能確不能非常明顯的提高,其中一個非常重要的原因就是受到了X86所採用的SISC指令集的限制。這一點Intel方面也非常清楚。而目前IA-32(Intel Architechure-32 英特爾32位體系架構)的X86系列處理器存在著一系列的問題,使得Intel方面已經打算放棄X86指令體系處理器的髮型,而將重點放在下一代的IA-64體系處理器和EPIC(Explicitly Parallel Instruction Computing)顯性並行指令方面。
X86架構處理器
首先,我們要知道,提高處理器每個時鐘頻率的指令執行數來提高處理器的效能,而這也是Intel開發新指令集的主要目的,這樣一來,處理器可以讓指令更容易解碼,並且更容易進行平行處理,這樣就可以不受指令集的限制來開發新型的處理器。而X86指令集的劣勢就在於它的限制過多。
第一、由於X86指令集是屬於CISC類型的指令集,其每條指令的長度是不固定的,而且有幾種不同的格式,這樣一來,就造成了X86處理器的解碼工作非常複雜。而為了提高處理器的工作頻率,就不得不延長處理器中的流水線,而過長的流水線在分支如果出現預測出錯的情況,又會帶來CPU工作停滯時間較長的弊端。
第二、X86指令採用了可訪問記憶體位址的方法,這樣的方法容易造成處理器與記憶體之間的不平衡工作,從而降低處理器的工作效率。而先進的RISC處理器則是使用Load/Store的儲存模式,其中只有Load和Store指令才能從記憶體中讀取資料到寄存器,所有其他指令只對寄存器中的運算元進行計算。
第三、X86構架處理器中的FPU(Floating Point Unit)浮點運算單元的運算能力較差,可以說現今市面上所有類型處理器中最慢的,其主要原因就是X86指令集中所使用的一個運算元堆棧。如果在運算過程中,沒有足夠的寄存器進行計算,系統就不得不使用堆棧來存放資料,這樣一來會浪費大量的時間來處理FXCH指令,就是將正確的資料放到堆棧的頂部。
第四、X86指令對於各種擴充組件的限制也是十分不利的。首先,X86架構的處理器對於4GB的記憶體容量上限制,雖然現在目前主流的個人電腦的記憶體大小為512MB和1GB,但是相信隨著作業系統和應用軟體的不斷提升,會快將會突破4GB的記憶體容量。另外,由於為了提高X86架構的處理器的效能,而出現像寄存器重新命名、緩衝器巨大、亂序執行、分支預測、X86指令轉化等等現象,都使得處理器的核心面積變得越來越大,這也限制了處理器工作頻率的進一步提升,此外,處理器所整合的這些龐大數目的晶體管都只是為瞭解決X86指令的問題,所以繼續採用X86架構必將會影響到處理器的發展。
而反觀IA-64體系,由於採用了RISC指令集,可由一個指令、兩個輸入寄存器和一個輸出寄存器組成,指令只對寄存器進行操作。並且具有多個不同的流水線或執行單元,能夠並存執行許多指令。在對指令的處理速度上要明顯優於CISC類型的IA-32體系。
而Intel的Merced(也就是現在Itanium安騰)處理器就是一塊採用IA-64體系的64位處理器。它擁有64位定址能力和64位位寬的寄存器,所以稱之為64位處理器。由於具有64位定址能力,Merced能夠使用1百萬TB(1TB=1024GB)的地址空間,足以運算企業級的資料任務,64位寬的寄存器可以使Merced 達到非常高的精度和運算速度。它所採用的EPIC指令可以使得處理器進行平行處理,在相同的刻度內,採用平行處理的指令執行數是普通CISC指令集的兩倍。此外,Merced可進行平行分支預測。在目前的普通的處理器中,分支預測的正確率可以達到90%~95%,雖然正確率已經相當高了,但如果預測出錯時,處理器就不得不清洗整條流水線,從而降低處理器的運算效率。10%的預測出錯率會讓處理器損失近30%的效能,而且如果流水線越長的情況下,效能損失就越嚴重。而Merced的所採用的預測機制,可以使分支都能進行並存執行,而且所花的招待時間與執行單個分支的時間是相同的。其次,處理器不會再冒預測出錯的風險。由於處理器不再進行跳躍執行,它不會把程式碼分成一個一個的小塊。而是將稍前和稍後的程式碼進行打包,然後一起將它們發布,加強了並行工作量。這些可以使採用EPIC指令的處理器避免普通處理器所出現的分支預測40%的出錯情況,從而使處理器的效能提高10%~15%,特別是在整數代碼部分。
Intel的Merced處理器
提升效能:擴充指令集
剛才上面提到了處理器中的擴充指令集,目前市面上Intel和AMD的案頭級處理器在X86指令集的基礎上,為了提升處理器各方面的效能,所以又各自開發新的指令集。指令集中包含了處理器對多媒體、3D處理等方面的支援,這些指令集能夠提高處理器對這某些方面處理器能力,但是需要有必要的軟體支援。
MMX指令集
MMX(Multi Media eXtension 多媒體擴充指令)指令集是Intel公司在1996年為旗下的Pentium系列處理器所開發的一項多媒體指令增強技術。MMX指令集中包括了57條多媒體指令,通過這些指令可以一次性處理多個資料,在處理結果超過實際處理能力的時候仍能夠進行正常處理,如果在軟體的配合下,可以得到更強的處理效能。使用MMX指令集的好處就是當時所使用的作業系統可以在不做任何改變的情況下執行MMX指令。但是,MMX指令集的問題也是比較明顯的,MMX指令集不能與X86的浮點運算指令同時執行,必須做密集式的交錯切換才可以正常執行,但是這樣一來,就會造成整個系統運行速度的下降。
支援MMX指令集的Intel Pentium MMX處理器
SSE指令集
SSE是Streaming SIMD Extension(SIMD擴充指令集)的縮寫,而其中SIMD的為含意為Single Istruction Multiple Data(單指令多資料),所以SSE指令集也叫單指令多資料流擴充。該指令集最先運用於Intel的Pentium III系列處理器,其實在Pentium III推出之前,Intel方面就已經泄漏過關於KNI(Katmai New Instruction)指令集的訊息。這個KNI指令集也就是SSE指令集的前身,當時也有不少的媒體將該指令集稱之為MMX2指令集,但是Intel方面卻從沒有發布有關MMX2指令集的訊息。
加入了SSE指令集的Pentium III處理器
最後在Intel推出Pentium III處理器的時候,SSE指令集也終於水落石出。SSE指令集是為提高處理器浮點效能而開發的擴充指令集,它共有70條指令,其中包含提高3D圖形運算效率的50條SIMD浮點運算指令、12條MMX 整數運算增強指令、8條最佳化記憶體中的連續資料區塊傳輸指令。理論上這些指令對當時流行的影像處理、浮點運算、3D運算、多媒體處理等眾多多媒體的應用能力起到全面提升的作用。SSE指令與AMD公司的3DNow!指令彼此互不相容,但SSE包含了3DNow!中的絕大部分功能,只是實現的方法不同而已。SSE也向下相容MMX指令,它可以通過SIMD和單刻度平行處理多個浮點數據來有效地提高浮點運算速度。
3DNow!指令集
3DNow!指令集最由AMD公司所推出的,該指令集應該是在SSE指令之前推出的,被廣泛運用於AMD的K6、K6-2和K7系列處理器上,擁有21條擴充指令集。在整體上3DNow!的SSE非常相相似,它們都擁有8個新的寄存器,但是3DNow!是64位的,而SSE是128位。所以3DNow!它只能儲存兩個浮點數據,而不是四個。但是它和SSE的側重點有所不同,3DNow!指令集主要針對三維建模、座標變換和效果渲染等3D資料的處理,在相應的軟體配合下,可以大幅度提高處理器的3D處理效能。AMD公司後來又在Athlon系列處理器上開發了新的Enhanced 3DNow!指令集,新的增強指令數達了52個,以致目前最為流行的Athlon 64系列處理器還是支援3DNow!指令的。
AMD K6、K7系列所使用的3DNow!指令集
SSE2指令集
在PentiumIII發布的時候,SSE指令集就已經整合在了處理器的內部,但因為各種原因一直沒有得到充分的發展。直到Pentium 4發布之後,開發人員看到使用SSE指令之後,程式執行效能將得到極大的提升,於是Intel又在SSE的基礎上推出了更先進的SSE2指令集。
SSE2包含了144條指令,由兩個部分組:SSE部分和MMX部分。SSE部分主要負責處理浮點數,而MMX部分則專門計算整數。SSE2的寄存器容量是MMX寄存器的兩倍,寄存器儲存資料也增加了兩倍。在指令處理速度保持不變的情況下,通過SSE2最佳化後的程式和軟體運行速度也能夠提高兩倍。由於SSE2指令集與MMX指令集相相容,因此被MMX最佳化過的程式很容易被SSE2再進行更深層次的最佳化,達到更好的運行效果。SSE2對於處理器的效能的提升是十分明顯的,雖然在同頻率的情況下,Pentium 4和效能不如Athlon XP,但由於Athlon XP不支援SSE2,所以經過SSE2最佳化後的程式Pentium 4的運行速度要明顯高於Athlon XP。而AMD方面也注意到了這一情況,在隨後的K-8系列處理器中,都加入SSE2指令集。
SSE2和SSE3指令集主要用於Pentium 4系列處理器上
SSE3指令集
SSE3指令是目前規模最小的指令集,它只有13條指令。它共劃分為五個應運層,分別為資料轉送命令、資料處理命令、特殊處理命令、最佳化命令、超執行緒效能增強五個部分,其中超執行緒效能增強是一種全新的指令集,它可以提升處理器的超執行緒的處理能力,大大簡化了超執行緒的資料處理過程,使處理器能夠更加快速的進行並行資料處理。
上面介紹的基本上就是Intel和AMD公司在X86架構處理器上主要的擴充指令集,雖然它們對於處理器的效能提升有著一定程度的協助,但是由於受到IA-32體系的限制,X86架構基本上不會再有具有革命性意義的指令集出現,而雙方都已經把重心轉向了64位體系架構的處理器指令集開發上。
未來:邁向64位體系
在現在的處理器市場上,64位技術已經開始普及起來,像AMD的Athlon 64處理器和Intel的Pentium 5XX/6XX處理器已經成為市場的主流。但是大家要值得主意的是,目前的案頭級64位處理器仍然還是基於X86架構之上,而不是IA-64架構。這裡的64位處理器是指的處理器的通用寄存器GPR(General-Purpose Registers)的資料寬度為64位。也就是說處理器可一次運算64 位元資料。使用64位技術運算有兩大優點:可以進行更大範圍的整數運算,還有就是可以支援更大容量的記憶體。但是要注意的是,不要看錶面64 位元是32位兩倍,就簡單的認為64位處理器的效能是32位處理器效能的兩倍。就在目前的32位主流平台下,32位的處理器在某些方面甚至要比64位處理器還要強,所以在32位作業系統和運用程式為主情況下,不要太過於迷信64位處理器。
64位處理器技術並不是Intel和AMD處理器上才有的。早在上個世紀90年代末,在高端的採用RISC指令集的處理器中就已經有了64位處理器,比如SUN公司的UltraSparc Ⅲ、IBM公司的Power5、HP公司的Alpha等處理器產品。現在市面上主流的64位技術主要是Intel的EM64T技術和AMD和AMD64技術。而這兩項技術都是基於IA-32體系,而真正的IA-64體繫上處理器目前只有Itanium(安騰)以及其後續產品,是Intel獨立開發的,它不相容現在32位電腦。
AMD64位技術
AMD的athlon 64系列處理器的64位技術是在X86指令集的基礎上加入了X86-64的64位擴充X86指令集,這就使得athlon 64系列處理器可相容原來的32位的X86軟體,並同時支援X86-64的擴充64位計算,並且具有64位的定址能力,使得它成為真正的64位X86構架處理器。在採用X86-64架構的Athlon 64處理器中,X86-64指令集中新增了幾組處理器寄存器,它能夠提供更加快速的執行效率。寄存器是處理器用來建立和儲存CPU運算結果和其他運算結果的地方,標準的X86構架中包括8組通用寄存器,而在AMD的X86-64架構中又增加了8組,將通過寄存器的數目提高到了16組。在這基礎之上,X86-64指令集還另外增加了8組128位的XMM寄存器,也叫做SSE寄存器。它能夠給單指令多資料流技術(SIMD)運算提供更多的儲存空間,這些128位的寄存器能夠提供在向量和標量計算模式下進行128位雙精確度處理,這也為3D資料處理、向量分析和虛擬技術提供了良好的硬體基礎。由於提供了更多的寄存器,按照X86-64標準生產的處理器可以更有效率的處理資料,在一個刻度內能夠傳輸更多的資訊。
採用X86-64架構的AMD Athlon 64處理器
EM64T技術
EM64T(Extended Memory 64 Technology)也就是Intel公司開發的64位記憶體擴充技術。它實際上就是Intel IA-32構架體系的擴充,既IA-32E(Intel Architectur-32 Extension)。Intel的IA-32處理器通過加入EM64T技術便可在相容IA-32軟體的情況下,允許軟體程式利用更多的記憶體位址空間,並且允許程式進行32 位線性地址寫入。Intel的EM64T所強調的是32位技術與64位技術的相容性,為採用EM64T的處理器增加了8個64位通用寄存器,並將原有的32位通用寄存器全部擴充為64位,這樣也提高了處理器的整數運算能力。另外增加的8個SEE寄存器也提供了對SSE、SSE2和SSE3指令的支援。
加入EM64T擴充技術的Pentium 5XX/6XX系列處理器
目前Intel的主流案頭處理器共有兩個模式,傳統的IA-32模式和IA-32E模式。在可支援EM64T指令的處理器內有一個擴充功能啟用寄存器(Extended Feature Enable Register),稱為IA-32_EFER的組件,它控制處理器的EM64T是否被啟用。在普通情況下,處理器會作為一顆標準的IA-32處理器,如果在運行64位的軟體或程式時,EM64T就會被啟用,那麼處理器便會在IA-32E擴充模式下運行。
總結:
到現在為至,Intel和AMD在案頭處理器市場的競爭愈發的激烈,而產品的效能與新技術的運用將會是兩家廠商取勝的要點之一。雖然Intel已經開始了IA-64體系架構的研發,而且已經運用到了高端的伺服器領域,但是要滲入到民用案頭市場相信還是需要相當長的時間才行。而IA-32構架的X86處理器產品在一段時間內仍然將是市面上的主流。但是受到了X86構架的限制,Intel和AMD也都會將重心放在擴充性和平行處理上,而不是一味的提高處理器的主頻。現在兩家的公司的雙核心處理器也都已經上市,所以其擴充指令集的開發相信也會是朝這個方向發展。雖然真正的64位體系構架才是處理器的方向,但是在這之前,X86構架仍然沒有走到盡頭,所以想要全面進行64位時代,Intel和AMD仍然還有很長的一段路要走。