什么是SSE
說到SSE,首先要弄清楚的一個概念是SIMD(單指令多數據流,Single Instruction Multiple Data),是一種數據并行技術,能夠在一條指令中同時對多個數據執行運算操作,增加處理器的數據吞吐量。SIMD特別的適用于多媒體應用等數據密集型運算。
Intel公司的單指令多數據流式擴展(SSE,Streaming SIMD Extensions)技術能夠有效增強CPU浮點運算的能力。Visual Studio .NET 2003提供了對SSE指令集的編程支持,從而允許用戶在C++代碼中不用編寫匯編代碼就可直接使用SSE指令的功能。
1.1 歷史
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實現。
1.2 MMX和SSE
MMX 是Intel在Pentium MMX中引入的指令集。其缺點是占用浮點數寄存器進行運算(64位MMX寄存器實際上就是浮點數寄存器的別名)以至于MMX指令和浮點數操作不能同時工作。為了減少在MMX和浮點數模式切換之間所消耗的時間,程序員們盡可能減少模式切換的次數,也就是說,這兩種操作在應用上是互斥的。后來Intel在此基礎上發展出SSE指令集;AMD在此基礎上發展出3D Now指令集。
SSE(Streaming SIMD Extensions)是Intel在3D Now!發布一年之后,在PIII中引入的指令集,是MMX的超集。AMD后來在Athlon XP中加入了對這個指令集的支持。這個指令集增加了對8個128位寄存器XMM0-XMM7的支持,每個寄存器可以存儲4個單精度浮點數。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來保持和恢復狀態。但是在PIII對SSE的實現中,浮點數寄存器又一次被新的指令集占用了,但是這一次切換運算模式不是必要的了,只是SSE和浮點數指令不能同時進入CPU的處理線而已。
SSE2是Intel在P4的最初版本中引入的,但是AMD后來在Opteron 和Athlon 64中也加入了對它的支持。這個指令集添加了對64位雙精度浮點數的支持,以及對整型數據的支持,也就是說這個指令集中所有的MMX指令都是多余的了,同時也避免了占用浮點數寄存器。這個指令集還增加了對CPU的緩存的控制指令。AMD對它的擴展增加了8個XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。Intel后來在其EM64T架構中也增加了對AMD64的支持。
SSE3是Intel在P4的Prescott版中引入的指令集,AMD在Athlon 64的第五個版本中也添加了對它的支持。這個指令集擴展的指令包含寄存器的局部位之間的運算,例如高位和低位之間的加減運算;浮點數到整數的轉換,以及對超線程技術的支持。
下面是一個演示的例子
使用純C++
-
指令集
+關注
關注
0文章
222瀏覽量
23378 -
SIMD
+關注
關注
0文章
33瀏覽量
10289 -
DCT
+關注
關注
1文章
56瀏覽量
19869
發布評論請先 登錄
相關推薦
評論