SSE檢視原始碼討論檢視歷史
SSE |
中文名: 因特網數據流單指令序列擴展 外文名: Streaming SIMD Extensions 簡 介: 是指令集的簡稱 簡 稱: SSE 包 括: 70條指令 |
SSE(Streaming SIMD Extensions)是英特爾在AMD的3D Now!發布一年之後,在其計算機芯片Pentium III中引入的指令集,是繼MMX的擴展指令集。SSE指令集提供了70條新指令。AMD後來在Athlon XP中加入了對這個新指令集的支持。[1]
簡介
SSE是 「因特網數據流單指令序列擴展 ( Internet Streaming SIMD Extensions)的縮寫。SSE除保持原有的MMX指令外,又新增了70條指令,在加快浮點運算的同時,改善了內存的使用效率,使內存速度更快。它對遊戲性能的改善十分顯著,按Intel的說法,SSE對下述幾個領域的影響特別明顯:3D幾何運算及動畫處理、圖形處理(如Photoshop)、視頻編輯/壓縮/解壓(如MPEG和DVD)、語音識別以及聲音壓縮和合成等。 SSE由一組隊結構的擴展組成,用以提高先進的媒體和通信應用程序的性能。該擴展(包括新的寄存器、新的數據類型和新的指令)與單指令多數據(SIMD)技術相結合,有利於加速應用程序的運行。這個擴展與MMX技術相結合,將顯著地提高多媒體應用程序的效率。 典型的應用程序是:運動視頻,圖形和視頻的組合,圖像處理,音頻合成,語音的識別、合成與壓縮,電話、視頻會議和2D,3D圖形。對於需要有規律地訪問大量數據的應用程序,也可以從流式SIMD擴展的高性能預取和存儲方面獲得好處。 SSE定義了一種簡單靈活的軟件模式。這種新的模式引入了一種新的操作系統可視狀態。為了增強並行性,它增加了一組新的寄存器。現存的各種軟件,可以在不作修改的情況下繼續在增加了SSE的IA處理器上正確運行。SSE引入了一組新的、通用的浮點指令,可對8個128位SIMD浮點寄存器組進行操作。SSE 指令系統使得程序設計人員能夠去設計這樣一類的算法,即SSE指令和MMX指令兩者混合在一起的緊縮單精度浮點運算和緊縮整型運算的算法。SSE 提供了一些新的指令以控制整個MMX數據類型和32位數據類型的可高速緩存性,能夠將數據流直接送存儲器而不涉及Cache。SSE還提供了能夠預取數據的新指令。SSE對於IA編程環境而言,提供了如下的新擴展: ●8個SIMD浮點寄存器(XMM0~XMM7); ●SIMD浮點數據類型(128位緊縮浮點數); ●SSE指令系統。 SIMD浮點寄存器 IA的SSE提供了8個128位的通用寄存器,每個寄存器可以直接尋址。這些寄存器都是新的,需要能使用該類寄存器的操作系統支持。 SIMD浮點寄存器保存着緊縮的128位數據。流式SIMD擴展指令訪問SIMD浮點寄存器時,直接使用寄存器名XMM0~XMM7。SIMD浮點寄存器可被用以完成數據計算,但不能用來尋址存儲器。尋址仍然使用整型寄存器來實現,並且採用標準的IA尋址方式以及通用寄存器名。 MMX寄存器被映射為浮點寄存器。從MMX操作轉換到浮點操作需要執行EMMS指令。由於SIMD浮點寄存器是一個獨立的寄存器文件,因此MMX指令和浮點指令都能夠與流式SIMD擴展指令混合在一起,而不需要執行如EMMS指令那樣的特殊操作。 SIMD浮點數據類型 IA流式SIMD擴展的基本數據類型是緊縮單精度浮點操作數,即4個32位,單精度浮點(SP ~ FP)數。新的SIMD整型指令可以按緊縮字節、緊縮字或者緊縮雙字的數據類型進行操作。新的預取指令是在32字節或者更大的數據規模基礎之上工作的,它不管這些數據屬於何種類型。4個32位單精度浮點數編號為0~3,第0個數據位於寄存器的低32位之中。 SSE與存儲器之間的緊縮數據(單精度的浮點雙字)傳送,按64位的塊或者128位的塊來進行。但是,當按緊縮數據類型執行算術操作或者邏輯操作時,卻按SIMD浮點寄存器中4個獨立的雙字並行地進行操作。新的SIMD整型指令遵循MMX指令的慣例,按MMX寄存器的數據類型,而不是按SIMD浮點128位寄存器的數據類型進行操作。 SIMD執行方式 SSE使用單指令多數據(SIMD)技術,按照128位浮點寄存器中的單精度浮點數完成算術和邏輯操作。這種技術通過一條指令並行地處理多個數據元素,以提高軟件的速度性能。流式SIMD擴展支持緊縮的單精度浮點數據類型的操作,其SIMD整型指令支持緊縮整型數據類型(字節、字、雙字)的操作。SSE 指令能夠在保護方式、實地址方式和虛擬8086方式下運行。 數據格式 SSE的緊縮128位數據,編號為0~127。位0為最低有效位(ISB),127為最高有效位( MSB)。當存儲數據時,128位的數據總是按「小端」法進行排序,即低地址的字節為低有效字節,高地址的字節為高有效字節。 Pentium II處理器的SIMD浮點指令以32位單精度浮點數據為單位進行操作。SIMD浮點寄存器中的值與存儲器中的128位數具有相同的格式。 當存儲器存儲實型數時,單精度實型值按4個連續的字節存儲在存儲器中。128位的訪問方式用於128位的存儲器訪問SIMD浮點寄存器之間的128位傳送以及所有的邏輯展開/算術指令操作。32位的訪問方式則用於32位的存儲器訪問、SIMD浮點寄存器之間的32位傳送以及各種算術指令操作。其中,算術指令有128位操作的,也有32位操作的。 [[SIMD浮點控制]/狀態寄存器 控制/狀態寄存器MXCSR用來屏蔽/開放數值異常處理、設置捨入方式、設置清零方式和觀察狀態標誌。該寄存器的內容可以通過LDMXCSR和FXRSTOR指令來加載,通過STMXSCRR和FXSAVE指令將它存入存儲器。 寄存器中的位5 ~位0表示是否檢測到SIMD浮點數值異常。它們是「粘貼( Sticky)"標誌,通過LDMXSCR指令對相應字段寫0可以清除這些標誌。如果LDMXCSR指令清除了相應的屏蔽位之後又對相應的異常標誌置1,不會立即產生異常。只有在下一次SSE擴展處理時,出現了這種異常條件才會發生異常。SSE的每種異常只有一個異常標誌,因此一次緊縮數據(4個SP浮點數)操作時,不能為每個數據操作提供異常報告。在同一條指令之內出現多個異常條件時,則修改相關的異常標誌並且指示着這些條件中最後一個異常條件所發生的異常。在復位時,這些標誌將被清除。 位12~位7組成數值異常屏蔽。如果相應的位置1,則該種異常被屏蔽;如果相應的位被清除,則該種異常開放。在復位時,這些位全被置為1,意味着屏蔽所有的數值異常。 位14~位13為捨入控制字段。舍人控制除提供定向捨入、截尾捨入之外,還控制着公用的就近捨入方式。在復位時,捨入控制被置為就近捨入。 位15( FZ)用來啟動「清洗為0( Flush To Zero)"方式。在復位時,該位被清除,為禁止「清洗為0」方式。MXCSR寄存器的其他位(位31 ~ 位16和位6)定義為保留位並清除為0。試圖使用FXRSTOR或者LDMXCSR指令對保留位寫人非0值,將引起通用保護異常。 啟動「清洗為0"方式,在下列情況下,會有如下的效果: (1)回送0結果,且0值帶有真實結果的符號; (2)精度異常標誌和下溢異常標誌置為1。 在應用程序中,下溢異常出現時,希望能以精度的輕微損失為代價而換得應用程序的快速運行,因此採用「清洗為0"方式。對於「清洗為0」的下溢是這樣定義的:當計算結果規格化之前,指數部分處於不可規格化範圍,則產生「清洗為0",而不管是否有精度損失。未屏蔽的下溢異常是早於「清洗為0」方式產生的,這就意味着,當下溢異常未被屏蔽時,產生了下溢條件的SSE指令,將調用異常處理程序,而不管「清洗為0"方式是否為「使能」狀態。 Intel在Pentium IV處理器中加入了SSE2指令集。與Pentium III處理器採用的SSE指令集相比,目前Pentium IV的整個SSE2指令集共有144條,其中包括原有的68組SSE指令及新增加76組SSE2的指令。全新的SSE2指令除了將傳統整數MMX寄存器也擴展成128位(128bit MMX)位,另外還提供了128位SIMD整數運算操作和128位雙精密度浮點運算操作。
指令集
概述 AMD後來在Athlon XP中加入了對SSE指令集的支持。這個指令集增加了對8個128位寄存器XMM0-XMM7的支持,每個寄存器可以存儲4個單精度浮點數。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來保持和恢復狀態。但是在Pentium III對SSE的實現中,浮點數寄存器又一次被新的指令集占用了,但是這一次切換運算模式不是必要的了,只是SSE和浮點數指令不能同時進入CPU的處理線而已。 SSE指令集主要包括以下3種類型: ①是單指令多數據浮點運算指令,共50條。 PentiumⅢ芯片內增加了8個專門配套的128位浮點寄存器,一條指令可以同時處理4對單精度32位浮點數的運算,從而使 PentiumⅢ在語音數據處理以及圖形的旋轉、翻轉和變形等三維空間浮點運算處理方面的整體性能有了很大的提高。 ②是內存連續數據流優先處理指令,共8條。典型的存儲器連續數據流有音頻數據流、視頻數據流、數據庫訪問數據流與圖形處理數據流等。通過採用新的數據預存取技術,減少了CPU處理連續數據流的中間環節,大大提高了連續數據流處理的效率,也明顯改善了視頻/音頻信息處理的速度與質量。 ③增強MMX多媒體運算的新指令,共12條。它們採用了比 Pentium更先進的算法進一步增強和完善了MMX指令系統。 後續版本 SSE2 SSE2是Intel在Pentium 4處理器的最初版本中引入的,但是AMD後來在Opteron 和Athlon 64處理器中也加入了SSE2的支持。SSE2指令集添加了對64位雙精度浮點數的支持。這個指令集還增加了對CPU快取的控制指令。AMD對它的擴展增加了8個XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。 SSE3 SSE3是Intel在P4的 Prescott版中引入的指令集。SSE3新增了13條指令,其中用於視頻解碼,兩條用於線程同步,其餘的用於複雜的數學運算、浮點數與整數之間的轉換及SIMD浮點運算,使處理器對DSP及3D處理的性能大為提升。 SSSE3 2005年,作為SSE3指令集的補充版本,SSSE3出現在酷睿微架構處理器中,新增16條指令,進一步增強CPU在多媒體、圖形圖像和 Internet等方面的處理能力。 SSE4 SSE4是Intel在Penryn核心的Core 2 Duo與Core 2 Solo處理器時,新增的47條新多媒體指令集,多媒體指令集,並內建在Phenom與Opteron等K10架構處理器中,不過無法與Intel的SSE4系列指令集相容。 SSE5 SSE5指令集是AMD公司推出的全新指令集,它的功能是增強高性能計算應用,並充分發揮多核心、多媒體的並行優勢。SSE5是128-bit指令集,一共有170條指令,其中基礎指令64條。 SSE5指令集增加了幾條新指令: ①三操作數指令:x86指令以往只能處理雙操作數,而SSE5會提高到三操作數,達到RISC架構的水平,從而把多個簡單的指令集整合到更高效的一個單獨指令中,提高執行效率。 ②融合乘法累積:該技術可以把乘法和其他算法結合起來,保證只用一條指令就能完成迭代運算,從而簡化代碼、提高效率,適用於真實圖形着色、快速照相渲染、空間化音頻、復向量(矢量)數學等場合。 ③除此之外,SSE5還新增了整數乘法累積指令(IMAC, IMADO)、置換與條件移動指令、向量比較與測試指令、精度控制捨入與變換指令等。 AVX AVX全稱 Advanced vector extensions(高級矢量擴展),是 Intel公司推出的全新一代SIMD指令集,直接跳過SSE5(由AMD所定義),AVX借鑑了一些 AMD SSE5指令集的設計思路,進行擴展和加強,形成一套新一代的完整SIMD指令集規範。 AVX指令集將原來的128位XMM寄存器擴充為256位的YMM寄存器,從而支持256位的vector計算。改進和加強了原有的在3個 operands指令的編碼和語法,使之更靈活。增加一個全新的VEX prefix,實現對原有的 prefix ( escape / SIMD prefix) 集成,從而消除了 escape / SIMD prefix。FMA功能支持IEEE-754 2008。 AVX指令集通過 VEX prefix可實現4個 operands,表示為dest、srel、src2、src3,dest、srcl、src2可由 VEX. vvvv、 ModRM. r/m及 ModRM. r/m來提供,src3由1個字節的immediate來提供。AVX指令不支持MMX寄存器。 AES-NI指令集 AES-NI指令集的作用在於加速AES加密解密的處理過程,類似於我們熟悉的SSE等CPU指令集,AES-NI指令集能夠大大緩解CPU的工作負擔,同時在一定程度上加速AES的加解密過程。 AES-NI指令集中包含了4條新的指令,它們分別是負責加密的 AESENC、 AESENCLAST和負責解密的 AESDEC、 AESDECLAST。另外還有兩個AES密匙擴展指令 AESIMO、AESKEYGENASSIST。這些指令都屬於SIMD單指令多數據編碼。它們支持目前最為主流的AES-128、AES-196、AES-256。
寄存器
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提供標量與包裹式(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
相關比較
3D Now!是AMD公司用於對抗MMX的指令集技術,而SSE又是Intel公司發布的MMX擴展指令集。那麼,3D Now!和SSE相比又如何呢? 首先,它們有很多相似之處: (1)兩種指令集都支持SIMD (單指令多數據流)操作。 (2)都支持在一個時鐘周期內執行四次浮點操作。它們在這一性能上旗鼓相當。 (3)都支持「平面」寄存器組結構。 (4)都兼容MMX指令集,可混合使用。也就是說在程序中可以自由地使用這些指令。 (5)都支持數據預取機制,也就是說它們都支持分支預測和推測執行技術。 其次,3D Now!比SSE具有如下優勢: (1)發布時間早,支持者多。3D Now!技術的推出比SSE早了九個多月,擁有超過1000萬個K6-2 CPU的用戶基礎。而且3D Now!在發布時曾廣泛徵求了3D技術廣大廠商的意見,所以得到了包括微軟在內的很多軟硬件供應商的支持,湧現出了很多專為其優化的軟件、遊戲。而相比之下,對幾經改名的SSE的推出,廣大軟硬件廠商的反應並不太熱烈。 (2)不需要對現存的Windows操作系統做任何修改,因此實現極為容易。3D Now!的性能非常優秀。而SSE與操作系統有關,當時的Windows必須進行修改,以支持SSE的八個新寄存器。所以Windows 98的用戶需要使用軟件補丁,升級以支持SSE;而Windows NT的用戶則必須升級到Windows 2000才行。 第三,SSE比3D Now!具有如下優勢: (1)由於Intel公司在計算機界的地位和Pentium II的巨大出貨量,Pentium 的用戶一定比 K6-2、Athlon 多得多,所以SSE舉足輕重。 (2)據Intel公司說,SSE提高了因特網上的3D網頁的開發和運行效率。