AVX指令集

維基百科,自由的百科全書
(重新導向自AVX
跳至導覽 跳至搜尋

進階向量擴充指令集(英語:Advanced Vector Extensions,簡稱AVX)是x86架構微處理器中的SIMD擴充指令集,由英特爾在2008年3月提出,並在2011年第一季度發佈的Sandy Bridge系列處理器中首次支援[1]。AMD在隨後的2011年第三季度發佈的Bulldozer系列處理器中開始支援AVX[2]。AVX指令集提供了新的特性、指令和編碼方案。

AVX是X86指令集的SSE延伸架構,如IA16至IA32般的把暫存器XMM 128bit提升至YMM 256bit,以增加一倍的運算效率。此架構支援了三運算指令(3-Operand Instructions),減少在編碼上需要先複製才能運算的動作。在微碼部分使用了LES LDS這兩少用的指令作為延伸指令Prefix。[查證請求]

AVX2指令集將大多數整數命令操作擴充到256位,並引入了熔合乘法累積(FMA)運算。它們由Intel在2013年發佈的Haswell微架構中首次支援。

AVX-512則使用新的EVEX字首英語EVEX prefix編碼將AVX指令進一步擴充到512位元,由Intel在2016年發佈的Knights Landing協處理器中首次支援。Intel Xeon Scalable處理器支援AVX-512。

介紹[編輯]

AVX使用十六個YMM暫存器,通過單條指令對多組數據執行操作(參見 SIMD)。每個YMM暫存器可同時儲存並對以下數據進行並列運算:  

  • 八個 32 位單精度浮點數;或  
  • 四個 64 位雙精度浮點數。  

SIMD 暫存器的寬度從128位元擴充至256位,並將XMM0~XMM7重新命名為YMM0~YMM7(在x86-64模式下,則為XMM0~XMM15重新命名為YMM0~YMM15)。因此傳統的SSE指令仍可通過VEX字首操作於YMM暫存器的低 128 位。

AVX 引入了一種名為VEX編碼方案的三運算元SIMD指令格式,其中目標暫存器與兩個源運算元不同。例如,原本採用傳統雙運算元形式的SSE指令 a ← a + b,現在可採用非破壞性的三運算元形式 c ← a + b,從而保留兩個源運算元。最初,AVX的三運算元格式僅適用於具有SIMD運算元(YMM)的指令,不包括通用暫存器(如 EAX)相關的指令。隨後在 BMI 等擴充中,該編碼方案被用於為通用暫存器上的新指令進行編碼。VEX 編碼也用於操作 AVX-512 引入的 k0–k7 遮罩暫存器的指令。

SIMD主記憶體運算元的對齊要求已被放寬。與未使用VEX編碼的對應指令不同,大多數使用VEX編碼的向量指令不再要求其主記憶體運算元必須按向量大小對齊。值得注意的是,VMOVDQA指令仍要求其主記憶體運算元必須對齊。

新的VEX編碼方案引入了一組新的代碼字首,擴充了操作碼空間,允許指令擁有超過兩個運算元,並支援SIMD向量暫存器長度超過128位元。該VEX字首也可用於傳統SSE指令,賦予其三運算元形式,使其無需依賴VZEROUPPER和VZEROALL即可更高效地與AVX指令互動。

AVX指令同時支援128位元和256位SIMD。128位元版本可用於在不擴大向量化寬度的前提下最佳化舊代碼,並避免從SSE切換到AVX所帶來的效能懲罰;在某些早期AMD的AVX實現中,這些指令執行更快。此模式有時被稱為 AVX-128。[3]

與SSE系列相比,AVX在數碼媒體播放、網頁瀏覽、非對稱加密等方面進一步提升了效能。

新指令  [編輯]

這些AVX指令是在對傳統128位元SSE指令的256位擴充指令之外新增的;其中大多數既可用於128位元運算元,也可用於256位元運算數。

指令 描述
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 廣播載入:將一個 32 位、64 位或 128 位的主記憶體運算元複製到 XMM 或 YMM 暫存器的所有元素中。
VINSERTF128 128 位替換:將 256 位 YMM 暫存器的下半部分或上半部分替換為一個 128 位源運算元的值,暫存器的另一半保持不變。
VEXTRACTF128 128 位提取:提取 256 位 YMM 暫存器的下半部分或上半部分,並將其複製到 128 位目標運算元中
VMASKMOVPS, VMASKMOVPD 條件 SIMD 載入/儲存:根據遮罩,從 SIMD 向量主記憶體運算元中有條件地讀取任意數量的元素到目標暫存器,未讀取的元素位置置零;或從 SIMD 向量暫存器中有條件地將任意數量的元素寫入主記憶體運算元,主記憶體中未被寫入的元素保持不變。

需要注意的是,在 AMD Jaguar 處理器架構中,當遮罩為零時,該指令(主記憶體源運算元版本)耗時超過 300 個時鐘周期——儘管此時指令本應什麼也不做。這被認為是一個設計缺陷。

VPERMILPS, VPERMILPD 通道內建換(Permute In-Lane):對輸入運算元的 32 位或 64 位向量元素進行打亂。這是一類作用於 256 位的「通道內」指令,即在兩個獨立的 128 位通道內分別執行打亂操作,因此無法跨 128 位通道進行元素交換[4]
VPERM2F128 跨通道打亂(Shuffle):將兩個 256 位源運算元中的四個 128 位向量元素,依據一個立即數選擇器,打亂後送入 256 位目標運算元
VTESTPS, VTESTPD 打包符號位測試:對打包的單精度或雙精度浮點數的符號位進行位測試,根據「與」(AND)的結果設置 ZF 標誌,根據「與非」(ANDN)的結果設置 CF 標誌
VZEROALL 清零所有 YMM 暫存器:將所有 YMM 暫存器置零,並標記為未使用。該操作通常在 128 位與 256 位使用模式切換時執行
VZEROUPPER 清零 YMM 暫存器上半部分:將所有 YMM 暫存器的上半部分置零,用於從 256 位元型樣切換回 128 位元型樣時清空高 128 位

支援[編輯]

CPU對AVX指令集的支援情況[編輯]

  • 英特爾
    • Sandy Bridge(2011年Q1)及更新的的處理器(除賽揚和奔騰)均支援[5]
    • Tiger Lake(2020年Q3)及更新的的奔騰和賽揚處理器均支援[6]
  • AMD:
    • 推土機微架構(2011年Q4)及更新的處理器均支援[7]
  • 威盛電子
    • Nano QuadCore
    • Eden X4
  • 兆芯:
    • 基於五道口架構的處理器(KX-5000及KH-20000)[8][9]

編譯器和組譯器對AVX指令集的支援情況[編輯]

  • Absoft英語Absoft編譯器支援-mavx選項
  • Free Pascal編譯器從2.7.1版本開始為AVX和AVX2提供-CfAVX和-CfAVX2選項
  • Delphi從RAD studio v11.0 Alexandria版本開始支援AVX2和AVX512[10]
  • GNU組譯器GNU Binutils 2.19版本開始支援AVX[11]
  • 4.6版本的GCC和11.1版本的Intel編譯器套件開始支援AVX
  • Open64編譯器從4.5.1版本開始使用-mavx標誌支援AVX
  • PathScale編譯器支援-mavx選項
  • Vector Pascal英語Vector Pascal編譯器通過-cpuAVX32選項支援AVX
  • Visual Studio 2010/2012 編譯器通過行內函數(intrinsic)和 /arch:AVX選項支援AVX
  • NASM從2.03版本開始支援 AVX,並在 2.04 版本中,進行了許多與 AVX 相關的錯誤修復和更新[12]

作業系統對AVX指令集的支援情況[編輯]

AVX通過256 位寬的YMM暫存器添加了新的暫存器狀態,因此需要作業系統顯式支援,以在上下文交換時正確儲存和恢復AVX的擴充暫存器。以下作業系統版本支援 AVX:

參見[編輯]

參考資料[編輯]

  1. ^ Kanter, David. Intel's Sandy Bridge Microarchitecture. www.realworldtech.com. September 25, 2010 [February 17, 2018]. (原始內容存檔於2019-08-16) (en-US). 
  2. ^ Hruska, Joel. Analyzing Bulldozer: Why AMD's chip is so disappointing - Page 4 of 5 - ExtremeTech. ExtremeTech. October 24, 2011 [February 17, 2018]. (原始內容存檔於2019-08-16) (en-US). 
  3. ^ i386 and x86-64 Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2026-04-19]. 
  4. ^ chessprogramming - AVX2. chessprogramming.wikispaces.com. [2026-04-19]. (原始內容存檔於2017-07-10). 
  5. ^ Intel Offers Peek at Nehalem and Larrabee. ExtremeTech. March 17, 2008 [2024-10-31]. (原始內容存檔於2022-12-03). 
  6. ^ Intel® Celeron® 6305 Processor (4M Cache, 1.80 GHz, with IPU) Product Specifications. ark.intel.com. [2020-11-10]. (原始內容存檔於2020-10-18) (English). 
  7. ^ Butler, Michael; Barnes, Leslie; Das Sarma, Debjit; Gelinas, Bob. Bulldozer: An Approach to Multithreaded Compute Performance (PDF). IEEE Micro. March–April 2011, 31 (2): 6–15. S2CID 28236214. doi:10.1109/MM.2011.23. (原始內容 (PDF)存檔於May 19, 2024). 
  8. ^ 开胜® KH-20000系列处理器 - 兆芯. www.zhaoxin.com. [2024-10-31]. (原始內容存檔於2025-01-20). 
  9. ^ 开先® KX-5000系列处理器 - 兆芯. www.zhaoxin.com. [2024-10-31]. (原始內容存檔於2025-01-20). 
  10. ^ What's New - RAD Studio. docwiki.embarcadero.com. [2021-09-17]. (原始內容存檔於2025-01-08). 
  11. ^ GAS Changes. sourceware.org. [2024-05-03]. (原始內容存檔於2024-05-12). 
  12. ^ NASM - The Netwide Assembler, Appendix C: NASM Version History. nasm.us. [2024-05-03]. (原始內容存檔於2025-01-18). 
  13. ^ Add support for the extended FPU states on amd64, both for native 64bit and 32bit ABIs, svnweb.freebsd.org, January 21, 2012 [January 22, 2012], (原始內容存檔於2025-01-23) 
  14. ^ FreeBSD 9.1-RELEASE Announcement. [May 20, 2013]. (原始內容存檔於2020-12-22). 
  15. ^ Linux 2.6.30 - Linux Kernel Newbies, [July 13, 2009], (原始內容存檔於2012-04-02) 
  16. ^ x86: add linux kernel support for YMM state, [July 13, 2009] 
  17. ^ Twitter, [June 23, 2010], (原始內容存檔於2024-08-23) 
  18. ^ Devs are making progress getting macOS Ventura to run on unsupported, decade-old Macs. August 23, 2022 [2024-10-31]. (原始內容存檔於2025-01-18). 
  19. ^ Add support for saving/restoring FPU state using the XSAVE/XRSTOR., [March 25, 2015], (原始內容存檔於2025-01-20) 
  20. ^ Floating-Point Support for 64-Bit Drivers, [December 6, 2009], (原始內容存檔於2016-08-15) 

外部連結[編輯]