CPU中的那些指令集都有什麼用?

我們都知道之所以計算機能夠進行計算,主要靠的是大規模集成電路中由晶體管組成的邏輯電路。這些邏輯電路使得計算機能夠進行運算及判斷。但對於一個簡單邏輯電路來講,它只能進行一個完整運算中的部分操作,所以人們通過組合這些簡單邏輯電路,這樣就可以讓計算機進行復雜的運算了。當CPU設計人員將這些組合邏輯電路製作成通用運算單元后,我們將一定格式的指令及數據輸入,即可得到運算結果。而當需要的運算種類越來越多、運算越來越複雜後,CPU設計人員就將這些指令進行劃分重構,組成一整套進行運算的集合,這就是指令集

CPU中的那些指令集都有什麼用?圖片來自Unsplash

不過以上面向CPU指令集設計師及CPU微架構設計師的,CPU指令設計者將不同一些計算機操作設計成指令,然後微架構設計師通過這些指令的格式等進行微架構設計。而對於軟件開發者,更多接觸到的是軟件層面的彙編語言,通過彙編語言指令就可以讓程序員控制計算機了。計算機軟硬件架構是有層次的,隨著高級語言的開發,GUI的出現,更多的人可以方便的使用計算機。雖然編程語言越來越“高級”,軟件越來越華麗,但是其依然需要通過CPU中的海量晶體管進行運算,調用指令集。

從英特爾開發出8086處理器開始,x86指令集就開始形成了,此後英特爾推出了80286、80386等處理器,雖然1985年時英特爾的處理器發展到32位的80386,但它依舊採用的是x86架構,而且在此後很長時間內,80386採用的指令集、編程模型及二進制格式仍然是所有32位x86處理器需要遵守的,而這也被稱為x86或IA-32,統一的指令集、編程模型及二進制也讓採用x86指令集架構的處理器成為PC市場的霸主。

隨後如英特爾等廠商在此後的產品上添加了一些指令,如浮點指令等,這也讓處理器滿足了人們對計算機更高性能的需求。在新世紀到來後,又發展出了最新的x86-64指令集,也提供了對傳統的32位x86指令集的兼容,同時如Windows 10、大部分基於Linux內核操作系統都還提供32位兼容。

CPU中的那些指令集都有什麼用?AMD推出的x86-64規範,圖片來自Wikipedia

不過如x86指令集不能滿足我們在計算機中的所有工作,所以在基礎的x86指令集上,CPU指令集設計人員又向x86指令集中添加了一些有用的指令集,以方便軟件開發人員進行開發。不過隨著計算機多媒體時代的來臨,導致用戶對計算機性能的要求越來越高,所以為了應對並行計算等需求,處理器設計設計生產廠商開始在x86指令集之外開發擴展指令集(Extended Instruction Sets),這些指令集通常能有強大的並行計算能力,可以大幅加速部分運算的速度,這樣就可以進行多媒體處理等需要大量運算的任務。從1998年AMD的K6-2架構發佈後,3D!Now、MMX等擴展指令集依次被添加進入CPU中,使得CPU的通用並行計算能力越來越強。到現在英特爾及AMD已經開發出了非常多的擴展指令集,如SSE(Streaming SIMD Extensions,流式單指令多數據流擴展)、VT-x(Intel Vertualization)、AES-IN(高級加密標準指令集)、AVX(Advanced Vector Extensions,高級矢量擴展),而這些指令集不僅影響了程序員,通過使用這些擴展指令集編寫程序,可以加速運算,為我們帶來更可靠、強大、實用的軟件,而且對普通用戶,我們也能通過這些軟件應用體驗到擴展指令集帶來的優勢,那麼到具體應用中,我們在日常中使用了哪些指令集呢?

CPU中的那些指令集都有什麼用?Intel Core i9-9900K

CPU中的那些指令集都有什麼用?AMD Ryzen 7 2700X

第一大類:基礎運算類x86、x86-64及EM64T等

