AVX指令集作用和應用介紹 AVX指令集是什么

很多讀者朋友可能在閱讀我們的文章時經常會看到AVX指令集這個名詞,比如說在CPU評測中就往往能夠看到它的身影,一些新入坑的玩家可能會不明白這個名詞的含義,今天這篇文章就簡單介紹一下該指令集的來龍去脈,并且梳理一下它目前在實際中的應用情況 。
從SIMD說起要搞明白AVX指令集的作用,首先要講明白它是什么 。定義很簡單,它就是x86處理器上面的一套SIMD指令集,是經典的SSE系列指令集的直接繼承者 。那么SIMD又是什么呢?
在計算機剛剛出現的早期階段,馮·諾伊曼式計算機每次輸入一個指令只能夠操作一對數據,比如說\”+,a,b\”可以讓ab進行相加,這就是單指令流單數據流(Single Instruction Stream, Single Data Stream) 。顯然,在面對大量數據的時候,這種操作數據的方法效率較低,程序員想要讓一次操作就對多組數據生效,怎么辦呢?單指令流多數據流操作(Single Instruction Stream, Multiple Data Stream)的思路就被引入了,它讓輸入一次指令就操作多組數據變成了可能 。

AVX指令集作用和應用介紹 AVX指令集是什么

文章插圖

更直觀的區別可以看上面的示意圖 。
上世紀八九十年代,很多處理器開發商都意識到了SIMD的前景,他們開始往自家的處理器里加入SIMD支持 。1996年,Intel發布了基于新版P55C架構(最早一版Pentium處理器為P5架構)的Pentium MMX系列處理器,其中引入了新的MMX指令集,開始支持SIMD 。
AVX指令集作用和應用介紹 AVX指令集是什么

文章插圖

從MMX到SSE,再到AVXPentium MMX系列處理器上新引入的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年,AMD K6-2)已經支持了浮點SIMD運算,于是他們趕緊在經典的奔3處理器上面引入了新的SSE(Streaming SIMD Extensions)指令集,時間點為1999年2月份 。
SSE指令集解決了MMX指令集身上存在的兩大問題,通過引入新的獨立寄存器解決了與浮點運算間的沖突問題,同時也就支持了浮點SIMD運算 。當然它相對于MMX有很大加強,表現在它的寄存器寬度隨著處理器架構的進步而達到了128-bit,這樣一來一次SIMD指令能夠操作更多的數據,效率上有大幅度的提高 。不過初代SSE指令集的單個寄存器只支持32-bit長度的浮點數,還是有很大的局限性,這個問題在Pentium 4(Willamette,2000年)上面引入的SSE2中被解決了,SIMD操作的靈活度高了很多 。
隨后在約莫8年的時間里,Intel一直在更新SSE指令集,從SSE出到SSE4,AMD方面則是一直在跟進,到了SSE4.2,AMD開始想要在指令集上面尋找自己的翻身點,于是推出了只有自家支持的SSE4a子集,隨后更是提前于Intel提出了SSE5 。
但Intel不干,我是x86的老大,我不能跟著你來 。他們另起爐灶,準備在未來的Sandy Bridge架構中引入一套新的SIMD指令集,這套新指令集在2008年公布,被命名為高級向量擴展(Advanced Vector Extensions) 。
革新的AVX,越來越寬的寄存器相比起迭代了多年的SSE系列指令集,AVX指令集帶來了巨大的革新,其中最為主要的是,它在兼容SSE指令集性的同時,將SSE時代最大寬度為128-bit的寄存器拓寬到了256-bit 。
不過初代AVX指令集還是比較保守的,它沒有將所有指令寬度拓寬到256-bit,而是選擇停留在128-bit上面 。全面進入256-bit時代這個任務,還是交給了隨后的Haswell架構來完成(2013年6月份) 。
AVX指令集作用和應用介紹 AVX指令集是什么

文章插圖

同處理器用不同指令集的能效對比
但如果以為Intel會就此停下腳步的話,那就大錯特錯了,他們很快搗鼓出了更寬的AVX-512指令集,顧名思義,其寄存器寬度再次加倍,來到512-bit 。
首個支持AVX-512指令集的處理器其實是Intel的Xeon Phi加速卡,首次跑到CPU上已經是Skylake-X系列了 。而AVX-512也并不再是一個單一的指令集,它實際上指代的是多個指令集的集合,目前這個數字是17,之后可能還會增多 。所有支持AVX-512的處理器都必須支持AVX-512 Foundation子集,從命名上也可以看出,它其實是AVX-512指令集的基礎 。

推薦閱讀