AltiVec - AltiVec

AltiVec je sada instrukcí SIMD s plovoucí desetinnou čárkou a celým číslem SIMD navržená a vlastněná společnostmi Apple , IBM a Freescale Semiconductor (dříve Motorola 's Semiconductor Products Sector) -aliance AIM . Je realizován ve verzích pro PowerPC procesorů architektury, včetně Motorola G4 , IBM je G5 a POWER6 procesory a PA Semi 's PWRficient PA6T. AltiVec je ochranná známka vlastněná výhradně společností Freescale, takže systém je také označován jako Velocity Engine společností Apple a VMX ( Vector Multimedia Extension ) společností IBM a PA Semi.

Zatímco AltiVec odkazuje na sadu instrukcí, implementace v CPU vyráběných IBM a Motorola jsou z hlediska logického designu oddělené. K dnešnímu dni žádné jádro IBM nezahrnovalo logický design AltiVec licencovaný společností Motorola nebo naopak.

AltiVec je standardní součástí specifikace Power ISA v.2.03 . Až do této specifikace nikdy nebyla formálně součástí architektury PowerPC, přestože používala formáty a syntaxi instrukcí PowerPC a zabírala prostor operačního kódu výslovně vyhrazený pro takové účely.

Srovnání s x86-64 SSE

Jak VMX/AltiVec, tak SSE mají 128bitové vektorové registry, které mohou představovat šestnáct 8bitových podepsaných nebo nepodepsaných znaků, osm 16bitových podepsaných nebo nepodepsaných šortek, čtyři 32bitové inty nebo čtyři 32bitové proměnné s pohyblivou řádovou čárkou. Oba poskytují pokyny k ovládání mezipaměti, jejichž cílem je minimalizovat znečištění mezipaměti při práci s datovými proudy.

Vykazují také důležité rozdíly. Na rozdíl od SSE2 podporuje VMX/AltiVec speciální datový typ RGBpixel “, ale nepracuje na 64bitových plovácích s dvojitou přesností a neexistuje způsob, jak přesouvat data přímo mezi skalárními a vektorovými registry. V souladu s modelem „načíst/uložit“ návrhu RISC PowerPC lze vektorové registry, stejně jako skalární registry, načítat pouze z a ukládat do paměti. VMX/AltiVec však poskytuje mnohem úplnější sadu „horizontálních“ operací, které fungují napříč všemi prvky vektoru; povolené kombinace datového typu a operací jsou mnohem úplnější. K dispozici je 32 128bitových vektorových registrů ve srovnání s osmi pro SSE a SSE2 (rozšířeno na 16 v x86-64 ) a většina instrukcí VMX/AltiVec má tři operandy registru ve srovnání s pouhými dvěma operandy registr/registr nebo registr/paměť na IA-32 .

VMX/AltiVec je také jedinečný v podpoře flexibilních vektorových permutačních instrukcí , ve kterých lze každý bajt výsledné vektorové hodnoty převzít z libovolného bajtu některého ze dvou dalších vektorů, parametrizovaných ještě dalším vektorem. To umožňuje sofistikované manipulace v jedné instrukci.

Nedávné verze kolekce GNU Compiler Collection (GCC), kompilátoru IBM VisualAge a dalších kompilátorů poskytují vnitřní přístup k instrukcím VMX/AltiVec přímo z programů C a C ++ . Od verze 4 obsahuje GCC také možnosti automatické vektorizace , které se pokoušejí inteligentně vytvářet zrychlené binární soubory VMX/Altivec, aniž by programátor musel přímo používat vnitřní funkce. Klíčové slovo typu "vektor" je zavedeno, aby umožnilo deklaraci nativních typů vektorů, např. " vector unsigned char foo;" Deklaruje 128bitovou vektorovou proměnnou s názvem "foo" obsahující šestnáct 8bitových znaků bez znaménka. Úplný doplněk aritmetických a binárních operátorů je definován na vektorových typech, takže k manipulaci s vektorovými proměnnými lze použít normální C výrazový jazyk. Existují také přetížené vnitřní funkce, jako například „ vec_add“, které vysílají příslušný operační kód na základě typu prvků ve vektoru, a vynucuje se velmi silná kontrola typu. Naproti tomu Intel definované datové typy pro registry IA-32 SIMD deklarují pouze velikost vektorového registru (128 nebo 64 bitů) a v případě 128bitového registru, zda obsahuje celá čísla nebo hodnoty s plovoucí desetinnou čárkou. Programátor musí vybrat příslušný vnitřní pro používané datové typy, např. " _mm_add_epi16(x,y)" Pro přidání dvou vektorů obsahujících osm 16bitových celých čísel.

Historie vývoje

Power Vector Media Extension (VMX) byl vyvinut v letech 1996 až 1998 na základě společného projektu mezi společnostmi Apple, IBM a Motorola. Apple byl hlavním zákazníkem Power Vector Media Extension (VMX), dokud Apple 6. června 2005 nepřešel na procesory x86 založené na procesorech Intel. Využili ho k akceleraci multimediálních aplikací, jako je QuickTime , iTunes a klíčových částí Apple Mac OS X včetně grafického skladatele Quartz . Jiné společnosti, jako je Adobe, používaly AltiVec k optimalizaci programů pro zpracování obrázků, jako je Adobe Photoshop . Motorola byla první, kdo dodával procesory s podporou AltiVec, počínaje řadou G4. AltiVec byl také použit v některých vestavěných systémech pro vysoce výkonné zpracování digitálního signálu.

IBM důsledně vynechávala VMX ze svých dřívějších mikroprocesorů POWER , které byly určeny pro serverové aplikace, kde to nebylo příliš užitečné. POWER6 mikroprocesor, který byl zaveden v roce 2007, realizuje AltiVec. Poslední stolní mikroprocesor od IBM, PowerPC 970 (Apple ho přezdívá „G5“), také implementoval AltiVec s hardwarem podobným hardwaru PowerPC 7400 .

AltiVec je obchodní značka společnosti Freescale (dříve Motorola) pro standardní kategorii: Vektorová část specifikace Power ISA v.2.03 . Tato kategorie je známá také jako VMX (používá ji IBM) a „Velocity Engine“ (obchodní značka, kterou dříve používala společnost Apple).

Cell Broadband Engine, který se používá v (mimo jiné) Tento PlayStation 3 , podporuje také napájení Vector Extension (Media VMX) ve své PPU, s SPU ISA je lepší, ale architektonicky podobné.

Freescale přináší vylepšenou verzi AltiVec na procesory QorIQ založené na e6500 .

VMX128

IBM zvýšenou VMX pro použití v Xenon (Xbox 360) a s názvem toto zlepšení VMX128. Vylepšení zahrnují nové rutiny zaměřené na hraní her (akcelerace 3D grafiky a herní fyziky) a celkem 128 registrů. VMX128 není zcela kompatibilní s VMX/Altivec, protože byla odstraněna řada celočíselných operací, aby se uvolnilo místo pro větší soubor registru a další operace specifické pro aplikaci.

VSX (vektorové skalární rozšíření)

Power ISA v2.06 představil VSX vektorově skalární instrukce, které rozšiřují zpracování SIMD pro Power ISA tak, aby podporovalo až 64 registrů, s podporou pravidelné plovoucí desetinné čárky, desítkové plovoucí desetinné čárky a vektorového spouštění. POWER7 je první procesor Power ISA, který implementoval Power ISA v2.06.

Nové pokyny zavádí IBM v kategorii Vector Media Extension pro celočíselné operace jako součást rozšíření VSX v Power ISA 2.07.

Společnost IBM zavedla nové celočíselné vektorové pokyny po kódování VMX jako součást rozšíření VSX v Power ISA v3.0. Bude představen s procesory POWER9 .

Problémy

V jazyce C ++ se standardní způsob přístupu k podpoře AltiVec vzájemně vylučuje s použitím šablony vector<>třídy Standard Template Library kvůli zpracování "vektoru" jako vyhrazeného slova, když kompilátor neimplementuje kontextovou verzi klíčového slova vektoru. Může však být možné je kombinovat pomocí zástupných řešení specifických pro kompilátor; například v GCC lze provést #undef vectorodstranění vectorklíčového slova a místo něj použít __vectorklíčové slovo specifické pro GCC .

AltiVec před Power ISA 2.06 s VSX postrádá načítání z paměti pomocí přirozeného zarovnání typu. Níže uvedený kód například vyžaduje speciální zpracování pro Power6 a nižší, pokud efektivní adresa není zarovnána na 16 bajtů. Speciální manipulace přidává 3 další pokyny k operaci načítání, když není k dispozici VSX.

#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 před Power ISA 2.06 s VMX postrádá 64bitovou celočíselnou podporu. Vývojáři, kteří chtějí pracovat na 64bitových datech, budou vyvíjet rutiny z 32bitových komponent. Níže jsou například příklady 64bitových adda subtractC pomocí vektoru se čtyřmi 32bitovými slovy na big-endianovém stroji . Permutové přesouvají bity přenášení a půjčování ze sloupců 1 a 3 do sloupců 0 a 2 jako v matematice ze školní knihy. Malý endianský stroj by potřeboval jinou masku.

#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 použitá v Power8 nakonec poskytla 64bitová dvojitá slova. Vývojář pracující s Power8 potřebuje pouze provést následující.

#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);
}

Implementace

Následující procesory obsahují AltiVec, VMX nebo VMX128

Motorola/Freescale

IBM

PA Semi

Softwarové aplikace

O následujících softwarových aplikacích je známo, že využívají hardwarovou akceleraci AltiVec nebo VMX.

  • Helios má nativní port POWER9 / POWER10 s podporou VMX.

Reference

externí odkazy