天天看點

單資料多指令(SIMD) MMX SSE AVX概述SIMD資料類型簡介

概述

SIMD是指單指令多資料技術,它已經成為Intel處理器的重要性能擴充。目前Intel處理器支援的SIMD技術包括MMX,SSE,AVX.

MMX提供了8個64bit的寄存器進行SIMD操作,SSE系列提供了128bit的8個寄存器進行SIMD指令操作。而最新的AVX指令則支援256bit的SIMD操作。

目前SIMD指令可以有四種方法進行使用分别是彙編語言,C++類,編譯器Intrisincs和自動矢量化。

MMX

MMX是由英特爾開發的一種SIMD多媒體指令集,共有57條指令。它于1996年內建在英特爾奔騰 (Pentium) MMX處理器上,以提高其多媒體資料的處理能力。 MMX是Intel命名的矩陣數學擴充(Matrix Math eXtensions).MMX寄存器,稱作MM0到MM7,實際上就是處理器内部80比特字長的浮點寄存器棧st(0)到st(7)的尾數部分(64比特長)的複用。由于浮點棧寄存器的高16位未被MMX技術使用,是以這16位都置為1,是以從棧寄存器的角度看,其浮點值為NaN或Infinities,這可用于區分寄存器是處于浮點棧狀态還是MMX狀态. 作為MMX寄存器都是直接通路。利用了裝配資料類型(packed data type)的概念,每個MMX寄存器的64比特字長可以看作是2個32位整數、或者4個16位整數、或者8個8位整數,進而可以執行整數SIMD運算。這對于1990年代中期的2D、3D計算的加速還是很有意義的,因為當時的計算機的圖形處理器(GPU)還很不發達。但現在MMX整數SIMD運算對于圖形運算來說是多餘的技術了。不過MMX的飽和算術運算(saturation arithmetic operations)對于一些數字信号處理應用還是有用的。

SSE(Streaming SIMD Extensions)

是英特爾在AMD的3D Now!釋出一年之後,在其計算機晶片Pentium III中引入的指令集,是繼MMX的擴充指令集。SSE 指令集提供了 70 條新指令。AMD後來在Athlon XP中加入了對這個新指令集的支援。SSE 加入新的 8 個 128 位元暫存器(XMM0~XMM7)。 由于 SSE 加入了浮點支援,SSE 就比 MMX 更加常用。而 SSE2 加入了整數運算支援之後讓 SSE 更加的有彈性,當 MMX 變成是多餘的指令集,SSE 指令集甚至可以與 MMX 并行運作,在某些時候可以提供額外的性能增進。

AVX

AVX(Advanced Vector Extensions) 是Intel的SSE延伸架構,如IA16至IA32般的把暫存器XMM 128bit提升至YMM 256bit,以增加一倍的運算效率。此架構支援了三運算指令(3-Operand Instructions),減少在編碼上需要先複制才能運算的動作。在微碼部分使用了LES LDS這兩少用的指令作為延伸指令Prefix。目前Apple OS X 10.6.8(雪豹的更新版本)及更高,Linux 2.6.30 核心以後,以及Windows 7 SP1(Service Pack 1) KB976932,Windows Server 2008 RC2 SP1 與 Windows 8 支援AVX,Windows XP應該不支援

FMA

  • FMA是Intel的AVX擴充指令集,如名稱上熔合乘法累積(Fused Multiply Accumulate)的意思一樣。

SIMD資料類型簡介

  SIMD資料類型有——

__m64:64位緊縮整數(MMX)。

__m128:128位緊縮單精度(SSE)。

__m128d:128位緊縮雙精度(SSE2)。

__m128i:128位緊縮整數(SSE2)。

__m256:256位緊縮單精度(AVX)。

__m256d:256位緊縮雙精度(AVX)。

__m256i:256位緊縮整數(AVX)。

注:緊縮整數包括了8位、16位、32位、64位的帶符号和無符号整數。

  這些資料類型與寄存器的對應關系為——

64位MM寄存器(MM0~MM7):__m64。

128位SSE寄存器(XMM0~XMM15):__m128、__m128d、__m128i。

256位AVX寄存器(YMM0~YMM15):__m256、__m256d、__m256i。

繼續閱讀