FROM http://hi.baidu.com/wadeswb/blog/item/12bd 4c 19868c 030c 34fa4129.html

 

SSE的優缺點

雖然SSE從理論上來講要比傳統的浮點運算會快,但是所受的限制也很多。

[1]首先,雖然它執行一次相當於四次, 會比傳統的浮點運算執行4次的速度要快,但是它執行一次的速度卻並沒有想象中的那麼快,所以要體現SSE的速度,必須有Stream做前提,就是大量的流 資料,這樣才能發揮SIMD的強大作用。

[2]其次,SSE支持的資料類型是432位(共計128位)浮點數集合,就是CC++語言中的float[4], 並且必須是以16位位元組邊界對齊的。因此這也給輸入和輸出帶來了不少的麻煩,實際上主要影響SSE發揮性能的就是不停地對資料進行復制以適用應它的資料格式。


     如果你是一個C++程序員,對匯編並不很熟,但又想用SSE來優化程序,該怎麼做呢?幸好VC++為我們提供了很方便的指令C函數級的封裝和C格式資料類型,我們只需像平時寫C++代碼一樣定義變量、調用函數就可以很好地應用SSE指令了。當然了,我們需要包含一個頭文件,這里面包括了我們需要的資料類型和函數的聲明,#include  


 

SSE運算的標準資料類型

SSE運算的標準資料類型只有一個,就是:__m128,它是這樣定義的:

 typedef struct __declspec(intrin_type) __declspec(align(16)) __m128

{

   float m128_f32[4];

} __m128;

 

簡化一下,就是:

   struct __m128

{

   float m128_f32[4];

};

 

[1]比如要定義一個__m128變量,並為它賦四個float整數,可以這樣寫:

 __m128 S1 = { 1.0f , 2.0f , 3, 0f , 4, 0f };

 

[2]S1.m128_f32中的2個(基數為0)元素

 S1.m128_f32[2] = 6.0f ;

 

 [3] S1.m128_f32中的四個元素全部賦予2.0f (這樣會比你一個一個賦值要快的多)。

S1 = _mm_set_ps1( 2.0f );

 

 [4] S1.m128_f32中的4個浮點數都置零

S1 = _mm_setzero_ps();

 

還有一些其它的賦值指令,但執行起來還沒有自己逐個賦值來的快,只作為一些特殊用途, 如果想了解更多的資訊,可以參考MSDN -> Visual Studio -> Reference -> C/C++Language -> Compiler Intrinsics -> MMX, SSE, and SSE2 Intrinsics -> Stream SIMD Extensions(SSE)章節。

 

一般來講,所有SSE指令函數都有3個部分組成,中間用下划線隔開:

 Ex: _mm_set_ps1

[1]mm表示多媒體擴展指令集

[2]set表示此函數的含義縮寫(給直的意思)

[3]ps1表示該函數對結果變量的影響,由兩個字母組成,

[3.1]第一個字母表示對結果變量的影響方式,p表示把結果作為指向一組資料的指針,每一個元素都將參與運算s表示只將結果變量中的第一個元素參與運算

[3.2]第二個字母表示參與運算的資料類型。s 表示32位浮點數,d表示64位浮點數,i32表示32位定點數,i64表示64位定點數。

 

arrow
arrow
    全站熱搜

    chunyuan 發表在 痞客邦 留言(1) 人氣()