楠木軒

深入淺出介紹處理器中神秘的AVX指令集,以及它的應用有哪些

由 希學英 發佈於 科技

很多讀者朋友可能在閲讀我們的文章時經常會看到AVX指令集這個名詞,比如説在CPU評測中就往往能夠看到它的身影,一些新入坑的玩家可能會不明白這個名詞的含義,今天這篇文章就簡單介紹一下該指令集的來龍去脈,並且梳理一下它目前在實際中的應用情況。

要搞明白AVX指令集的作用,首先要講明白它是什麼。定義很簡單,它就是x86處理器上面的一套SIMD指令集,是經典的SSE系列指令集的直接繼承者。那麼SIMD又是什麼呢?

在計算機剛剛出現的早期階段,馮·諾伊曼式計算機每次輸入一個指令只能夠操作一對數據,比如説"+,a,b"可以讓ab進行相加,這就是單指令流單數據流(Single?InstructionStream,?Single?DataStream)。顯然,在面對大量數據的時候,這種操作數據的方法效率較低,程序員想要讓一次操作就對多組數據生效,怎麼辦呢?單指令流多數據流操作(Single?InstructionStream,?Multiple?DataStream)的思路就被引入了,它讓輸入一次指令就操作多組數據變成了可能。

更直觀的區別可以看上面的示意圖。

上世紀八九十年代,很多處理器開發商都意識到了SIMD的前景,他們開始往自家的處理器里加入SIMD支持。1996年,Intel發佈了基於新版P55C架構(最早一版Pentium處理器為P5架構)的PentiumMMX系列處理器,其中引入了新的MMX指令集,開始支持SIMD。

PentiumMMX系列處理器上新引入的MMX指令集開創了x86處理器支持SIMD操作的先河,該指令集定義了8個64-bit寬度的寄存器,每個寄存器的64-bit容量中可以放入八個8-bit長度的整數或四個16-bit長度整數或兩個32-bit整數,CPU在識別到MMX指令集的新指令時會自動將寄存器中的數據進行分割計算,這樣一來,單個指令就成功操作了多個數據,實現了SIMD。

但MMX畢竟太嫩,它實際上是通過複用CPU內部x87浮點單元的寄存器來實現SIMD的,所以與運行浮點運算的x87指令集有衝突,兩者不能交叉使用,必須先進行切換。另外,由於上述的衝突,它只支持整數操作,在即將要到來的3D時代中顯得有些不夠用。

Intel當然很清楚MMX指令集的侷限之處,而競爭對手新搗鼓出來的3DNow!指令集(1998年,AMDK6-2)已經支持了浮點SIMD運算,於是他們趕緊在經典的奔3處理器上面引入了新的SSE(Streaming?SIMD?Extensions)指令集,時間點為1999年2月份。

SSE指令集解決了MMX指令集身上存在的兩大問題,通過引入新的獨立寄存器解決了與浮點運算間的衝突問題,同時也就支持了浮點SIMD運算。當然它相對於MMX有很大加強,表現在它的寄存器寬度隨着處理器架構的進步而達到了128-bit,這樣一來一次SIMD指令能夠操作更多的數據,效率上有大幅度的提高。不過初代SSE指令集的單個寄存器只支持32-bit長度的浮點數,還是有很大的侷限性,這個問題在Pentium4(Willamette,2000年)上面引入的SSE2中被解決了,SIMD操作的靈活度高了很多。

隨後在約莫8年的時間裏,Intel一直在更新SSE指令集,從SSE出到SSE4,AMD方面則是一直在跟進,到了SSE4.2,AMD開始想要在指令集上面尋找自己的翻身點,於是推出了只有自家支持的SSE4a子集,隨後更是提前於Intel提出了SSE5。

但Intel不幹,我是x86的老大,我不能跟着你來。他們另起爐灶,準備在未來的SandyBridge架構中引入一套新的SIMD指令集,這套新指令集在2008年公佈,被命名為高級向量擴展(Advanced?VectorExtensions)。

相比起迭代了多年的SSE系列指令集,AVX指令集帶來了巨大的革新,其中最為主要的是,它在兼容SSE指令集性的同時,將SSE時代最大寬度為128-bit的寄存器拓寬到了256-bit。

不過初代AVX指令集還是比較保守的,它沒有將所有指令寬度拓寬到256-bit,而是選擇停留在128-bit上面。全面進入256-bit時代這個任務,還是交給了隨後的Haswell架構來完成(2013年6月份)。

同處理器用不同指令集的能效對比

但如果以為Intel會就此停下腳步的話,那就大錯特錯了,他們很快搗鼓出了更寬的AVX-512指令集,顧名思義,其寄存器寬度再次加倍,來到512-bit。

首個支持AVX-512指令集的處理器其實是Intel的XeonPhi加速卡,首次跑到CPU上已經是Skylake-X系列了。而AVX-512也並不再是一個單一的指令集,它實際上指代的是多個指令集的集合,目前這個數字是17,之後可能還會增多。所有支持AVX-512的處理器都必須支持AVX-512Foundation子集,從命名上也可以看出,它其實是AVX-512指令集的基礎。

