版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-SSE

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

**SSE(Streaming SIMD Extensions)**是英特爾在AMD的3D Now!發(fā)布一年之后,在其計(jì)算機(jī)芯片Pentium III中引入的指令集,是繼MMX的擴(kuò)展指令集。SSE指令集提供了70條新指令。AMD后來(lái)在Athlon XP中加入了對(duì)這個(gè)新指令集的支持。

指令集概述SSE(Streaming SIMD Extensions)是英特爾在AMD的3D Now!發(fā)布一年之后,在其計(jì)算機(jī)芯片Pentium III中引入的指令集,是MMX的超集。AMD后來(lái)在Athlon XP中加入了對(duì)這個(gè)指令集的支持。這個(gè)指令集增加了對(duì)8個(gè)128位寄存器XMM0-XMM7的支持,每個(gè)寄存器可以存儲(chǔ)4個(gè)單精度浮點(diǎn)數(shù)。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來(lái)保持和恢復(fù)狀態(tài)。但是在Pentium III對(duì)SSE的實(shí)現(xiàn)中,浮點(diǎn)數(shù)寄存器又一次被新的指令集占用了,但是這一次切換運(yùn)算模式不是必要的了,只是SSE和浮點(diǎn)數(shù)指令不能同時(shí)進(jìn)入CPU的處理線而已。

SSE2是Intel在P4的最初版本中引入的,但是AMD后來(lái)在Opteron 和Athlon 64中也加入了對(duì)它的支持。這個(gè)指令集添加了對(duì)64位雙精度浮點(diǎn)數(shù)的支持。這個(gè)指令集還增加了對(duì)CPU的緩存的控制指令。AMD對(duì)它的擴(kuò)展增加了8個(gè)XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器Intel后來(lái)在其EM64T架構(gòu)中也增加了對(duì)AMD64的支持。

SSE3是Intel在P4的Prescott版中引入的指令集,AMD在Athlon 64的第五個(gè)版本中也添加了對(duì)它的支持。以及對(duì)超線程技術(shù)的支持。

SSE4指令集將給英特爾下一代平臺(tái)帶來(lái)“相當(dāng)大的視頻性能提升”。,其它視頻增強(qiáng)技術(shù)還包括CVT(明晰視頻技術(shù))--英特爾對(duì)ATI Avivo的回應(yīng)--和對(duì)UDI的支持。上述兩項(xiàng)技術(shù)基于英特爾965芯片組。其它英特爾官方文件把CVT技術(shù)定義為:支持高級(jí)解碼、擁有預(yù)處理和增強(qiáng)型3D處理能力。 SSE4指令集是Conroe架構(gòu)所引入的新指令集。這項(xiàng)原本計(jì)劃應(yīng)用于NetBurst微架構(gòu)Tejas核心處理器之上的全新技術(shù)也隨著它的夭折最終沒(méi)能實(shí)現(xiàn),這不能不說(shuō)是個(gè)遺憾,但是SSE4指令集出現(xiàn)在了Conroe上又讓我們看到了希望。

SSE4指令集共包括16條指令,不過(guò)雖然扣肉處理器推出已經(jīng)有一些時(shí)日。也許英特爾是基于特殊的考慮,僅讓少數(shù)合作軟件廠商取得數(shù)據(jù),只是這種作法實(shí)在很沒(méi)有說(shuō)服力就是了,天底下沒(méi)有哪家處理器廠商,希望自己新增的指令越少人用越好。

不過(guò),從Intel Core微架構(gòu)針對(duì)SSE指令所作出的修改被稱之為“Intel Advanced Digital Media Boost”技術(shù)來(lái)看,未來(lái)SSE4將更注重針對(duì)視頻方面的優(yōu)化,我們認(rèn)為SSE4主要改進(jìn)之處可能將針對(duì)英特爾的Clear Video高清視頻技術(shù)及UDI接口規(guī)范提供強(qiáng)有力的支持。這兩項(xiàng)技術(shù)基于965芯片組,Intel的官方把Clear Video技術(shù)定義為:支持高級(jí)解碼、擁有預(yù)處理和增強(qiáng)型3D處理能力。值得一提的是,在SSE4中另一個(gè)重要的改進(jìn)就是提供完整128位寬的SSE執(zhí)行單元,一個(gè)頻率周期內(nèi)可執(zhí)行一個(gè)128位SSE指令。Conroe中SSE的ADDPS(4D 32bit共128bit,單精度加法)、MULPS(4D 32bit共128bit,單精度乘法)和SSE2的ADDPD(2D 64bit共128bit,雙精度加法)、MULPD(2D 64bit共128bit,雙精度乘法),這四條重要SSE算術(shù)指令的吞吐周期都降低到1個(gè)周期,真正做到了英特爾宣稱的每個(gè)周期執(zhí)行一條128位向量加法指令和一條128位向量乘法指令的能力。

可以說(shuō) Conroe的向量單元已經(jīng)全面引入了流水線化的設(shè)計(jì)。而支持SSE3的NetBurst微處理器架構(gòu)雖然提供128位寬執(zhí)行單元,但僅有一組,性能孰高孰低一目了然。更為重要的是,可見其應(yīng)用范圍相當(dāng)廣泛。

配合完整的128位SSE執(zhí)行單元,以及龐大的執(zhí)行單元數(shù)目,Conroe處理器可在一個(gè)頻率周期內(nèi),同時(shí)執(zhí)行128位乘法、128位加法、128位數(shù)據(jù)加載與128位數(shù)據(jù)回存,或著是4個(gè)32位單倍浮點(diǎn)精確度乘法與4個(gè)32位單倍浮點(diǎn)精確度加法運(yùn)算,這將使其更利于多媒體應(yīng)用。因此,SSE4指令集能夠有效帶來(lái)系統(tǒng)性能上的提升,這一代在眾多測(cè)試中早已被證實(shí)。雖然其不會(huì)像當(dāng)年SSE2指令集出現(xiàn)時(shí)那樣帶來(lái)巨大的性能提升,但是其在某些特殊方面的應(yīng)用還是讓我們對(duì)它充滿了期待。

后續(xù)版本SSE2

SSE2是Intel在Pentium 4處理器的最初版本中引入的,但是AMD后來(lái)在Opteron 和Athlon 64處理器中也加入了SSE2的支持。SSE2指令集添加了對(duì)64位雙精度浮點(diǎn)數(shù)的支持。這個(gè)指令集還增加了對(duì)CPU快取的控制指令。AMD對(duì)它的擴(kuò)展增加了8個(gè)XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。

SSE3

SSE3是Intel在Pentium 4處理器的 Prescott 核心中引入的第三代SIMD指令集,AMD在Athlon 64的第五個(gè)版本,Venice核心中也加入了SSE3的支持。以及對(duì)超執(zhí)行緒技術(shù)的支持。

SSSE3

SSSE3是Intel針對(duì)SSE3指令集的一次額外擴(kuò)充,最早內(nèi)建于Core 2 Duo處理器中。

SSE4

SSE4是Intel在Penryn核心的Core 2 Duo與Core 2 Solo處理器時(shí),新增的47條新多媒體指令集,多媒體指令集,并內(nèi)建在Phenom與Opteron等K10架構(gòu)處理器中,不過(guò)無(wú)法與Intel的SSE4系列指令集相容。

SSE5

SSE5]是AMD為了打破Intel壟斷在處理器指令集的獨(dú)霸地位所提出的,SSE5初期規(guī)劃將加入超過(guò)100條新指令,其中最引人注目的就是三算子指令(3-Operand Instructions)及熔合乘法累積(Fused Multiply Accumulate)。其中,三算子指令讓處理器可將一個(gè)數(shù)學(xué)或邏輯函式庫(kù),套用到算子或輸入資料。借由增加算子的數(shù)量,一個(gè) x86 指令能處理二至三筆資料, SSE5 允許將多個(gè)簡(jiǎn)單指令匯整成一個(gè)指令,達(dá)到更有效率的指令處理模式。提升為三運(yùn)算指令的運(yùn)算能力,是少數(shù) RISC 架構(gòu)的水平。熔合乘法累積讓允許建立新的指令,有效率地執(zhí)行各種復(fù)雜的運(yùn)算。熔合乘法累積可結(jié)合乘法與加法運(yùn)算,透過(guò)單一指令執(zhí)行多筆重復(fù)計(jì)算。透過(guò)簡(jiǎn)化程式碼,讓系統(tǒng)能迅速執(zhí)行繪圖著色、快速相片著色、音場(chǎng)音效,以及復(fù)雜向量演算等效能密集的應(yīng)用作業(yè)。SSE5最快將內(nèi)建于AMD下一代Bulldozer核心。

AVX

AVX是Intel的SSE延伸架構(gòu),如IA16至IA32般的把暫存器XMM 128bit提升至YMM 256bit,以增加一倍的運(yùn)算效率。此架構(gòu)支持了三運(yùn)算指令(3-Operand Instructions),減少在編碼上需要先復(fù)制才能運(yùn)算的動(dòng)作。在微碼部分使用了LES LDS這兩少用的指令作為延伸指令Prefix。

FMA

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

SSE的寄存器SSE加入新的8個(gè)128位寄存器(XMM0~XMM7)。而AMD發(fā)表的x86-64延伸架構(gòu)(又稱AMD64)再加入額外8個(gè)寄存器。除此之外還有一個(gè)新的32位的控制/狀態(tài)寄存器(MXCSR)。不過(guò)只能在64位的模式下才能使用額外8個(gè)寄存器。

每個(gè)寄存器可以容納4個(gè)32位單精度浮點(diǎn)數(shù),或是2個(gè)64位雙精度浮點(diǎn)數(shù),或是4個(gè)32位整數(shù),或是8個(gè)16位短整數(shù),或是16個(gè)字符。整數(shù)運(yùn)算能夠使用正負(fù)號(hào)運(yùn)算。而整數(shù)SIMD運(yùn)算可能仍然要與8個(gè)64位MMX寄存器一起運(yùn)行。

因?yàn)椴僮飨到y(tǒng)必須要在進(jìn)程切換的時(shí)候保護(hù)這些128位的寄存器狀態(tài),除非操作系統(tǒng)去引導(dǎo)這些寄存器,否則默認(rèn)值是不會(huì)去激活的。這表示操作系統(tǒng)必須要知道如何使用FXSAVE與FXRSTOR指令才能存儲(chǔ)x87與SSE寄存器的狀態(tài)。而在當(dāng)時(shí)IA-32的主流操作系統(tǒng)很快的都加入了此功能1。

由于SSE加入了浮點(diǎn)支持,SSE就比MMX更加常用。而SSE2加入了整數(shù)運(yùn)算支持之后讓SSE更加的有彈性,當(dāng)MMX變成是多余的指令集,SSE指令集甚至可以與MMX并發(fā)運(yùn)作,在某些時(shí)候可以提供額外的性能增進(jìn)。

第一個(gè)支持SSE的CPU是Pentium III,在FPU與SSE之間共享運(yùn)行支持。當(dāng)編譯出來(lái)的軟件能夠交叉的同時(shí)以FPU與SSE運(yùn)作,Pentium III并無(wú)法在同一個(gè)周期中同時(shí)運(yùn)行FPU與SSE。這個(gè)限制降低了指令管線的有效性,不過(guò)XMM寄存器能夠讓SIMD與標(biāo)量浮點(diǎn)運(yùn)算混合運(yùn)行,而不會(huì)因?yàn)榍袚QMMX/浮點(diǎn)模式而產(chǎn)生性能的折損。

SSE指令表SSE提供標(biāo)量與包裹式(packed)浮點(diǎn)指令。

浮點(diǎn)指令存儲(chǔ)器到寄存器/寄存器到存儲(chǔ)器/寄存器之間的數(shù)據(jù)搬移

標(biāo)量– MOVSS

包裹式– MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS

數(shù)學(xué)運(yùn)算

標(biāo)量– ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS

包裹式– ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS

比較

標(biāo)量– CMPSS, COMISS, UCOMISS

包裹式– CMPPS

數(shù)據(jù)拆包(unpack)與隨機(jī)搬移(shuffle)

包裹式– SHUFPS, UNPCKHPS, UNPCKLPS

數(shù)據(jù)類型轉(zhuǎn)換

標(biāo)量– CVTSI2SS, CVTSS2SI, CVTTSS2SI

包裹式– CVTPI2PS, CVTPS2PI, CVTTPS2PI

逐位邏輯運(yùn)算

包裹式– ANDPS, ORPS, XORPS, ANDNPS

整數(shù)指令數(shù)學(xué)運(yùn)算

PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW

數(shù)據(jù)搬移

PEXTRW, PINSRW

其他

PMOVMSKB, PSHUFW

其他指令MXCSR管理

LDMXCSR, STMXCSR

緩存與存儲(chǔ)器管理

MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

例子下面這個(gè)例子演示了使用SSE的優(yōu)點(diǎn)。向量加法在計(jì)算機(jī)圖形中很常用,如果在x86平臺(tái)上想將四對(duì)單精度浮點(diǎn)數(shù)相加,必須使用四對(duì)浮點(diǎn)相加指令2。

vec_res.x = v1.x + v2.x;vec_res.y = v1.y + v2.y;vec_res.z = v1.z + v2.z;vec_res.w = v1.w + v2.w;上面這段代碼會(huì)被編譯成4條x86 FADD指令。下面的偽代碼展示用128位包裹式相加(packed-add)指令替代4個(gè)純量相加指令。

movaps xmm0, [v1] ;xmm0 = v1.w | v1.z | v1.y | v1.x addps xmm0, [v2] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps [vec_res], xmm0本詞條內(nèi)容貢獻(xiàn)者為:

閆曉東 - 副教授 - 中央民族大學(xué)信息工程學(xué)院