在Intel推出8086處理器之後,x86指令集(x86 Instruction Sets)就形成了。在8086/8088處理器中採用最初的x86指令集中主要為數據操作,如ADD(數據加)、DIV(數據除)等數據運算操作,AND(邏輯加)、OR(邏輯或)等邏輯操作,MOV(CPU內或CPU與內部存儲器之間傳送數據)、JMP(跳轉)等指令,這些基礎指令組成了最初的x86指令集。

而從此後,Intel等廠商也在擴展X86指令集,添加了很多有關堆棧、狀態的指令。隨著這些指令的增加,讓能夠讓處理器快速執行一些了基礎運算、邏輯判斷。

在2001年後,AMD推出了x86-64指令集,自此x86架構處理器進入了64位時代。而後來Intel跟進推出了EM64T指令集。將所有通用寄存器從32位擴充至64位,而且虛擬內存地址空間和物理地址空間都大幅擴大,這些都有助於處理器運行效率的提高。

CPU中的那些指令集都有什麼用?首款支持x86-64指令集的處理器,AMD Opteron(皓龍),圖片來自Wikipedia

那麼x86以及之後推出的x86-64以及EM64T主要是針對計算機運行的基礎操作,如數據運算、數據操作以及邏輯判斷。我們在運行基礎的數據運算、數據操作及邏輯判斷時都用的是處理器的x86指令集、它為計算機的提供基礎的基礎運算能力,邏輯判斷能力。但隨著處理器並行化計算的趨勢,接下來這些指令集是負責目前目前處理器中更多的計算任務。

第二大類:SIMD指令集,有SSE系列,AVX系列

隨著對處理器數據處理能力需求的增強,面對更大數據量、更復雜的計算,單純使用x86指令集已不足以滿足需求,所以AMD K6-2處理器推出後,SIMD多媒體指令集的出現讓處理器的浮點矢量運算、並行處理能力大幅增強。

最初的3D!Now、MMX指令集推出的時候,計算機的3D圖形能力不強,所以那時MMX等指令集會對3D、2D計算進行加速。而後來推出的SSE系列指令集以及AVX指令集的出現將CPU處理數據的寬度從最初的64位到最新的AVX512系列指令集的512位,都是為了增強處理器的並行計算能力的。而以2010年為節點,之前的就是SSE系列,之後就是AVX系列。

CPU中的那些指令集都有什麼用?圖片來自Wikichip

雖然如3D運算是由GPU計算,不過由於對細碎數據並行計算能力較強,編程模型更加易用,所以到現在用處依舊非常廣泛。而隨著數據寬度提升,如目前火熱的人工智能應用都可以進行加速。

之所以將這類SSE、AVX放在一起,是因為雖然它們之間有很多區別,但它們都是SIMD(單指令多數據流)指令集,所以AVX可以看做是SSE指令集的延續。

多媒體應用

雖然現在更多的如2D、3D計算是在GPU中處理的,但是依舊有多媒體應用使用處理器中的SSE等指令集進行計算。雖然如視頻編解碼都已經有專門的處理單元了,但是還是有視頻編解碼應用採用SSE、AVX指令集。如著名的音視頻處理軟件FFmpeg就有使用SSE指令集進行音視頻處理的編解碼器。而x264、x265視頻編碼器也可以使用AVX2甚至是AVX-512來加速編碼。

CPU中的那些指令集都有什麼用?視頻壓縮軟件使用了SSE2指令集

而隨著技術的發展,我們瀏覽的網頁也越來越華麗,圖片,視頻等為我們展現了豐富的內容,而這些內容也需要通過更多的計算性能,通過SSE等指令集渲染網頁中的圖像等內容。如我們常用的Chrome瀏覽器,在2014年後,就只支持含有SSE2指令集的處理器(國內很多瀏覽器也是使用的Chromium內核)。而FireFox(火狐)瀏覽器也在49版本後只支持有SSE2指令集的處理器。