長長的AVX-512子集列表

目前只有基於Skylake-Server和IceLake這兩個架構的處理器可以支持AVX-512(CannonLake死了,不然也算),使用門檻較高,一般新一點的應用也只是針對AVX2進行優化。

寬度越大,處理器的計算能力也就越強,尤其是在浮點運算方面,理論上提升有一倍之多,而實際應用中,如果優化得當,其提升幅度還要大一些。但是,新指令集在帶來性能增長的同時也帶來了另一個讓人感到頭痛的問題——功耗。

AVX指令集在帶來更高性能的同時讓CPU的峯值功耗也變高了,可以通過下面的例子進行理解:

飛機發動機是按照最大起飛重量設計的,如果實際的載重沒有到最大起飛重量的話,飛行員就可以減推力起飛來降低油耗。CPU也是一樣的,最吃功耗的執行單元是根據最大寬度來設計的,平時用不到最大寬度的時候它的功耗就小了,而一旦用到極限,它也就會全開,此時CPU的功耗就上去了。

IntelAVXisDesignedtoachievehigherthroughputforcertainintegerandfloating-pointoperations.UsingtheseinstructionsmaycauseprocessorstooperateatlessthanthemarkedTDPfrequency.Thesereductionsinfrequencyoccurbecausehigh-powerIntelAVXinstructionsrequireadditionalvoltageandelectricalcurrent.

現如今CPU的功耗是根據負載大小來的,在同頻下面,AVX2的負載明顯高於SSE負載,因此它的功耗也會大上去。為了讓CPU的功耗保持在TDP範圍之內,Intel特地設計了一個AVX偏移頻率,讓工作在AVX狀態下面的處理器降低一點頻率以減小發熱量和功耗,保證使用安全。Intel官方也在2014年的一份AVX指令集優化白皮書中明確説明使用AVX指令集需要額外的電壓和電流。

對於我們這些要做跑分評測的編輯來説,最常接觸到的AVX應用其實就是AIDA64了,那麼可能有讀者就要問了,這個指令集都已經推出十年了難道只能用來跑分烤機嗎?當然不是,在Intel的推廣之下,現如今已經有大量的生產力應用支持它了,主要在渲染、視頻編碼、加解密和數學計算等方面有應用,新的AVX-512還針對深度學習推出了AVX-512VNNI子集,另外,普通玩家最為關心的遊戲方面也是有越來越多的應用了,下面舉幾個例子。

渲染方面最常見的有Blender,它不僅僅在我們的測試中被用的多,是真的有很多人都會用它做動畫或者CG圖,它的渲染引擎可以調用AVX2指令集進行加速計算,吃滿你的CPU。

跟渲染方面有點搭邊的就是視頻編碼了,x264和x265這兩個知名開源視頻編碼器想必已經不用再多介紹了,它們都在前幾年中紛紛加入了對於AVX指令集的支持,後者甚至加入了針對AVX-512的支持,不過還需要繼續優化。另外,Intel方面自己也開源了一套名為SVT的視頻編碼器,配合不同後端可以實現不同的編碼,對AVX和多核的優化相當好。

深度學習方面,Google著名的開源深度學習框架Tensorflow在1.6版本之後就已經需要一顆支持AVX指令集的CPU了,換言之,它應用了AVX指令集。

另外,AVX-512的大寬度讓它很適合用來跑深度學習,所以Intel也針對深度學習設計了一套子指令集——AVX-512VNNI,用來加速深度學習相關的計算,在測試中,它表現出了相當的實力。

加解密計算場景中對CPU的計算吞吐量有較大的要求,此時AVX指令集就可以發揮作用,常見的軟件支持就有OpenSSL這個堪稱是互聯網基石的加密庫,另外像很多程序會使用的libsodium加密庫也提供了從AVX到AVX-512的優化,而Linux內核也支持使用AVX和AVX2指令集進行加解密計算,還會配合AES-NI這個專用的指令集。實際上目前還有很多數字貨幣的計算過程支持使用AVX指令集,不過這個應該是真的沒有人會用了……

近兩三年的大作基本都開始啓用AVX指令集來進行計算了,一般在遊戲中CPU負責除了圖形以外的雜活,比如説計算各種NPC的運動路徑,計算各種動體的軌跡這樣的雜活。不過近兩年也有廠商想讓Intel參與進遊戲圖形計算,甚至是當下熱門的光線追蹤運算,比如Intel的光線追蹤計算庫Embree就可以被整合進遊戲中,目前已經有《坦克世界》等遊戲使用了它,Embree庫高度依賴AVX指令集,也對CPU的遊戲性能提出了新的闡述方式:直接參與圖形渲染。

總的來説,AVX目前還沒有完全展露出它的價值,這也是軟件優化缺位導致的。不過隨着各路編譯器的跟進、處理器迭代使得支持AVX指令集的處理器普及,相信我們的常用軟件也會加入AVX優化,比如説在圖片處理時調用它。配合上已經展開應用的各種生產力應用,AVX的前景非常廣闊。