SSE

SSE

指令集
SSE(Streaming SIMD Extensions)是英特爾在AMD的3DNow!發布一年之後,在其計算機芯片PentiumIII中引入的指令集,是繼MMX的擴展指令集它可以通過SIMD(單指令多數據技術)和單時鐘周期并行處理多個浮點來有效地提高浮點運算速度。SSE數據集包含70條指令,其中有50條SIMD(單指令多數據技術)浮點運算指令,12條MMX整數運算增強指令,8條優化内存中連續數據塊的傳輸指令。理論上這些指令對目前流行的圖像處理、浮點處理、3D運算、視頻處理、音頻處理等多媒體應用起到全面強化的作用。注意:SSE指令和3DNow!指令彼此互不兼容,但SSE包含了3DNow!的絕大多數功能。
    中文名:因特網數據流單指令序列擴展 外文名:Streaming SIMD Extensions 别名:是指令集的簡稱 簡 介:是指令集的簡稱 簡 稱:SSE 包 括:70條指令

簡介

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位的數據總是按“小端”法進行排序,即低地址的字節為低有效字節,高地址的字節為高有效字節。

PentiumII處理器的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在PentiumIV處理器中加入了SSE2指令集。與PentiumIII處理器采用的SSE指令集相比,目前PentiumIV的整個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指令來保持和恢複狀态。但是在PentiumIII對SSE的實現中,浮點數寄存器又一次被新的指令集占用了,但是這一次切換運算模式不是必要的了,隻是SSE和浮點數指令不能同時進入CPU的處理線而已。

SSE指令集主要包括以下3種類型:

①是單指令多數據浮點運算指令,共50條。PentiumⅢ芯片内增加了8個專門配套的128位浮點寄存器,一條指令可以同時處理4對單精度32位浮點數的運算,從而使PentiumⅢ在語音數據處理以及圖形的旋轉、翻轉和變形等三維空間浮點運算處理方面的整體性能有了很大的提高。

②是内存連續數據流優先處理指令,共8條。典型的存儲器連續數據流有音頻數據流、視頻數據流、數據庫訪問數據流與圖形處理數據流等。通過采用新的數據預存取技術,減少了CPU處理連續數據流的中間環節,大大提高了連續數據流處理的效率,也明顯改善了視頻/音頻信息處理的速度與質量。

③增強MMX多媒體運算的新指令,共12條。它們采用了比Pentium更先進的算法進一步增強和完善了MMX指令系統。

後續版本

SSE2

SSE2是Intel在Pentium4處理器的最初版本中引入的,但是AMD後來在Opteron和Athlon64處理器中也加入了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與Core2 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是PentiumIII,在FPU與SSE之間共享運行支持。當編譯出來的軟件能夠交叉的同時以FPU與SSE運作,PentiumIII并無法在同一個周期中同時運行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

    相關比較

    3DNow!是AMD公司用于對抗MMX的指令集技術,而SSE又是Intel公司發布的MMX擴展指令集。那麼,3D Now!和SSE相比又如何呢?

    首先,它們有很多相似之處:

    (1)兩種指令集都支持SIMD(單指令多數據流)操作。

    (2)都支持在一個時鐘周期内執行四次浮點操作。它們在這一性能上旗鼓相當。

    (3)都支持“平面”寄存器組結構。

    (4)都兼容MMX指令集,可混合使用。也就是說在程序中可以自由地使用這些指令。

    (5)都支持數據預取機制,也就是說它們都支持分支預測和推測執行技術。

    其次,3DNow!比SSE具有如下優勢:

    (1)發布時間早,支持者多。3DNow!技術的推出比SSE早了九個多月,擁有超過1000萬個K6-2CPU的用戶基礎。而且3DNow!在發布時曾廣泛征求了3D技術廣大廠商的意見,所以得到了包括微軟在内的很多軟硬件供應商的支持,湧現出了很多專為其優化的軟件、遊戲。而相比之下,對幾經改名的SSE的推出,廣大軟硬件廠商的反應并不太熱烈。

    (2)不需要對現存的Windows操作系統做任何修改,因此實現極為容易。3DNow!的性能非常優秀。而SSE與操作系統有關,當時的Windows必須進行修改,以支持SSE的八個新寄存器。所以Windows 98的用戶需要使用軟件補丁,升級以支持SSE;而WindowsNT的用戶則必須升級到Windows2000才行。

    第三,SSE比3DNow!具有如下優勢:

    (1)由于Intel公司在計算機界的地位和PentiumII的巨大出貨量,Pentium的用戶一定比K6-2、Athlon多得多,所以SSE舉足輕重。

    (2)據Intel公司說,SSE提高了因特網上的3D網頁的開發和運行效率。

相關詞條

相關搜索

其它詞條