close

  很多人在看intel處理器文章,會看到AVX指令集這名詞,比如說處理器評測文中能看它,一些新玩家可能不知道這名詞,這篇文簡單介紹AVX指令集來龍去脈,簡單說目前實際應用情況。

從SIMD說起:
  要搞懂AVX指令集的功能,先要說它是什麼?定義很簡單,它是x86處理器上的一套SIMD指令集,經典SSE系列指令集直接繼承者,那麼SIMD又是什麼?

  在電腦剛出現的早期階段,馮·諾伊曼式計算機,每輸入一個指令只能操作一對數據,比如說"+、a、b"可以讓ab進行相加,這就是單指令流、單數據流(S ingle I nstruction Stream, S ingle D ata Stream)。面對大量數據的時候,這種操作數據的方法效率較低,程式員想要操作一次,就對多組數據生效,該怎麼辦?單指令流、多數據流操作(S ingle I nstruction Stream, M ultiple D ata Stream)的思路就被導入,只要輸入一次指令,就能操作多組數據變成了可能。

獨家AVX指令集_01.PNG
更直觀的區別可以看上面的示意圖。
  上世紀的八、九十年代,很多處理器開發商,都意識到SIMD的前景,他們開始在自家處理器裡加入SIMD支持。1996年Intel發布了基於新版P55C架構(最早Pentium處理器是P5架構)的Pentium MMX系列處理器,就導入新MMX指令集,開始支持SIMD。

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

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

  Intel當然很清楚MMX指令集的侷限,競爭對手AMD新出來的3DNow!指令集(1998年,AMD K6-2)已支持浮點SIMD運算,於是他們趕緊在經典的奔3處理器上引入新SSE(S treaming S IMD E xtensions)指令集,時間為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年公佈,命名為高級向量擴充(A dvanced V ector E x tensions)。

革新的AVX,越來越寬的暫存器:
  相比疊代多年的SSE系列指令集,AVX指令集帶來巨大革新,其中最主要,它相容SSE指令集的同時,將SSE時代最大寬度為128-bit的暫存器拓寬到256-bit。

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

獨家AVX指令集_03.PNG
同處理器用不同指令集的能效對比
  但如果以為Intel會就此停下腳步的話,那就大錯特錯了,他很快出了更寬的AVX-512指令集,顧名思義,其暫存器寬度再次加倍來到512-bit。

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

獨家AVX指令集_04.PNG
長長的AVX-512子集列表
  目前僅有基於Skylake-Server和Ice Lake這兩個架構處理器,可以支持AVX-512,Cannon Lake死了不然也算,使用門檻較高,一般新的應用也僅是對AVX2進行優化。

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

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

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

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

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

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

  跟渲染方面有關係的就是視頻編碼,x264和x265這兩個知名開源視頻編碼器,它們都在幾年前加入了對AVX指令集支持,後者甚至加入了對AVX-512的支持,不過還要優化。另外Intel自己也開源一套名為SVT視頻編碼器,配合不同後製可實現不同編碼,對AVX和多核的優化相當好。

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

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

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

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

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

 


來源
謝謝收看

arrow
arrow
    創作者介紹

    john pan 發表在 痞客邦 留言(0) 人氣()