CPU中的那些指令集都有什麼用?Chrome瀏覽器現在的版本已經刷到75

加解密運算

雖然SSE等SIMD指令集最初是為了加速3D等多媒體任務的,但是再後來其對很多大量並行數據超強的處理能力及更寬的數據寬度讓其可以執行更多的任務。隨著數據信息安全越來越重要,越來越多的加解密應用使用了SSE、AVX指令集進行編解碼操作。如我們常見的OpenSSL等就採用了AVX及AVX2指令集優化加密功能。而Ubuntu等操作系統採用的Linux內核中採用了AVX或AVX2指令集,作為AES-GCM等多種加密算法的優化實現。通過更高指令集的實現,可以讓加解密運算更加迅速,而且相對於獨立出來的AES-IN指令集,其更具有通用性,軟件開發者不需要要對指令集做專門的適配。

數據序列化

隨著移動互聯網的發展,移動設備也在產生著非常多的數據。而這些數據是有一定格式的,如常見的XML(可擴展標記語言)、JSON(一種輕量級數據交換語言)。而無論是移動設備,還是接收數據的服務器,都是需要解析這些數據。而由於格式固定,所以可以海量的數據可以通過並行化的方式進行解析,讓程序獲得需要的數據。

CPU中的那些指令集都有什麼用?JSON格式的數據

現在已經有一些採用SSE指令集的數據解析程序,這些程序代碼被一些應用使用,非常快速高效的解析獲取的數據,並將數據呈現給使用者。

遊戲

在遊戲中現在也大量的使用SSE、AVX指令集。由於遊戲畫面需要大量的座標等數據,而座標等向量數據使用SSE指令集正是處理這類數據最好的方式。通常程序並行化編程可以加速矩陣乘法等遊戲中常用的運算,所以一些遊戲開發者會開發專門的數學庫,以加速這類運算。

CPU中的那些指令集都有什麼用?CryEngine開發軟件界面,圖片來自CryEngine

而除了對遊戲進行優化外,部分開發商還會使用Denuvo、VMPortect等進行加密,Denuvo、VMPortect需要處理器支持如AVX指令集等進行加密。此前育碧推出的《刺客信條:奧德賽》最初的版本需要支持AVX指令集的處理器才可以運行,而隨後由於玩家向育碧反映,育碧修復了這個“問題”。此後也有很多遊戲採用了VMProtect,所以如果玩家需要運行未來的遊戲,需要注意一下處理器支持的指令集了。Intel的初代酷睿處理器(如Core i7-920)支持SSE4.2指令集,而到了第二代酷睿處理器(如Core i7-2600K)開始正式支持AVX指令集,所以玩家們不僅因為性能,還應該考慮未來遊戲需要支持的指令集(支持正版)。

CPU中的那些指令集都有什麼用?當時育碧的迴應

科學計算&人工智能

雖然科學計算對於大部分用戶來說比較久遠,但是這也是計算機最重要的應用之一。科學計算通常需要強大的並行計算能力,而且這類應用也是浮點密集型應用,所以SSE、AVX指令集可以起到加速這類應用的目的。

而目前大熱的人工智能,當採用CPU進行機器學習運算時,如AVX這類並行化的指令集也可以加速學習速度。著名的機器學習框架TensorFlow從1.6版開始要求處理器至少支持AVX指令集。而Intel在最新的Ice Lake-U處理器中內置的AVX-512指令集甚至對機器學習進行了優化。

檢測處理性能,跑分

由於這些指令集構成的具體處理器架構實現,同時採用這些指令集的軟件在運行時會讓CPU高負荷運行,所以用專門編寫運行這些指令集的軟件,然後將運行時間等進行量化,可以測試處理器性能。

CPU中的那些指令集都有什麼用?AIDA64軟件

我們常用的測試有很多,如AIDA64、CINEBench等都會使用到這些指令集,而最終測試得到的分數就可以作為評判處理器性能的標準。

