SSE 介紹 [Page 3]
目前要在 C 或 C++ 程式中,利用 SSE 指令,有很多方法。最一般的方式,是利用內嵌式組合語言。現在包括 Intel C++ Compiler 5.0 和 Microsoft Visual C++ 6.0 Processor Pack 的內嵌式組合語言都支援 SSE 指令集。另外,它們也都支援 SSE 指令集的 intrinsics。Intrinsics 是一種外表類似一般的函數,但是實際上會被 compiler 直接編譯成組合語言的東西。以下是一些例子:
內嵌式組合語言:
- __asm addps xmm0, xmm1
- __asm movaps [ebx], xmm0
- ...
- __m128 data;
- ...
- __asm
- {
- lea ebx, data
- addps xmm0, xmm1
- movaps [ebx], xmm0
- }
使用 intrinsics:
- __m128 data1, data2;
- ...
- __m128 out = _mm_add_ps(data1, data2);
- ...
使用 intrinsics 可以增加程式的可讀性,也比較容易使用。不過,在某些情形下,compiler 可能沒辦法產生最好的程式碼,而且,其產生的程式碼的效率,也會隨著 compiler 的不同而有改變。但是,對於大部份的應用來說,使用 intrinsics 的好處通常是很明顯的。因此,在這裡我們也以 intrinsics 為主,而不討論內嵌式組合語言。
SSE 的 intrinsics 的名稱看起來雖然怪異,但是它是有一定的規則的。基本上一個 SSE 的 intrinsics 的型式為:
- _mm_<opcode>_<suffix>
其中,<opcode>
是指令的類別,像是 add
、sub
等等。而 <suffix>
則是資料的種類。在 SSE 浮點運算指令中,只有兩個種類:ps
和 ss
。ps
是指 Packed Single-precision,也就是這個指令對暫存器中的四個單精度浮點數進行運算。而 ss
則是指 Scalar Single-precision,也就是這個指令只對暫存器中的 DATA0 進行運算。所以,像上面的 _mm_add_ps
指令,就是把兩個四維向量相加的指令。
SSE 也需要一個新的資料型態,也就是上面所看到的 __m128
。__m128
是一個 16 bytes(128 bits)的資料型態,對應 SSE 的 128 位元暫存器。幾乎所有的 SSE 浮點運算的 intrinsics 都是使用這個資料型態。比如說,_mm_add_ps
這個 intrinsic 的函數宣告為:
- __m128 _mm_add_ps(__m128 a, __m128 b);
可以看到,它的參數和傳回值的型態都是 __m128
。基本上,這個 intrinsic 的動作就是把兩個參數相加,並把結果以傳回值的方式傳回。
另外,要使用 SSE 的 intrinsics 之前,要記得先包含 xmmintrin.h
這個 header 檔。如下:
- #include <xmmintrin.h>
這樣才能使用這些 instrinsics。另外,這個檔案也包含了一些方便的巨集定義,用來配合一些 SSE 的 intrinsics 使用。
[Part 1] [Page 2] [Part 3] [Part 4] [Part 5] [Page 6] [Part 7] [Part 8]
11/6/2001, Ping-Che Chen
Sorry, Traditional Chinese only. This page is encoded in UTF-8.
Copyright© 2000, 2001 Ping-Che Chen