SSE技術簡介
Intel公司的單指令多數據流式擴展(SSE,Streaming SIMD Extensions)技術能夠有效增強CPU浮點運算的能力。Visual Studio .NET 2003提供了對SSE指令集的編程支持,從而允許用戶在C++代碼中不用編寫匯編代碼就可直接使用SSE指令的功能。MSDN中有關SSE技術的主題[1]有可能會使不熟悉使用SSE匯編指令編程的初學者感到困惑,但是在閱讀MSDN有關文檔的同時,參考一下Intel軟件說明書(Intel Software manuals)[2]會使你更清楚地理解使用SSE指令編程的要點。
SIMD(single-instruction, multiple-data)是一種使用單道指令處理多道數據流的CPU執行模式,即在一個CPU指令執行周期內用一道指令完成處理多個數據的操作。考慮一下下面這個任務:計算一個很長的浮點型數組中每一個元素的平方根。實現這個任務的算法可以這樣寫:
for each f in array //對數組中的每一個元素
f = sqrt(f) //計算它的平方根
為了了解實現的細節,我們把上面的代碼這樣寫:
for each f in array
{
把f從內存加載到浮點寄存器
計算平方根
再把計算結果從寄存器中取出放入內存
}
具有Intel SSE指令集支持的處理器有8個128位的寄存器,每一個寄存器可以存放4個(32位)單精度的浮點數。SSE同時提供了一個指令集,其中的指令可以允許把浮點數加載到這些128位的寄存器之中,這些數就可以在這些寄存器中進行算術邏輯運算,然後把結果放回內存。采用SSE技術後,算法可以寫成下面的樣子:
for each 4 members in array //對數組中的每4個元素
{
把數組中的這4個數加載到一個128位的SSE寄存器中
在一個CPU指令執行周期中完成計算這4個數的平方根的操作
把所得的4個結果取出寫入內存
}
C++編程人員在使用SSE指令函數編程時不必關心這些128位的寄存器,你可以使用128位的數據類型“__m128”和一系列C++函數來實現這些算術和邏輯操作,而決定程序使用哪個SSE寄存器以及代碼優化是C++編譯器的任務。當需要對很長的浮點數數組中的元素進行處理的時候,SSE技術確實是一種很高效的方法。
SSE程序設計詳細介紹
包含的頭文件:
所有的SSE指令函數和__m128數據類型都在xmmintrin.h文件中定義:
#include <xmmintrin.h>
因為程序中用到的SSE處理器指令是由編譯器決定,所以它並沒有相關的.lib庫文件。