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字首編碼將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
- 兆芯:
編譯器和組譯器對AVX指令集的支援情況[編輯]
- 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編譯器通過-cpuAVX32選項支援AVX
- Visual Studio 2010/2012 編譯器通過行內函數(intrinsic)和 /arch:AVX選項支援AVX
- NASM從2.03版本開始支援 AVX,並在 2.04 版本中,進行了許多與 AVX 相關的錯誤修復和更新[12]
作業系統對AVX指令集的支援情況[編輯]
AVX通過256 位寬的YMM暫存器添加了新的暫存器狀態,因此需要作業系統顯式支援,以在上下文交換時正確儲存和恢復AVX的擴充暫存器。以下作業系統版本支援 AVX:
- DragonFly BSD:在2013年初添加支援
- FreeBSD:在2012年1月21日提交的修補程式中添加支援,[13]該修補程式包含在9.1穩定版中[14]
- Linux:內核版本2.6.30(發佈於2009年6月9日[15])開始支援[16]
- macOS:從10.6.8版本(Snow Leopard,發佈於2011年6月23日)開始支援。[17]macOS Ventura 不支援沒有AVX2指令集的 x86 處理器[18]
- OpenBSD:在2015年3月21日添加支援[19]
- Solaris:在 Solaris 10 Update 10 和 Solaris 11 中開始支援。
- Windows:在 Windows 7 SP1(KB976932)、Windows Server 2008 R2 SP1、[20]Windows 8、Windows 10 中提供支援
- Windows Server 2008 R2 SP1 結合 Hyper-V 需要熱修復(KB2568088)以支援 AMD AVX(Opteron 6200 和 4200 系列)處理器
- Windows XP 和 Windows Server 2003 在內核驅動和用戶應用程式中都不支援 AVX
參見[編輯]
參考資料[編輯]
- ^ Kanter, David. Intel's Sandy Bridge Microarchitecture. www.realworldtech.com. September 25, 2010 [February 17, 2018]. (原始內容存檔於2019-08-16) (en-US).
- ^ 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).
- ^ i386 and x86-64 Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2026-04-19].
- ^ chessprogramming - AVX2. chessprogramming.wikispaces.com. [2026-04-19]. (原始內容存檔於2017-07-10).
- ^ Intel Offers Peek at Nehalem and Larrabee. ExtremeTech. March 17, 2008 [2024-10-31]. (原始內容存檔於2022-12-03).
- ^ Intel® Celeron® 6305 Processor (4M Cache, 1.80 GHz, with IPU) Product Specifications. ark.intel.com. [2020-11-10]. (原始內容存檔於2020-10-18) (English).
- ^ 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).
- ^ 开胜® KH-20000系列处理器 - 兆芯. www.zhaoxin.com. [2024-10-31]. (原始內容存檔於2025-01-20).
- ^ 开先® KX-5000系列处理器 - 兆芯. www.zhaoxin.com. [2024-10-31]. (原始內容存檔於2025-01-20).
- ^ What's New - RAD Studio. docwiki.embarcadero.com. [2021-09-17]. (原始內容存檔於2025-01-08).
- ^ GAS Changes. sourceware.org. [2024-05-03]. (原始內容存檔於2024-05-12).
- ^ NASM - The Netwide Assembler, Appendix C: NASM Version History. nasm.us. [2024-05-03]. (原始內容存檔於2025-01-18).
- ^ 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)
- ^ FreeBSD 9.1-RELEASE Announcement. [May 20, 2013]. (原始內容存檔於2020-12-22).
- ^ Linux 2.6.30 - Linux Kernel Newbies, [July 13, 2009], (原始內容存檔於2012-04-02)
- ^ x86: add linux kernel support for YMM state, [July 13, 2009]
- ^ Twitter, [June 23, 2010], (原始內容存檔於2024-08-23)
- ^ Devs are making progress getting macOS Ventura to run on unsupported, decade-old Macs. August 23, 2022 [2024-10-31]. (原始內容存檔於2025-01-18).
- ^ Add support for saving/restoring FPU state using the XSAVE/XRSTOR., [March 25, 2015], (原始內容存檔於2025-01-20)
- ^ Floating-Point Support for 64-Bit Drivers, [December 6, 2009], (原始內容存檔於2016-08-15)