【整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令集大全
http://blog.csdn.net/conowen/article/details/7255920
 
SIMD
 
SIMD單指令流多數據流(SingleInstruction Multiple Data,SIMD)是一種采用一個控制器來控制多個處理器,同時對一組數據(又稱“數據向量”)中的每一個分別執行相同的操作從而實現空間上的并行性的技術。在微處理器中,單指令流多數據流技術則是一個控制器控制多個平行的處理微元,例如Intel的MMX或SSE以及AMD的3D Now!技術。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
MMX是由英特爾開發的一種SIMD多媒體指令集,共有57條指令。它于1996年集成在英特爾奔騰 (Pentium) MMX處理器上,以提高其多媒體數據的處理能力。
其優點是增加了處理器關于多媒體方面的處理能力,缺點是占用浮點數寄存器進行運算(64位MMX寄存器實際上就是浮點數寄存器的別名)以至于MMX指令和浮點數操作不能同時工作。為了減少在MMX和浮點數模式切換之間所消耗的時間,程序員們盡可能減少模式切換的次數,也就是說,這兩種操作在應用上是互斥的。后來英特爾在此基礎上發展出SSE指令集;AMD在此基礎上發展出3DNow!指令集。現在新開發的程序不再僅使用MMX來優化軟件執行效能,而是改使用如SSE、3DNOW!等更容易優化效能的新一代多媒體指令集,不過目前的處理器仍可以執行針對MMX優化的較早期軟件。
技術細節
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的飽和算術運算(saturationarithmeticoperations)對于一些數字信號處理應用還是有用的。
SIMD技術的發展
繼 MMX技術之后,Intel又于1999年在Pentium-III處理器上推出SSE技術,引入了新的128比特寬的寄存器集 (register file),稱作XMM0到XMM7。這些XMM寄存器用于4個單精度浮點數運算的SIMD執行,并可以與MMX整數運算或x87浮點運算混合執行。 2001年在Pentium 4上引入了SSE2技術,進一步擴展了指令集,使得XMM寄存器上可以執行8/16/32位寬的整數SIMD運算或雙精度浮點數的SIMD運算。這使得 SIMD技術基本完善。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
SSE
 
SSE(Streaming SIMD Extensions)是英特爾在AMD的3DNow!發布一年之后,在其計算機芯片Pentium III中引入的指令集,是繼MMX的擴充指令集。SSE 指令集提供了 70 條新指令。AMD后來在Athlon XP中加入了對這個新指令集的支持。
| 目錄 ?[隱藏]? 
 | 
SSE的緩存器
SSE 加入新的 8 個 128 位緩存器(XMM0~XMM7)。而 AMD 發表的x86-64延伸架構《又稱 AMD64》再加入額外 8 個緩存器。除此之外還有一個新的 32 位的控制/狀態緩存器(MXCSR)。不過只能在 64 位的模式下才能使用額外 8 個緩存器。
每 個緩存器可以容納 4 個 32 位單精度浮點數,或是2 個 64 位雙精度浮點數,或是 4 個 32 位整數,或是 8 個 16 位短整數,或是 16 個字符。整數運算能夠使用正負號運算。而整數 SIMD 運算可能仍然要與 8 個 64 位 MMX 緩存器一起執行。
因為操作系統必須要在進程切換的時候保護這些 128 位的緩存器狀態,除非操作系統去啟動這些緩存器,否則默認值是不會去啟用的。這表示操作系統必須要知道如何使用 FXSAVE 與 FXRSTOR 指令才能儲存 x87 與 SSE 緩存器的狀態。而在當時 IA-32 的主流操作系統很快的都加入了此功能。
由于 SSE 加入了浮點支持,SSE 就比MMX 更加常用。而 SSE2 加入了整數運算支持之后讓SSE 更加的有彈性,當 MMX 變成是多余的指令集,SSE 指令集甚至可以與 MMX 并行運作,在某些時候可以提供額外的性能增進。
第一個支持 SSE 的 CPU 是 Pentium III,在FPU 與SSE 之間共享執行支持。當編譯出來的軟件能夠交叉的同時以 FPU 與 SSE 運作,Pentium III 并無法在同一個周期中同時執行 FPU 與 SSE。這個限制降低了指令管線的有效性,不過 XMM 緩存器能夠讓 SIMD 與純量浮點運算混合執行,而不會因為切換 MMX/浮點模式而產生性能的折損。
SSE指令表
SSE 提供純量與包裹式(packed)浮點指令。
浮點指令
- 內存到緩存器/緩存器到內存/緩存器之間的數據搬移 - 純量 – MOVSS
- 包裹式 – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
 
