硬科技:淺談x86的SIMD指令擴張史(下):AVX到AVX-512

2020.04.08 08:00AM
照片中提到了512b、Intel SIMD ISA Evolution、SIMD,包含了英特爾AVX 512、AVX-512、高級向量擴展、英特爾、MMX

前情提要:淺談x86的SIMD指令擴張史(中):SSE2到SSE4。x86指令集的SIMD擴充,從1997年的MMX一路「堆積」到2008年的SSE4.2,看似已功德圓滿,但其實仍遠遠不足,累積缺陷總計如下:

  • 雙運算元(A = A + B)的宿疾還是沒有解決,限制單一指令的功能,也變相增肥程式碼。
  • 只要處理器的微架構足以負擔,可以一次處理的資料量還是是多多益善,越寬越好。
  • 16個暫存器還是太少,人家古老的RISC可都是32個起跳的。
  • 和真正的「向量(Vector)處理器」相比仍有差距,例如缺乏指定SIMD中需要被處理資料的遮罩(Mask)暫存器。

照片中提到了operand1 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80、operand2 1 111 1 1、1 1,包含了情節、指令集架構、圖形處理單元上的通用計算、維基、的GitHub

  • 欠缺從散落在記憶體各處的運算元素「聚集(Gather)」至向量暫存器內,運算結束後再一次性「分散(Scatter)」送回記憶體四處的特殊能力。

照片中提到了Masked Gather、Gather And Scatter、PassThru,包含了圖、角度、線、點、字形

  • x86指令集的編碼問題,起碼對64位元模式來說,依舊存在。

AVX:史上最重要的x86指令集擴張 沒有之一

即使沒有白紙黑字的證據,筆者絕對有充分的理由相信,這就是Intel傳說中「Yamhill」的原貌,如果64位元x86指令集一開始就這樣弄,不要放任AMD胡搞瞎搞,該有多好啊。

在2011年的Sandy Bridge登場的AVX(Advanced Vector Extensions)堪稱面面俱到的傑作,不僅一口氣整合了過去x86指令編碼中的「麻煩製造者(Escape、SIMD Prefix)」,將所有可能影響指令編碼長度的資訊,集縮在指令前端的VEX(Vector Extension),大幅精簡指令編碼格式,無須讀取大半個指令,即可知道「這指令到底想幹什麼」,簡化指令擷取單元和解碼器的優化手段,並徹底針對SIMD運算最佳化,將128位元的XMM擴充成256位元YMM暫存器,實現「三運算元(如A = A × B + C)」指令兼具保留四運算元的擴充彈性。

照片中提到了A New 3- and 4- operand Instruction Format、Intel® Advanced Vector Extensions (Intel® AVX) has a distinct、destination argument that results in fewer register copies, better,跟英特爾有關,包含了英特爾、滴答模式、電腦、微處理器

一舉推翻SSE家族的AVX大革命

相信眼尖的科科勢必察覺到「偉大的可能性」:

既然AVX實際上與SSE共用暫存器,VEX內又包了過往SIMD指令需要的欄位(”mmmmm” 代表Escape、”pp” 則是SIMD Prefix),那創造「相對應SSE、指令解碼效率更快的AVX指令」又何嘗不可呢?

照片中提到了256位元寬YMM暂存器、255、128,包含了情節、角度、線、點、字形

事實上,Intel的確一開始就打算「新瓶裝舊酒」:使用VEX編碼、運算元變成「YMM暫存器的下半部(上半部歸零)」的「AVX-128」,作為SSE的完美替代品(但MMX就無緣雨露均霑,畢竟沒和AVX共用暫存器),而Intel也鼓勵軟體開發者盡快用AVX-128替換SSE,設計處理器微架構時「讓常跑的工作跑得更快」,集中資源加速VEX編碼指令,便於用更低的成本打造出性能更好的產品,如投資更多的解碼器,提高每個時脈週期可完成解碼的指令數量。

照片中提到了VZEROUPPER、VZEROALL、VZEROUPPER,包含了眼睛、高級向量擴展、流式SIMD擴展、指令、中央處理器

況且,一旦程式碼混合AVX和SSE,會因為「SSE指令並不會知道XMM暫存器多長了一截」,從執行AVX轉向SSE指令前,Intel處理器要先硬體儲存YMM暫存器高位128位元的內容,轉回AVX時再恢復,而發生類似昔日MMX和80x87浮點交互切換平白耗費幾十個時脈週期的慘況,「AVX-128」卻沒有這樣的困擾,Intel當然希望SSE完全被AVX替換掉。

照片中提到了A、B、Penalty,跟JamPlay有關,包含了動畫片、英特爾、高級向量擴展、指令集架構、x86-32(32位Intel x86)

反觀AMD卻重蹈x86-64的REX覆轍,讓SSE5再度變成「化外之民」,指令解碼器需一路「爬」到DREX,再和Opcode3的內容「配對組合」後,才能確定暫存器號碼與順序,明顯不利產品實作。還好AMD沒真的悶著頭硬幹SSE5,讓推土機也乖乖的跟進AVX,只不過AMD到了Zen2才紮紮實實的提供「貨真價實」256位元寬的AVX執行單元,效能不再打對折。

照片中提到了2 Bytes、1 byte、1 or 2 bytes,包含了圖、x86、SIMD、2級、四級

暫存器長度和數量再度倍增的AVX-512

2013年Haswell的AVX2補足了運算元聚集指令,將大多數整數運算擴充到256位元,也具備了累積乘加運算(FMA,Fused Multiply-Add)。但這還不夠。在2013年隨著「Larrabee後代超級多核騎士團」Xeon Phi x200系列「Knights Landing」的AVX-512畢其功於一役,藉由指令編碼中的加強版VEX(Enhanced Vector Extension),一口氣達陣以下里程碑:

  • 定義512位元寬的ZMM暫存器,YMM的再延伸。

照片中提到了SSE, 128-bit (1999)、64-bit double、2,包含了英特爾SIMD、SIMD、處理器寄存器、AVX-512、指令集架構

  • SIMD暫存器倍增到32個,暫存器總資料量增加4倍。

照片中提到了AVX-512 - Greatly increased register file、32 x 512 bit registers、SSE,包含了rar、角度、線、rar、產品

  • 四運算元指令(像A = B × C + D)。
  • 8個向量遮罩暫存器。
  • 運算元聚集與分散指令。

照片中提到了KNL ISA、KNL implements all legacy instructions、Legacy binary runs w/o recompilation,包含了網頁、至強皮、英特爾、中央處理器、至強

猜猜看AMD何時支援版本混亂不堪的AVX-512

雖然Intel已經中止Xeon Phi產品線,但AVX-512仍將繼續發展下去,2020年的Cooper Lake將會跟著Google的腳步,對應指數小於FP32而動態範圍維持不變的BF16(bfloat16)浮點格式,提高「人工智慧應用的競爭能力」。

照片中提到了exponent、fraction、8 bits,包含了浮動32、bfloat16浮點格式、張量處理單元、32位計算、浮點運算

不過AMD遲遲尚未宣佈何時支援AVX-512,也許當看到版本亂成這樣,一衝下去恐怕所費不貲,大概也不知道該從何開始下手吧,據說2020年底的Zen3會「浮點運算提昇50%」,真是太讓人感到科科了。

照片中提到了AVX-512 Subset、F CD ER PF 4FMAPS 4VNNIW VL DQ BW IFMA VBMI VBMI2 VPOPCNTDQ BITALG VNNI VPCLMULQDQ GFNI VAES、Intel Knights Landing (2016),包含了情節、角度、線、點、粉紅M