以上的應用都是我們都會用到的,而很多編程語言的代碼庫中都會有一些支持SSE、AVX指令集的接口,而這些指令集的通用性很強,所以未來會有更多的應用採用這些指令集進行編程,同時我們也會體會到這些指令集的優勢。

第三大類:虛擬化指令集Intel,虛擬機應用

虛擬化技術不是一項新技術,在20世紀60年代末,IBM公司就通過在硬件之上添加一套軟件抽象層,將計算機硬件虛擬分割成一個或多個虛擬機(Virtual Machine)。而這種劃分計算機資源的技術就是虛擬化技術。

目前大多數x86指令集架構的處理器才用的是硬件抽象級別虛擬化技術,通過這種有限的硬件虛擬化技術,虛擬機軟件隱藏不同廠商的處理器、存儲器等特徵,為虛擬機提供抽象且統一的虛擬平臺。

英特爾及AMD都在2006年後在處理器中提供了虛擬化指令集,Intel為VT-x,AMD為AMD-V,而隨後兩家又推出了可以支持直接存儲器訪問(Direct Memory Access,DMA)以及PCIe設備直接訪問的VT-d及AMD-Vi技術。現在這些虛擬化指令集能為目前的x86指令集架構的處理器提供運行高效的虛擬機。

雖然我們都聽說過虛擬機,但實際上我們也會使用到虛擬化技術。我們移動設備中的一些應用使用的服務器很多都是通過處理器虛擬化技術劃分出的虛擬機,軟件開發商通過購買雲服務,然後再這些虛擬機中運行自己的程序,為用戶提供服務。

CPU中的那些指令集都有什麼用?阿里云云服務器ECS入門級

CPU中的那些指令集都有什麼用?開源的Virtualbox

而有時候我們自己會通過開源的Virtualbox、需要購買的VMware Workstation等軟件去安裝自己的虛擬機,然後在虛擬機裡安裝應用,與本機進行隔離。如信息安全研究人員會通過虛擬機來進行安全研究。

第四大類:安全類指令集,如加解密AES-IN指令集

現在信息安全問題越發突出,而對數據進行加密也是很多用戶進行的操作。但是通過基礎指令進行加解密速度不甚理想,而雖然現在已經可以通過AES等指令集進行並行化加密,但是人類在追求速度上是無止境的。所以Intel及AMD都在處理器中添加了針對加解密的指令集,Intel處理器內有AES(先進加密標準)指令集,而AMD這邊出了AES指令集外,還有SHA(安全散列算法)指令集。

這些指令集都是為數據進行加解密操作的,其中AES指令集是為了加速目前非常流行的AES(如NAS產品會稱支持AES加密)加解密算法的。而AMD支持的SHA指令集支持SHA加解密算法。這些指令集的加入甚至可以讓加解密操作實時執行,在保證用戶數據安全的同時,不會影響實際使用。

第五大類:多線程應用,TSX事務同步擴展指令集

TSX(事務同步擴展)作為近幾年新增的指令集,是一個小透明一樣的存在。從Intel的Haswell架構開始在第四代酷睿處理器開始提供。TSX指令集可以實現事務代碼的預測執行,硬件監測多個線程以進行衝突的內存訪問,加速多線程軟件的執行。

然而看似美好的事情可能存在風險,在2016年,信息安全研究人員發現了利用側信道攻擊發現的TSX漏洞。而在隨後的處理器中Intel修復了這個漏洞。

總結

CPU中的那些指令集都有什麼用?

當處理器指令集設計者不再將擴展基本的x86指令集後,添加擴展指令集成為了x86處理器設計廠商的主流。而這些設計者也極具遠見,從現在來看,目前我們常見CPU中的指令集都有具體使用,而隨著編譯器等軟件開發工具的添加這些指令集的支持,相信會有越來越多的程序開始支持,我們使用的軟件也會以越來越高的效率運行。

相關推薦

推薦中...