指令集簡介
指令集或指令集體系:是計算機體系結構中與程式設計有關的部分,包含了基本資料型別、指令集、暫存器、定址模式、中斷、異常處理以及外部的I/O。指令集架構包含一系列的opcode即操作碼(機器語言),以及由特定處理器執行的基本命令。
指令集的分類:(1)、複雜指令集計算機包含許多應用程式中很少使用的特定指令;(2)、精簡指令集計算機通過只執行在程式中經常使用的指令來簡化處理器的結構,而特殊操作則以子程式的方式實現,它們的特殊使用通過處理器額外的執行時間來彌補。理論上的重要型別還包括最小指令集計算機與單指令集計算機,但都未用作商業處理器。另外一種衍生型別是超長指令字,處理器接受許多經過編碼的指令並通過檢索提取出一個指令字並執行。
機器語言:是由宣告和指令所組成的。在處理結構上,一個特定指令指明瞭以下幾個部分:(1)、用於算術運算,定址或者控制功能的特定暫存器;(2)、特定儲存空間的地址或偏移量;(3)、用於解譯操作碼的特定定址模式。
指令型別:有效的指令操作須包含,(1)、資料處理與儲存操作:將暫存器的值(在中央處理器作為快取記憶體的儲存空間)設為固定值;將資料從儲存空間中傳送至暫存器,反之亦然。用於將資料取出並執行計算,或者將計算結果予以儲存;從硬體裝置讀取或寫入資料。(2)、算術邏輯單元:對兩個儲存於暫存器的數字進行add、subtract、multiply、divide,將結果放到一個暫存器內,一個或是更多的
複雜指令:一些電腦在他們的指令集架構內包含複雜指令。複雜指令包含:(1)、將許多暫存器存成堆疊的形式;(2)、移動記憶體內大筆的資料;(3)、複雜或是浮點數運算(
指令的組成:在傳統的架構上,一條指令包含opcode,表示運算的方式,以及零個或是更多的運算元,有些像是運算元的數字可能指的是暫存器的編號,還有記憶體位置,或是文字資料。在超長指令字(VLIW)的結構中,包含了許多微指令,藉此將複雜的指令分解為簡單的指令。
指令的長度:指令長度的範圍可以說是相當廣泛,從微控制器的4bit,到VLIW系統的數百bit。在個人電腦,大型電腦,超級電腦內的處理器,其內部的指令長度介於8到64 bits(在x86處理器結構內,最長的指令長達15 bytes,等於120 bits)。在一個指令集架構內,不同的指令可能會有不同長度。在一些結構,特別是大部分的精簡指令集(RISC),指令是固定的長度,長度對應到結構內一個字的大小。在其他結構,長度則是byte的整數倍或是一個halfword。
電腦微處理器的指令集架構(Instruction SetArchitecture):(1)、複雜指令集運算(ComplexInstruction Set Computing,CISC):目前x86架構微處理器如Intel的Pentium/Celeron/Xeon與AMD的Athlon/Duron/Sempron;以及其64位擴充套件系統的x86-64架構的Intel 64的Intel Core/Core2/Pentium/Xeon與AMD64的Phenom II/Phenom/Athlon 64/Opteron都屬於CISC系列。主要針對的作業系統是微軟的Windows。另外Linux,一些UNIX等,都可以執行在x86(CISC)架構的微處理器。(2)、精簡指令集運算(ReducedInstruction Set Computing,RISC):RISC這種指令集運算包括HP的PA-RISC,IBM的PowerPC,Compaq(被併入HP)的Alpha,MIPS公司的MIPS,SUN公司的SPARC等。目前只有UNIX,Linux,MacOS等作業系統執行在RISC處理器上。(3)、顯式並行指令集運算(ExplicitlyParallel Instruction Computing,EPIC):EPIC乃先進的全新指令集運算,只有Intel的IA-64架構的純64位微處理器的Itanium/Itanium 2。EPIC指令集運算的IA-64架構主要針對的作業系統是微軟64位安騰版的Windows XP以及64位安騰版的WindowsServer 2003。另外一些64位的Linux,一些64位的UNIX也可以執行IA-64(EPIC)架構。(4)、超長指令字指令集運算(VLIW):通過將多條指令放入一個指令字,有效的提高了CPU各個計算功能部件的利用效率,提高了程式的效能。
精簡指令集:是計算機中央處理器的一種設計模式。這種設計思路對指令數目和定址方式都做了精簡,使其實現更容易,指令並行執程序度更好,編譯器的效率更高。目前常見的精簡指令集微處理器包括DEC Alpha、ARC、ARM、AVR、MIPS、PA-RISC、Power Architecture(包括PowerPC、PowerXCell)和SPARC等。
複雜指令集:是一種微處理器指令集架構,每個指令可執行若干低階操作,諸如從記憶體讀取、儲存、和計算操作,全部集於單一指令之中。與之相對的是精簡指令集。複雜指令集的特點是指令數目多而複雜,每條指令字長並不相等。屬於複雜指令集的處理器有CDC 6600、System/360、VAX、PDP-11、Motorola 68000家族、x86等。
CPU指令集:CPU依靠指令來計算和控制系統,每款CPU在設計時就規定了一系列與其硬體電路相配合的指令系統。指令的強弱也是CPU的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分為複雜指令集和精簡指令集兩部分,而從具體運用看,如Intel的MMX(MultiMediaExtended)、SSE、SSE2(Streaming-Singleinstructionmultipledata-Extensions2)和AMD的3DNow!等都是CPU的擴充套件指令集,分別增強了CPU的多媒體、圖形圖象和Internet等的處理能力。我們通常會把CPU的擴充套件指令集稱為"CPU的指令集"。
然而如此一顆精密的晶片為什麼能夠控制一個龐大而複雜的電腦系統呢?這就是CPU中所整合的指令集。所謂指令集,就是CPU中用來計算和控制計算機系統的一套指令的集合,而每一種新型的CPU在設計時就規定了一系列與其他硬體電路相配合的指令系統。而指令集的先進與否,也關係到CPU的效能發揮,它也是CPU效能體現的一個重要標誌。再強大的處理器也需要指令集的配合才行。
CPU的指令集從主流的體系結構上分為精簡指令集和複雜指令集,而在普通的計算機處理器基本上是使用的複雜指令集。在計算機早期的發展過程中,CPU中的指令集是沒有劃分型別的,而是都將各種程式需要相配合的指令整合到CPU中,但是隨著科技的進步,計算機的功能也越來越強大,計算機內部的元件也越來越多,而且越來越複雜,CPU的指令也相應的變得十分複雜,而在使用過程中,並不是每一條指令都要完全被執行,在技術人員的研究過程中發現,約有80%的程式只用到了20%的指令,而一些過於冗餘的指令嚴重影響到了計算機的工作效率,就這一現象,精簡指令集的概念就被提了出來。
精簡指令集RISC就是(ReducedInstruction Set Computing)的縮寫,而複雜指令集CISC則是(Complex Instruction Set Computing)的縮寫。它們之間的不同之處就在於RISC指令集的指令數目少,而且每條指令採用相同的位元組長度,一般長度為4個位元組,並且在字邊界上對齊,欄位位置固定,特別是操作碼的位置。而CISC指令集特點就是指令數目多而且複雜,每條指令的長度也不相等。
在操作上,RISC指令集中大多數操作都是暫存器到暫存器之間的操作,只以簡單的load(讀取)和store(儲存)操作訪問記憶體地址。因此,每條指令中訪問的記憶體地址不會超過1個,指令訪問記憶體的操作不會與算術操作混在一起。在功能上,RISC指令集也要比複雜指令集具有優勢,精簡指令集可以大大簡化處理器的控制器和其他功能單元的設計,不必使用大量專用暫存器,特別是允許以硬體線路來實現指令操作,從而節約處理器的製造成本。而採用CISC指令集的處理器是使用微程式來實現指令操作,在執行速度上不如RISC指令集。另外,RISC還加強了並行處理能力,非常適合於採用處理器的流水線、超流水線和超標量技術,從而實現指令級並行操作,提高處理器的效能。而且隨著vlsi(VeryLarge Scale Integration超大規模積體電路)技術的發展,整個處理器的核心甚至多個處理器核心都可以整合在一個晶片上。RISC指令集的體系結構可以給設計單芯多核處理器帶來很多好處,有利於處理器的效能提高。
由於RISC指令集自身的優勢,在處理器的高階伺服器領域的處理器上得到了廣泛的運用,而CISC指令集主要運用桌面領域的處理器產品中,比如intel的pentium系列和amd的k8系列處理器。然而現在RISC指令集也不斷地向桌面領域滲入,相信以後的處理器指令集會慢慢的向RISC體系靠攏,使得處理器的指令集結構更加完善,功能更為強大,技術也越來越成熟。
RISC指令集有許多特徵,其中最重要的有:(1)、指令種類少,指令格式規範:RISC指令集通常只使用一種或少數幾種格式。指令長度單一(一般4個位元組),並且在字邊界上對齊。欄位位置、特別是操作碼的位置是固定的。(2)、定址方式簡化:幾乎所有指令都使用暫存器定址方式,定址方式總數一般不超過5個。其他更為複雜的定址方式,如間接定址等則由軟體利用簡單的定址方式來合成。(3)、大量利用暫存器間操作:RISC指令集中大多數操作都是暫存器到暫存器操作,只以簡單的Load和Store操作訪問記憶體。因此,每條指令中訪問的記憶體地址不會超過1個,訪問記憶體的操作不會與算術操作混在一起。(4)、簡化處理器結構:使用RISC指令集,可以大大簡化處理器的控制器和其他功能單元的設計,不必使用大量專用暫存器,特別是允許以硬體線路來實現指令操作,而不必像CISC處理器那樣使用微程式來實現指令操作。因此RISC處理器不必像CISC處理器那樣設定微程式控制儲存器,就能夠快速地直接執行指令。(5)、便於使用VLSI技術:隨著LSI和VLSI技術的發展,整個處理器(甚至多個處理器)都可以放在一個晶片上。RISC體系結構可以給設計單晶片處理器帶來很多好處,有利於提高效能,簡化VLSI晶片的設計和實現。基於VLSI技術,製造RISC處理器要比CISC處理器工作量小得多,成本也低得多。(6)、加強了處理器並行能力:RISC指令集能夠非常有效地適合於採用流水線、超流水線和超標量技術,從而實現指令級並行操作,提高處理器的效能。目前常用的處理器內部並行操作技術基本上是基於RISC體系結構發展和走向成熟的。正由於RISC體系所具有的優勢,它在高端系統得到了廣泛的應用,而CISC體系則在桌面系統中佔據統治地位。
X86指令集是Intel為其第一塊16位CPU(i8086)專門開發的,Intel公司所生產的所有CPU仍然繼續使用X86指令集。
在中高檔伺服器中普遍採用RISC指令系統的CPU,特別是高檔伺服器全都採用RISC指令系統的CPU。在中高檔伺服器中採用RISC指令的CPU主要有Compaq(康柏,即新惠普)公司的Alpha、HP公司的PA-RISC、IBM公司的PowerPC、MIPS公司的MIPS和SUN公司的Spare。
在計算機指令系統的優化發展過程中,出現過兩個截然不同的優化方向:CISC技術和RISC技術。CISC是指複雜指令系統計算機;RISC是指精減指令系統計算機。這裡的計算機指令系統指的是計算機的最低層的機器指令,也就是CPU能夠直接識別的指令。隨著計算機系統的複雜,要求計算機指令系統的構造能使計算機的整體效能更快更穩定。最初,人們採用的優化方法是通過設定一些功能複雜的指令,把一些原來由軟體實現的、常用的功能改用硬體的指令系統實現,以此來提高計算機的執行速度,這種計算機系統就被稱為複雜指令系統計算機,即CISC。另一種優化方法是在20世紀80年代才發展起來的,其基本思想是儘量簡化計算機指令功能,只保留那些功能簡單、能在一個節拍內執行完成的指令,而把較複雜的功能用一段子程式來實現,這種計算機系統就被稱為精簡指令系統計算機,即RISC。RISC技術的精華就是通過簡化計算機指令功能,使指令的平均執行週期減少,從而提高計算機的工作主頻,同時大量使用通用暫存器來提高子程式執行的速度。
RISC和CISC是設計製造微處理器的兩種典型技術,雖然它們都是試圖在體系結構、操作執行、軟體硬體、編譯時間和執行時間等諸多因素中做出某種平衡,以求達到高效的目的,但採用的方法不同。
ARM是精簡指令集的代表,目前,絕大部分移動裝置採用的是ARM而不是x86處理器。x86是複雜指令集的代表。
複雜指令集,也稱為CISC指令集,英文名是CISC。在CISC微處理器中,程式的各條指令是按順序序列執行的,每條指令中的各個操作也是按順序序列執行的。順序執行的優點是控制簡單,但計算機各部分的利用率不高,執行速度慢。其實它是英特爾生產的x86系列(也就是IA-32架構)CPU及其相容CPU,如AMD、VIA的。即使是現在新起的X86-64(也被稱為AMD64)都是屬於CISC的範疇。
並行處理的費林分類法:(1)、單指令單資料流(SISD):是非平行計算的模型,典型的例子就是單核的CPU,所有的資料都被一個處理器順次處理,某一時刻只能使用一種指令;(2)、單指令多資料流(SIMD);(3)、多指令單資料流(MISD):指在同一個資料流上執行不同的指令。流水線模型可以被認為是一種MISD;(4)、多指令多資料流(MIMD):是多核CPU的計算模型。
單指令流多資料流(Single Instruction Multiple Data,縮寫:SIMD):是一種採用一個控制器來控制多個處理器,同時對一組資料(又稱“資料向量”)中的每一個分別執行相同的操作從而實現空間上的並行性的技術。在微處理器中,單指令流多資料流技術則是一個控制器控制多個平行的處理微元,例如Intel的MMX或SSE以及AMD的3D Now!技術。它能夠複製多個運算元,並把它們打包在大型暫存器的一組指令集。它以同步方式,在同一時間內執行同一條指令。SIMD特別適合於多媒體應用等資料密集型運算。
單指令流多資料流(SIMD)是一種實現資料級並行的技術,其典型代表是向量處理器(Vector Processor)和陣列處理器(Array Processor)。SIMD技術的關鍵是在1條單獨的指令中同時執行多個運算操作,以增加處理器的吞吐量。為此,SIMD結構的CPU有多個執行部件,但都在同一個指令部件的控制之下,中央控制器向各個處理單元傳送指令,整個系統只要求有一箇中央控制器,只要求儲存一份程式,所有的計算都是同步的。
SIMD包括:MMX(1996)、MMX2、SSE(1999)、SSE2(2001)、SSE3(2004)、SSSE3、SSE4.x、SSE5、AMD’s 3DNow!、NEON、Yeppp、AVX、FMA等。
MMX(Multi-MediaExtension):技術的優點是增加了多媒體處理能力,可以一次處理多個數據,缺點則是僅僅只能處理整型數,並且由於佔用浮點數暫存器進行運算,以至於MMX指令集與x87浮點運算指令不能夠同時執行,必須做密集的切換才可以正常執行,這種情況勢必造成整個系統執行質量的下降。
SSE(Streaming SIMD Extensions):相容MMX指令,可以通過SIMD和單時鐘週期並行處理多個浮點資料來有效提高浮點運算速度,對影象處理、浮點運算、3D運算、視訊處理、音訊處理等諸多多媒體應用起到全面強化作用。具有SSE指令集支援的處理器有8個128位的暫存器,每一個暫存器可以存放4個單精度(32位)浮點數。SSE同時提供了一個指令集,其中的指令允許把浮點數載入到這些128位暫存器中,這些數就可以在這些暫存器中進行算術邏輯運算,然後把結果送回主存。也就是說,SSE中的所有計算都可以針對4個浮點數一次性完成,這種批處理帶來了效率的提升。
SSE2(Streaming SIMD Extensions 2):指令集,擴充套件了SSE指令集,並可完全取代MMX。SSE2指令集是Intel公司在SSE指令集的基礎上發展起來的。相比於SSE,SSE2使用了144個新增指令,擴充套件了MMX技術和SSE技術,提高了諸如MPEG-2、MP3、3D圖形等應用程式的執行效能。在整數處理方面,隨MMX技術引進的SIMD整數指令從64位擴充套件到了128位,使SIMD整數型別操作的執行效率成倍提高;在浮點數處理方面,雙精度浮點SIMD指令允許以 SIMD格式同時執行兩個浮點操作,提供雙精度操作支援有助於加速內容建立、財務、工程和科學應用。除SSE2指令之外,最初的SSE指令也得到增強,通過支援多種資料型別(例如雙字、四字)的算術運算,支援靈活、動態範圍更廣的計算功能。
SSE3(Streaming SIMD Extensions 3):指令集是Intel公司在SSE2指令集的基礎上發展起來的。相比於SSE2,SSE3在SSE2的基礎上又增加了13條SIMD指令,以提升Intel超執行緒(Hyper-Threading)技術的效能,最終達到提升多媒體和遊戲效能的目的。
目前SIMD指令可以有四種方法進行使用分別是組合語言,C++類,編譯器Intrisincs和自動向量化。
參考文獻: