什么是SSE
說到SSE,首先要弄清楚的一個概念是SIMD(單指令多數(shù)據(jù)流,Single Instruction Multiple Data),是一種數(shù)據(jù)并行技術(shù),能夠在一條指令中同時對多個數(shù)據(jù)執(zhí)行運(yùn)算操作,增加處理器的數(shù)據(jù)吞吐量。SIMD特別的適用于多媒體應(yīng)用等數(shù)據(jù)密集型運(yùn)算。
Intel公司的單指令多數(shù)據(jù)流式擴(kuò)展(SSE,Streaming SIMD Extensions)技術(shù)能夠有效增強(qiáng)CPU浮點(diǎn)運(yùn)算的能力。Visual Studio .NET 2003提供了對SSE指令集的編程支持,從而允許用戶在C++代碼中不用編寫匯編代碼就可直接使用SSE指令的功能。
1.1 歷史
1996年Intel首先推出了支持MMX的Pentium處理器,極大地提高了CPU處理多媒體數(shù)據(jù)的能力,被廣泛地應(yīng)用于語音合成、語音識別、音頻視頻編解碼、圖像處理和串流媒體等領(lǐng)域。但是MMX只支持整數(shù)運(yùn)算,浮點(diǎn)數(shù)運(yùn)算仍然要使用傳統(tǒng)的x87協(xié)處理器指令。由于MMX與x87的寄存器相互重疊,在MMX代碼中插入x87指令時必須先執(zhí)行EMMS指令清除MMX狀態(tài),頻繁地切換狀態(tài)將嚴(yán)重影響性能。這限制了MMX指令在需要大量浮點(diǎn)運(yùn)算的程序,如三維幾何變換、裁剪和投影中的應(yīng)用。
另一方面,由于x87古怪的堆棧式緩存器結(jié)構(gòu),使得硬件上將其流水線化和軟件上合理調(diào)度指令都很困難,這成為提高x86架構(gòu)浮點(diǎn)性能的一個瓶頸。為了解決以上這兩個問題,AMD公司于1998年推出了包含21條指令的3DNow!指令集,并在其K6-2處理器中實(shí)現(xiàn)。K6-2是 第一個能執(zhí)行浮點(diǎn)SIMD指令的x86處理器,也是第一個支持水平浮點(diǎn)寄存器模型的x86處理器。借助3DNow!,K6-2實(shí)現(xiàn)了x86處理器上最快的浮點(diǎn)單元,在每個時鐘周期內(nèi)最多可得到4個單精度浮點(diǎn)數(shù)結(jié)果,是傳統(tǒng)x87協(xié)處理器的4倍。許多游戲廠商為3DNow!優(yōu)化了程序,微軟的DirectX 7也為3DNow!做了優(yōu)化,AMD處理器的游戲性能第一次超過Intel,這大大提升了AMD在消費(fèi)者心目中的地位。K6-2和隨后的K6-III成為市場上的熱門貨。
1999年,隨著Athlon處理器的推出,AMD為3DNow!增加了5條新的指令,用于增強(qiáng)其在DSP方面的性能,它們被稱為“擴(kuò)展3DNow!”(Extended 3DNow?。?/p>
為了對抗3DNow!,Intel公司于1999年推出了SSE指令集。SSE幾乎能提供3DNow!的所有功能,而且能在一條指令中處理兩倍多的單精度浮點(diǎn)數(shù);同時,SSE完全支持IEEE 754,在處理單精度浮點(diǎn)數(shù)時可以完全代替x87。這迅速瓦解了3DNow!的優(yōu)勢。
1999年后,隨著主流操作系統(tǒng)和軟件都開始支持SSE并為SSE優(yōu)化,AMD在其2000年發(fā)布的代號為“Thunderbird”的Athlon處理器中添加了對SSE的完全支持(“經(jīng)典”的Athlon或K7只支持SSE中與MMX有關(guān)的部分,AMD稱之為“擴(kuò)展MMX”即Extended MMX)。隨后,AMD致力于AMD64架構(gòu)的開發(fā);在SIMD指令集方面,AMD跟隨Intel,為自己的處理器添加SSE2和SSE3支持,而不再改進(jìn)3DNow!。
2010年八月,AMD宣布將在新一代處理器中取消除了兩條數(shù)據(jù)預(yù)取指令之外3DNow!指令的支持,并鼓勵開發(fā)者將3DNow!代碼重新用SSE實(shí)現(xiàn)。
1.2 MMX和SSE
MMX 是Intel在Pentium MMX中引入的指令集。其缺點(diǎn)是占用浮點(diǎn)數(shù)寄存器進(jìn)行運(yùn)算(64位MMX寄存器實(shí)際上就是浮點(diǎn)數(shù)寄存器的別名)以至于MMX指令和浮點(diǎn)數(shù)操作不能同時工作。為了減少在MMX和浮點(diǎn)數(shù)模式切換之間所消耗的時間,程序員們盡可能減少模式切換的次數(shù),也就是說,這兩種操作在應(yīng)用上是互斥的。后來Intel在此基礎(chǔ)上發(fā)展出SSE指令集;AMD在此基礎(chǔ)上發(fā)展出3D Now指令集。
SSE(Streaming SIMD Extensions)是Intel在3D Now!發(fā)布一年之后,在PIII中引入的指令集,是MMX的超集。AMD后來在Athlon XP中加入了對這個指令集的支持。這個指令集增加了對8個128位寄存器XMM0-XMM7的支持,每個寄存器可以存儲4個單精度浮點(diǎn)數(shù)。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來保持和恢復(fù)狀態(tài)。但是在PIII對SSE的實(shí)現(xiàn)中,浮點(diǎn)數(shù)寄存器又一次被新的指令集占用了,但是這一次切換運(yùn)算模式不是必要的了,只是SSE和浮點(diǎn)數(shù)指令不能同時進(jìn)入CPU的處理線而已。
SSE2是Intel在P4的最初版本中引入的,但是AMD后來在Opteron 和Athlon 64中也加入了對它的支持。這個指令集添加了對64位雙精度浮點(diǎn)數(shù)的支持,以及對整型數(shù)據(jù)的支持,也就是說這個指令集中所有的MMX指令都是多余的了,同時也避免了占用浮點(diǎn)數(shù)寄存器。這個指令集還增加了對CPU的緩存的控制指令。AMD對它的擴(kuò)展增加了8個XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。Intel后來在其EM64T架構(gòu)中也增加了對AMD64的支持。
SSE3是Intel在P4的Prescott版中引入的指令集,AMD在Athlon 64的第五個版本中也添加了對它的支持。這個指令集擴(kuò)展的指令包含寄存器的局部位之間的運(yùn)算,例如高位和低位之間的加減運(yùn)算;浮點(diǎn)數(shù)到整數(shù)的轉(zhuǎn)換,以及對超線程技術(shù)的支持。
下面是一個演示的例子
使用純C++
-
指令集
+關(guān)注
關(guān)注
0文章
226瀏覽量
23384 -
SIMD
+關(guān)注
關(guān)注
0文章
34瀏覽量
10307 -
DCT
+關(guān)注
關(guān)注
1文章
56瀏覽量
19884
發(fā)布評論請先 登錄
相關(guān)推薦
評論