- 數學運算 - 純量 – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- 包裹式 – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
 
- 比較 - 純量 – CMPSS, COMISS, UCOMISS
- 包裹式 – CMPPS
 
- 資料拆包(unpack)與隨機搬移(shuffle) - 包裹式 – SHUFPS, UNPCKHPS, UNPCKLPS
 
- 數據型態轉換 - 純量 – CVTSI2SS, CVTSS2SI, CVTTSS2SI
- 包裹式 – CVTPI2PS, CVTPS2PI, CVTTPS2PI
 
- 逐位邏輯運算 - 包裹式 – ANDPS, ORPS, XORPS, ANDNPS
 
整數指令
- 數學運算 - PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
 
- 數據搬移 - PEXTRW, PINSRW
 
- 其他 - PMOVMSKB, PSHUFW
 
其他指令
- MXCSR 管理 - LDMXCSR, STMXCSR
 
- 快取與內存管理 - MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
 
后續版本
SSE2
SSE2是 Intel在Pentium 4處理器的最初版本中引入的,但是AMD后來在Opteron 和Athlon64處理器中也加入了SSE2的支持。SSE2指令集添加了對64位雙精度浮點數的支持,以及對整型數據的支持,也就是說這個指令集中所有的MMX指令都是多余的了,同時也避免了占用浮點數寄存器。這個指令集還增加了對CPU快取的控制指令。AMD對它的擴展增加了8個XMM寄存器,但是需要切換到64位 模式(x86-64/AMD64)才可以使用這些寄存器。Intel后來在其Intel 64架構中也增加了對x86-64的支持。
SSE3
SSE3是 Intel在Pentium 4處理器的 Prescott 核心中引入的第三代SIMD指令集,AMD在Athlon64的第五個版本,Venice核心中也加入了SSE3的支持。這個指令集擴展的指令包含寄存器的局部位之間的運算,例如高位和低位之間的加減運算;浮點數到整數的轉換,以及對超線程技術的支持。
SSSE3
SSSE3是Intel針對SSE3指令集的一次額外擴充,最早內建于Core2 Duo處理器中。
SSE4
SSE4是Intel在Penryn核心的Core 2 Duo與Core2 Solo處理器時,新增的47條新多媒體指令集,并且現在更新至SSE4.2。AMD也開發了屬于自己的SSE4a多媒體指令集,并內建在Phenom與Opteron等K10架構處理器中,不過無法與Intel的SSE4系列指令集兼容。
SSE5
SSE5是AMD為了打破Intel壟斷在處理器指令集的獨霸地位所提出的,SSE5初期規劃將加入超過100條新指令,其中最引人注目的就是三操作數指令(3-OperandInstructions)及熔合乘法累積(Fused Multiply Accumulate)。其中,三操作數指令讓處理器可將一個數學或邏輯函式庫,套用到操作數或輸入數據。藉由增加操作數的數量,一個 x86 指令能處理二至三筆數據, SSE5 允許將多個簡單指令匯整成一個指令,達到更有效率的指令處理模式。提升為三運算指令的運算能力,是少數RISC架構 的水平。熔合乘法累積讓允許建立新的指令,有效率地執行各種復雜的運算。熔合乘法累積可結合乘法與加法運算,透過單一指令執行多筆重復計算。透過簡化程序碼,讓系統能迅速執行繪圖著色、快速相片著色、音場音效,以及復雜向量演算等效能密集的應用作業。目前AMD已放棄下一代Bulldozer核心內建SSE5指令集,改內建Intel授權SSE4系列指令集。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
AVX
是Sandy Bridge和Larrabee架構新指令集 Intel的微架構也進入了全速發展的時期,在2010年4月結束的IDF峰會上Intel公司就發布了2010年的RoadMap。2011年1月Intel發布全新的處理器微架構Sandy Bridge,其中全新增加的指令集也將帶來CPU性能的提升。
??????? AVX(Advanced Vector Extensions) 是Intel的SSE延伸架構,如IA16至IA32般的把緩存器XMM 128bit提升至YMM 256bit,以增加一倍的運算效率。此架構支持了三運算指令(3-Operand Instructions),減少在編碼上需要先復制才能運算的動作。在微碼部分使用了LES LDS這兩少用的指令作為延伸指令Prefix。
FMA
- FMA是Intel的AVX擴充指令集,如名稱上熔合乘法累積(Fused Multiply Accumulate)的意思一樣。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
3DNow!
3DNow!(據稱是“3D No Waiting!”的縮寫)是由AMD開發的一套SIMD多媒體指令集,支持單精度浮點數的矢量運算,用于增強x86架構的計算機在三維圖像處理上的性能。
| 目錄 ?[隱藏]? 
 | 
