Uwaga! Informacje na tej stronie mają ponad 6 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.
Sat 29 Nov2008
Osobny temat w rozdziale MSDN Library "Compiler Intrinsics" stanowią funkcje i typy do obsługi SIMD, czyli rozszerzeń wektorowych procesora (MMX, 3DNow!, SSE).
MMX wprowadzono dawno temu, dziś każdy procesor go ma. Odpowiednim typem jest __m64. Reprezentuje wartość 64-bitową interpretowaną jako zestaw 1, 2, 4 lub 8 liczb całkowitych, ze znakiem lub bez znaku. Myk polega na operowaniu całym wektorem za pomocą jednej funkcji. Np. funkcja _mm_adds_pi8 dodaje komponenty dwóch wartości jako złożonych z ośmiu 8-bitowych liczb ze znakiem, wykonując dodatkowo saturację. To może się przydać np. do przetwarzania obrazów 2D.
3DNow! to rozszerzenie wymyślone przez AMD i obecne chyba tylko w procesorach tej firmy, jako że wg Valve Survey Summary Data mniej niż połowa użytkowników posiada procesor, który go wspiera. Dlatego chyba nie warto się nim zajmować.
SSE zostało wprowadzone z Pentium III. Obecnie prawie każdy ma procesor, który go wspiera. Odpowiada mu typ __m128, który reprezentuje 128-bitową wartość zbudowaną z 4 liczb typu float. Przykładowa funkcja _mm_rsqrt_ps liczy odwrotność pierwiastka kwadratowego każdego z komponentów. Te funkcje zdają się idealne do przyspieszenia operacji na wektorach, macierzach i wszystkim, co związane z grafiką 3D.
SSE2 jest wprowadzone od Pentium 4. Wg danych Valve, procesor który go wspiera posiada 89.41% użytkowników. Ten standard dodaje typy __m128d i __m128i, które rozszerzają interpretację tej 128-bitowej wartości na 2 liczby typu double lub 1-16 liczb całkowitych.
SSE3, SSE4 i SSE4a to jeszcze nowsze standardy i raczej duży procent użytkowników nie ma procesora, który by je obsługiwał.
Na temat wsparcia procesorów dla tych instrukcji wektorowych założyłem dyskusję na forum. Koniec końców myślę jednak, że przyspieszenie obliczeń za ich pomocą (np. przez przerobienie wektorów i macierzy w bibliotece matematycznej na użycie SSE) nie jest takie proste. Przeszkodą jest np. wymagane dla typów __m64 i __m128 wyrównanie odpowiednio do 8 i 16 bajtów, które nie pozwala czytać sobie tych wektorów ot tak swobodnie, z dowolnych danych binarnych.