AltiVec - AltiVec

AltiVec to zestaw instrukcji zmiennoprzecinkowych i całkowitych SIMD o pojedynczej precyzji, zaprojektowany i będący własnością Apple , IBM i Freescale Semiconductor (wcześniej Motorola 's Semiconductor Products Sector) — sojuszu AIM . Jest on realizowany na wersji PowerPC architektury procesora, w tym Motorola G4 , IBM 's G5 i POWER6 procesorów i PA Semi ' s PWRficient PA6T. AltiVec jest znakiem towarowym należącym wyłącznie do Freescale, więc system jest również określany jako Velocity Engine przez Apple i VMX ( Vector Multimedia Extension ) przez IBM i PA Semi.

Podczas gdy AltiVec odnosi się do zestawu instrukcji, implementacje w procesorach IBM i Motorola są odrębne pod względem projektu logicznego. Do tej pory żaden rdzeń IBM nie zawierał projektu logiki AltiVec na licencji Motoroli i odwrotnie.

AltiVec jest standardową częścią specyfikacji Power ISA v.2.03 . Nigdy formalnie nie była częścią architektury PowerPC aż do tej specyfikacji, chociaż używała formatów i składni instrukcji PowerPC i zajmowała przestrzeń kodu operacyjnego wyraźnie przydzieloną do takich celów.

Porównanie do x86-64 SSE

Zarówno VMX/AltiVec, jak i SSE zawierają 128-bitowe rejestry wektorowe, które mogą reprezentować szesnaście 8-bitowych znaków ze znakiem lub bez, osiem 16-bitowych znaków krótkich ze znakiem lub bez, cztery 32-bitowe ints lub cztery 32-bitowe zmienne zmiennoprzecinkowe. Oba zapewniają instrukcje kontroli pamięci podręcznej mające na celu zminimalizowanie zanieczyszczenia pamięci podręcznej podczas pracy ze strumieniami danych.

Wykazują również istotne różnice. W przeciwieństwie do SSE2 , VMX/AltiVec obsługuje specjalny typ danych RGBpiksel ”, ale nie działa na 64-bitowych pływakach o podwójnej precyzji i nie ma możliwości bezpośredniego przenoszenia danych między rejestrami skalarnymi i wektorowymi . Zgodnie z modelem "ładuj/zapisuj" projektu RISC PowerPC , rejestry wektorowe, podobnie jak rejestry skalarne, mogą być tylko ładowane i przechowywane w pamięci. Jednak VMX/AltiVec zapewnia znacznie pełniejszy zestaw „poziomych” operacji, które działają na wszystkich elementach wektora; dopuszczalne kombinacje typu danych i operacji są znacznie bardziej kompletne. Dostępne są trzydzieści dwa 128-bitowe rejestry wektorowe, w porównaniu do ośmiu dla SSE i SSE2 (rozszerzone do 16 w x86-64 ), a większość instrukcji VMX/AltiVec przyjmuje trzy operandy rejestrów w porównaniu do tylko dwóch rejestrów/rejestrów lub rejestrów/pamięci na IA-32 .

VMX/AltiVec wyróżnia się również obsługą elastycznej instrukcji permutacji wektorowej , w której każdy bajt wynikowej wartości wektora może być wzięty z dowolnego bajtu jednego z dwóch innych wektorów, sparametryzowanych przez jeszcze inny wektor. Pozwala to na wyrafinowane manipulacje w jednej instrukcji.

Najnowsze wersje GNU Compiler Collection (GCC), kompilatora IBM VisualAge i innych kompilatorów zapewniają wewnętrzny dostęp do instrukcji VMX/AltiVec bezpośrednio z programów C i C++ . Począwszy od wersji 4, GCC zawiera również funkcje automatycznej wektoryzacji , które próbują inteligentnie tworzyć binaria z akceleracją VMX/Altivec bez potrzeby bezpośredniego używania przez programistę elementów wewnętrznych. Słowo kluczowe „vector” zostało wprowadzone, aby umożliwić deklarację natywnych typów wektorów, np. „ vector unsigned char foo;” deklaruje 128-bitową zmienną wektorową o nazwie „foo” zawierającą szesnaście 8-bitowych znaków bez znaku. Pełne uzupełnienie operatorów arytmetycznych i binarnych jest zdefiniowane na typach wektorowych, dzięki czemu można używać normalnego języka wyrażeń C do manipulowania zmiennymi wektorowymi. Istnieją również przeciążone funkcje wewnętrzne, takie jak „ vec_add”, które emitują odpowiedni kod operacji w oparciu o typ elementów w wektorze i wymuszane jest bardzo silne sprawdzanie typu. W przeciwieństwie do tego, typy danych zdefiniowane przez Intel dla rejestrów SIMD IA-32 deklarują tylko rozmiar rejestru wektorowego (128 lub 64 bity), aw przypadku rejestru 128-bitowego, czy zawiera on liczby całkowite czy zmiennoprzecinkowe. Programista musi wybrać odpowiednią wewnętrzną dla używanych typów danych, np. " _mm_add_epi16(x,y)" w celu dodania dwóch wektorów zawierających osiem 16-bitowych liczb całkowitych.

Historia rozwoju

Rozszerzenie Power Vector Media Extension (VMX) zostało opracowane w latach 1996-1998 we wspólnym projekcie Apple, IBM i Motorola. Firma Apple była głównym klientem Power Vector Media Extension (VMX) do czasu przejścia firmy Apple na procesory Intela oparte na procesorach x86 w dniu 6 czerwca 2005 r. Używali go do przyspieszania aplikacji multimedialnych , takich jak QuickTime , iTunes i kluczowe części systemu Mac OS firmy Apple X w tym w kompozytorze grafiki Quartz . Inne firmy, takie jak Adobe, wykorzystywały AltiVec do optymalizacji swoich programów do przetwarzania obrazu, takich jak Adobe Photoshop . Motorola jako pierwsza dostarczyła procesory obsługujące AltiVec, począwszy od linii G4. AltiVec był również używany w niektórych systemach wbudowanych do wysokowydajnego przetwarzania sygnałów cyfrowych.

IBM konsekwentnie porzuca VMX ze swoich wcześniejszych mikroprocesorów POWER , które były przeznaczone do zastosowań serwerowych, gdzie nie były zbyt przydatne. POWER6 mikroprocesor, wprowadzony w 2007 narzędzia AltiVec. Ostatni mikroprocesor IBM, PowerPC 970 (nazywany przez Apple „G5”), również zaimplementował AltiVec ze sprzętem podobnym do PowerPC 7400 .

AltiVec jest znakiem towarowym firmy Freescale (wcześniej Motorola) dla standardowej części Category:Vector specyfikacji Power ISA v.2.03 . Ta kategoria jest również znana jako VMX (używana przez IBM) i „Velocity Engine” (nazwa marki używana wcześniej przez Apple).

Komórkowych Broadband Engine, stosowany w (między innymi) PlayStation 3 , obsługuje również technologię Power Vector Extension mediów (VMX) w swej PPU, z SPU ISA są wzmocnione, ale architektonicznie podobny.

Freescale wprowadza ulepszoną wersję AltiVec do procesorów QorIQ opartych na e6500 .

VMX128

IBM ulepszony VMX do użytku w Xenon (Xbox 360) i nazwał to ulepszenie VMX128. Ulepszenia obejmują nowe procedury przeznaczone do gier (przyspieszenie grafiki 3D i fizyki gier) oraz łącznie 128 rejestrów. VMX128 nie jest w pełni kompatybilny z VMX/Altivec, ponieważ usunięto wiele operacji na liczbach całkowitych, aby zrobić miejsce na większy plik rejestru i dodatkowe operacje specyficzne dla aplikacji.

VSX (rozszerzenie skalarne wektorowe)

Power ISA v2.06 wprowadził wektorowo-skalarne instrukcje VSX, które rozszerzają przetwarzanie SIMD dla Power ISA do obsługi do 64 rejestrów, z obsługą regularnych operacji zmiennoprzecinkowych, dziesiętnych zmiennoprzecinkowych i wykonywania wektorów. POWER7 to pierwszy procesor Power ISA, w którym zaimplementowano Power ISA v2.06.

Nowe instrukcje zostały wprowadzone przez IBM w kategorii Vector Media Extension dla operacji na liczbach całkowitych w ramach rozszerzenia VSX w Power ISA 2.07.

Nowe instrukcje wektorów całkowitych zostały wprowadzone przez IBM zgodnie z kodowaniem VMX w ramach rozszerzenia VSX w Power ISA v3.0. Zostanie wprowadzony z procesorami POWER9 .

Zagadnienia

W C++ standardowy sposób dostępu do obsługi AltiVec wyklucza się wzajemnie z użyciem szablonu vector<>klasy Standard Template Library ze względu na traktowanie „wektora” jako słowa zastrzeżonego, gdy kompilator nie implementuje kontekstowej wersji słowa kluczowego wektora. Jednak może być możliwe połączenie ich przy użyciu obejść specyficznych dla kompilatora; na przykład w GCC można zrobić, #undef vectoraby usunąć vectorsłowo kluczowe, a następnie użyć __vectorw jego miejsce słowa kluczowego specyficznego dla GCC .

AltiVec przed Power ISA 2.06 z VSX nie ma możliwości ładowania z pamięci przy użyciu naturalnego wyrównania typu. Na przykład poniższy kod wymaga specjalnej obsługi dla Power6 i niższych, gdy efektywny adres nie jest wyrównany do 16 bajtów. Specjalna obsługa dodaje 3 dodatkowe instrukcje do operacji ładowania, gdy VSX nie jest dostępny.

#include <altivec.h>
typedef __vector unsigned char uint8x16_p;
typedef __vector unsigned  int uint32x4_p;
...
int main(int argc, char* argv)
{
    /* Natural alignment of vals is 4; and not 16 as required */
    unsigned int vals[4] = { 1, 2, 3, 4 };
    uint32x4_p vec;

#if defined(__VSX__) || defined(_ARCH_PWR8)
    vec = vec_xl(0, vals);
#else
    const uint8x16_p perm = vec_lvsl(0, vals);
    const uint8x16_p low  = vec_ld(0, vals);
    const uint8x16_p high = vec_ld(15, vals);
    vec = (uint32x4_p)vec_perm(low, high, perm);
#endif

}

AltiVec przed Power ISA 2.06 z VMX nie obsługuje 64-bitowych liczb całkowitych. Deweloperzy, którzy chcą operować na danych 64-bitowych, opracują procedury z komponentów 32-bitowych. Na przykład poniżej znajdują się przykłady 64-bitowego addi subtractw C używającego wektora z czterema 32-bitowymi słowami na maszynie big-endian . Permuty przenoszą przeniesienie i pożyczają bity z kolumn 1 i 3 do kolumn 0 i 2, jak w matematyce w podręcznikach szkolnych. Maszyna little-endian potrzebowałaby innej maski.

#include <altivec.h>
typedef __vector unsigned char uint8x16_p;
typedef __vector unsigned  int uint32x4_p;
...

/* Performs a+b as if the vector held two 64-bit double words */
uint32x4_p add64(const uint32x4_p a, const uint32x4_p b)
{
    const uint8x16_p cmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};
    const uint32x4_p zero = {0, 0, 0, 0};

    uint32x4_p cy = vec_addc(vec1, vec2);
    cy = vec_perm(cy, zero, cmask);
    return vec_add(vec_add(vec1, vec2), cy);
}