歷史
1996年Intel首先推出了支持MMX的Pentium處理器,極大地提高了CPU處理多媒體數據的能力,被廣泛地應用于語音合成、語音識別、音頻視頻編解碼、圖像處理和串流媒體等領域。但是MMX只支持整數運算,浮點數運算仍然要使用傳統的x87協處理器指令。由于MMX與x87的寄存器相互重疊,在MMX代碼中插入x87指令時必須先執行EMMS指令清除MMX狀態,頻繁地切換狀態將嚴重影響性能。這限制了MMX指令在需要大量浮點運算的程序,如三維幾何變換、裁剪和投影中的應用。
另一方面,由于x87古怪的堆棧式緩存器結構,使得硬件上將其流水線化和軟件上合理調度指令都很困難,這成為提高x86架構浮點性能的一個瓶頸。
為了解決以上這兩個問題,AMD公司于1998年推出了包含21條指令的3DNow!指令集,并在其K6-2處理器中實現。K6-2是 第一個能執行浮點SIMD指令的x86處理器,也是第一個支持水平浮點寄存器模型的x86處理器。借助3DNow!,K6-2實現了x86處理器上最快的浮點單元,在每個時鐘周期內最多可得到4個單精度浮點數結果,是傳統x87協處理器的4倍。許多游戲廠商為3DNow!優化了程序,微軟的DirectX 7也為3DNow!做了優化,AMD處理器的游戲性能第一次超過Intel,這大大提升了AMD在消費者心目中的地位。K6-2和隨后的K6-III成為市場上的熱門貨。
1999年,隨著Athlon處理器的推出,AMD為3DNow!增加了5條新的指令,用于增強其在DSP方面的性能,它們被稱為“擴展3DNow!”(Extended 3DNow!)。
為了對抗3DNow!,Intel公司于1999年推出了SSE指令集。SSE幾乎能提供3DNow!的所有功能,而且能在一條指令中處理兩倍多的單精度浮點數;同時,SSE完全支持IEEE 754,在處理單精度浮點數時可以完全代替x87。這迅速瓦解了3DNow!的優勢。
1999年后,隨著主流操作系統和軟件都開始支持SSE并為SSE優化,AMD在其2000年發布的代號為“Thunderbird”的Athlon處理器中添加了對SSE的完全支持(“經典”的Athlon或K7只支持SSE中與MMX有關的部分,AMD稱之為“擴展MMX”即Extended MMX)。隨后,AMD致力于AMD64架構的開發;在SIMD指令集方面,AMD跟隨Intel,為自己的處理器添加SSE2和SSE3支持,而不再改進3DNow!。
2010年八月,AMD宣布將在新一代處理器中取消除了兩條數據預取指令之外3DNow!指令的支持,并鼓勵開發者將3DNow!代碼重新用SSE實現。
支持檢測
支持3DNow!的CPU的CPUID擴展功能字(EAX=80000001h時執行CPUID指令得到的EDX的內容)的(從低位到高位)第31位為1。支持擴展3DNow!的CPU的CPUID擴展功能字的(從低位到高位)第30位為1。
K6-2以后AMD所有的x86處理器都支持3DNow!,包括最新的Athlon 64、Opteron和Sempron處理器;Cyrix等一些其他廠家生產的某些處理器也支持3DNow!;但Intel生產的所有處理器都不支持3DNow!。
執行環境
3DNow!指令的執行環境與MMX一樣,都是將8個x87寄存器ST0~ST7的低64位重命名為MMX寄存器MM0~MM7,并依平坦模式進行操作(即指令可以任意訪問這8個寄存器中的任何一個而不必使用堆棧)。
由于3DNow!使用的寄存器與x87寄存器重疊,任務切換時,保存x87寄存器狀態的同時也保存了3DNow!的狀態,所以3DNow!不需要操作系統的額外支持。只要CPU支持3DNow!,含有3DNow!代碼的程序可以在只考慮到x87狀態的原有的操作系統上不加修改地運行。
由于3DNow!依平坦模式訪問寄存器,對3DNow!浮點單元的管線化變得容易,這也利于編譯器生成高效的浮點代碼。
3DNow!指令集
3DNow!和擴展3DNow!的26條指令從功能上可以分為以下五類。
單精度浮點運算指令
此類指令的操作數均為64位,其高32位和低32位分別是IEEE754格式的單精度浮點數。大部分指令一次可接受兩個這樣的操作數,并得到兩個單精度浮點數的結果。它們的匯編語言助記符都以PF開頭。
3DNow!還包含有計算單精度倒數和開方倒數的指令,并可以依程序需要,得到12位精度和24位精度的結果。這些指令一次只能處理一個單精度浮點數。
3DNow!的一個特色是可以將同一寄存器內的64位操作數中的兩個單精度浮點數相加或相乘,這在復數運算和內積運算中非常有用。Intel直到最近才在SSE3指令集中增加了這項功能,稱之為“水平操作”。
為了保證與舊有操作系統的兼容性,與MMX指令一樣,3DNow!指令不引發任何算術異常。3DNow!指令不會生成也不能正確處理NaN和非規格化數,也不支持指定舍入模式。因此3DNow!并不是IEEE 754的一個完整實現,即使是只涉及單精度浮點數時也不能完全代替x87。
增強的MMX指令
PAVGUSB用于求64位緊縮字節(8×8位字節)的平均值,可用于視頻編碼中的像素平均和圖像縮放等。可能是意識到這個功能的重要性,Intel在SSE中添加了功能完全相同的PAVGB指令。
PMULHRW則用來補充MMX指令PMULHW的不足,在緊縮字(4×16位字)相乘時可以得到比后者更準確的結果。Intel直到最近才在SSSE3中增加了功能相似的指令PMULHRSW。
PSWAPD指令用于交換緊縮雙字(2×32位字)中兩個雙字數據的位置。
數據類型轉換指令
PF2ID、PI2FD等4條指令用于完成整數和單精度浮點數之間的相互轉換。
數據預取指令
PREFETCH/PREFETCHW指令用于把將要使用到的數據從主存儲器提前加載快取中,以減少訪問主存儲器的指令執行時的延遲。Intel在SSE中添加了類似的PREFETCHTx指令
快速退出MMX狀態指令
FEMMS指令與MMX中的EMMS功能相同,用于退出MMX狀態。在K6-2和K6-III處理器中,FEMMS比EMMS更快;在Athlon及更新的處理器中,FEMMS等同于EMMS。
?
?--------------------------------------------------------------------------------------------------------------------------------------------------------------------
?
Neon
ARM??NEON??通用?SIMD?引擎可有效處理當前和將來的多媒體格式,從而改善用戶體驗。
NEON 技術可加速多媒體和信號處理算法(如視頻編碼/解碼、2D/3D 圖形、游戲、音頻和語音處理、圖像處理技術、電話和聲音合成),其性能至少為 ARMv5 性能的 3 倍,為?ARMv6?SIMD 性能的 2 倍。
NEON 技術是通過干凈方式構建的,并可無縫用于其本身的獨立管道和寄存器文件。NEON?技術是 ARM?Cortex?-A 系列處理器的 128 位 SIMD(單指令多數據)體系結構擴展,旨在為消費性多媒體應用提供靈活強大的加速功能,從而明顯改善用戶體驗。?它具有 32 個寄存器,64 位寬(是 16 個寄存器,128 位寬的雙倍視圖。)
NEON 指令可執行“打包的 SIMD”處理:
- 寄存器被視為同一數據類型的元素的矢量
- 數據類型可為:簽名/未簽名的 8 位、16 位、32 位、64 位單精度浮點
- 指令在所有通道中執行同一操作
使用 NEON 技術的?ARM?Cortex?-A 系列處理器,以及 ARM 的?Mali 多媒體硬件解決方案可用于多媒體應用,范圍從智能手機和移動計算設備到HDTV。
 
注:Nvidia Tegra2處理器閹割了Neon協處理器,視頻能力很雞肋
總結
以上是生活随笔為你收集整理的【整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令集大全的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MMX技术
- 下一篇: MMX, SSE(XMM,MXCSR,F
