Carved Marker

SSE 介紹 [Page 3]

目前要在 C 或 C++ 程式中,利用 SSE 指令,有很多方法。最一般的方式,是利用內嵌式組合語言。現在包括 Intel C++ Compiler 5.0Microsoft 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> 是指令的類別,像是 addsub 等等。而 <suffix> 則是資料的種類。在 SSE 浮點運算指令中,只有兩個種類:psssps 是指 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