/* Performs a-b as if the vector held two 64-bit double words */
uint32x4_p sub64(const uint32x4_p a, const uint32x4_p b)
{
    const uint8x16_p bmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};
    const uint32x4_p amask = {1, 1, 1, 1};
    const uint32x4_p zero = {0, 0, 0, 0};

    uint32x4_p bw = vec_subc(vec1, vec2);
    bw = vec_andc(amask, bw);
    bw = vec_perm(bw, zero, bmask);
    return vec_sub(vec_sub(vec1, vec2), bw);
}

Power ISA 2.07 użyty w Power8 w końcu dostarczył 64-bitowe podwójne słowa. Programista pracujący z Power8 musi tylko wykonać następujące czynności.

#include <altivec.h>
typedef __vector unsigned long long uint64x2_p;
...

/* Performs a+b using native vector 64-bit double words */
uint64x2_p add64(const uint64x2_p a, const uint64x2_p b)
{
    return vec_add(a, b);
}

/* Performs a-b using native vector 64-bit double words */
uint64x2_p sub64(const uint64x2_p a, const uint64x2_p b)
{
    return vec_sub(a, b);
}

Realizacje

Następujące procesory zawierają AltiVec, VMX lub VMX128

Motorola/Freescale

IBM

PA Semi

Aplikacje

Wiadomo, że następujące aplikacje wykorzystują akcelerację sprzętową AltiVec lub VMX.

  • Helios posiada natywny port POWER9 / POWER10 z obsługą VMX.

Bibliografia

Zewnętrzne linki