AltiVec - AltiVec

AltiVec je jednoduchá přesnost plovoucí bod a celé číslo SIMD instrukční sada navrhl a vlastnil Jablko, IBM, a Freescale Semiconductor (dříve Motorola Sector Semiconductor Products) - Aliance AIM. Je implementován na verzích PowerPC procesorová architektura, včetně procesorů Motorola G4, IBM je G5 a SÍLA6 zpracovatelé a P.A. Semi je PWRficient PA6T. AltiVec je ochranná známka je vlastněn výhradně společností Freescale, takže je tento systém označován také jako Rychlostní motor od společnosti Apple a VMX (Vektorové multimediální rozšíření) společnostmi IBM a P.A. Semi.

Zatímco AltiVec odkazuje na instrukční sadu, implementace v CPU produkovaných společnostmi IBM a Motorola jsou z hlediska logického designu oddělené. Doposud žádné jádro IBM nezahrnovalo logický design AltiVec s licencí od společnosti Motorola nebo naopak.

AltiVec je standardní součástí Power ISA v.2.03[1] Specifikace. Až do této specifikace nikdy nebyl formálně součástí architektury PowerPC, i když používal formáty a syntaxe instrukcí PowerPC a zabíral prostor opcode výslovně přidělený pro tyto úč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é palce nebo čtyři 32-bit proměnné s plovoucí desetinnou čárkou. Oba poskytují mezipaměti -kontrolní pokyny určené k minimalizaci znečištění mezipaměti při práci na proudech dat.

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

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

Poslední verze[když? ] z Sbírka překladačů GNU (GCC), IBM VisualAge překladač a další překladače poskytují vnitřní pro přístup k instrukcím VMX / AltiVec přímo z C a C ++ programy. Od verze 4 GCC také zahrnuje automatická vektorizace schopnosti, které se pokoušejí inteligentně vytvářet zrychlené binární soubory VMX / Altivec, aniž by programátor musel přímo používat vnitřní vlastnosti. Klíčové slovo typu „vektor“ je zavedeno, aby umožnilo deklaraci nativních typů vektorů, např. „vektor nepodepsaný char foo;"deklaruje 128bitovou vektorovou proměnnou s názvem" foo "obsahující šestnáct 8bitových nepodepsaných znaků. Úplný počet 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 běžný jazyk výrazu C. Existují také přetížené vnitřní funkce jako „vec_add"které vydávají příslušný operační kód na základě typu prvků ve vektoru a je vynucena velmi silná kontrola typu. Naproti tomu datové typy definované Intelem pro registry SIMD IA-32 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 vhodnou vnitřní vlastnost 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ě projektu spolupráce mezi společnostmi Apple, IBM a Motorola. Apple byl primárním zákazníkem pro Power Vector Media Extension (VMX), dokud Apple 6. června 2005 nepřecházel na procesory založené na Intel x86. Použili jej k urychlení multimédia aplikace jako QuickTime, iTunes a klíčové části Apple Mac OS X včetně v Křemenný grafický skladatel. Jiné společnosti, jako je Adobe, používaly AltiVec k optimalizaci svých programů pro zpracování obrázků, jako je Adobe Photoshop. Společnost Motorola jako první dodala 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ě vynechala VMX ze svých dřívějších POWER mikroprocesory, které byly určeny pro serverové aplikace, kde to nebylo příliš užitečné. The SÍLA6 mikroprocesor, představený v roce 2007, implementuje AltiVec. Poslední stolní mikroprocesor od IBM, PowerPC 970 (nazvaný "G5" od Apple) také implementoval AltiVec s hardwarem podobným hardwaru z PowerPC 7400.

AltiVec je ochranná známka společnosti Freescale (dříve Motorola), která je standardem Kategorie: Vektor část Power ISA v.2.03[1] Specifikace. Tato kategorie je také známá jako VMX (používá ji IBM) a „Velocity Engine“ (značka, kterou dříve používala společnost Apple).

The Buňka Broadband Engine, používaný v (mimo jiné) v PlayStation 3, také podporuje Power Vector Media Extension (VMX) ve svém PPU, přičemž SPU ISA je vylepšený, ale architektonicky podobný.

Freescale přináší vylepšenou verzi AltiVec e6500 na základě QorIQ procesory.

VMX128

IBM rozšířené VMX pro použití v Xenon (Xbox 360) a nazval toto vylepšení VMX128. Vylepšení zahrnují nové rutiny zaměřené na hraní her (akcelerace 3D grafiky a herní fyziky)[2] a celkem 128 registrů. VMX128 není zcela kompatibilní s VMX / Altivec, protože byla odstraněna celá řada celočíselných operací, aby se vytvořil prostor pro větší soubor registru a další operace specifické pro aplikaci.[3] [4]

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

Power ISA v2.06 představil vektorové skalární instrukce VSX[5] které rozšiřují zpracování SIMD pro Power ISA na podporu až 64 registrů s podporou pravidelného plovoucího bodu, desetinného plovoucího bodu a vektorového provádění. SÍLA7 je první procesor Power ISA implementující 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.

Nové instrukce celočíselných vektorů byly zavedeny společností IBM v návaznosti na kódování VMX jako součást rozšíření VSX v Power ISA v3.0. Bude představen s SÍLA9 procesory.[6]

Problémy

V C ++ se standardní způsob přístupu k podpoře AltiVec vzájemně vylučuje s použitím knihovny standardních šablon vektor <> Šablona třídy kvůli zacházení s "vektorem" jako vyhrazeným slovem, když kompilátor neimplementuje kontextovou verzi klíčového slova vektoru. Je však možné je kombinovat pomocí zástupných řešení specifických pro kompilátor; například v GCC se to dá dělat #undef vektor odstranit vektor klíčové slovo a poté použijte specifický GCC __vektor klíčové slovo na jeho místo.

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

 1#zahrnout <altivec.h> 2typedef __vektor nepodepsaný char uint8x16_p; 3typedef __vektor nepodepsaný  int uint32x4_p; 4... 5int hlavní(int argc, char* argv) 6{ 7    / * Přirozené zarovnání valů je 4; a ne 16 podle potřeby * / 8    nepodepsaný int vals[4] = { 1, 2, 3, 4 }; 9    uint32x4_p vec;1011#if defined (__ VSX__) || definované (_ARCH_PWR8)12    vec = vec_xl(0, vals);13#jiný14    konst uint8x16_p perm = vec_lvsl(0, vals);15    konst uint8x16_p nízký  = vec_ld(0, vals);16    konst uint8x16_p vysoký = vec_ld(15, vals);17    vec = (uint32x4_p)vec_perm(nízký, vysoký, perm);18#endif1920}

AltiVec před Power ISA 2.06 s VMX postrádá 64bitovou integer podporu. Vývojáři, kteří chtějí pracovat na 64bitových datech, budou vyvíjet rutiny z 32bitových komponent. Například níže jsou příklady 64bitových přidat a odčítat v C pomocí vektoru se čtyřmi 32bitovými slovy na a big-endian stroj. Obvody přesouvají nosné a vypůjčené bity ze sloupců 1 a 3 do sloupců 0 a 2 jako ve školní učebnici. Malý endianský stroj by potřeboval jinou masku.

 1#zahrnout <altivec.h> 2typedef __vektor nepodepsaný char uint8x16_p; 3typedef __vektor nepodepsaný  int uint32x4_p; 4... 5 6/ * Provede a + b, jako by vektor obsahoval dvě 64bitová dvojitá slova * / 7uint32x4_p add64(konst uint32x4_p A, konst uint32x4_p b) 8{ 9    konst uint8x16_p cmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};10    konst uint32x4_p nula = {0, 0, 0, 0};1112    uint32x4_p cy = vec_addc(vec1, vec2);13    cy = vec_perm(cy, nula, cmask);14    vrátit se vec_add(vec_add(vec1, vec2), cy);15}1617/ * Provede a-b, jako by vektor obsahoval dvě 64bitová dvojitá slova * /18uint32x4_p sub64(konst uint32x4_p A, konst uint32x4_p b)19{20    konst uint8x16_p maska = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};21    konst uint32x4_p maska = {1, 1, 1, 1};22    konst uint32x4_p nula = {0, 0, 0, 0};2324    uint32x4_p bw = vec_subc(vec1, vec2);25    bw = vec_andc(maska, bw);26    bw = vec_perm(bw, nula, maska);27    vrátit se vec_sub(vec_sub(vec1, vec2), bw);28}

Power ISA 2.07 použitý v Power8 nakonec poskytl 64bitová dvojitá slova. Vývojář pracující s Power8 musí provést pouze následující.

 1#zahrnout <altivec.h> 2typedef __vektor nepodepsaný dlouho dlouho uint64x2_p; 3... 4 5/ * Provede a + b pomocí nativních vektorových 64bitových dvojitých slov * / 6uint64x2_p add64(konst uint64x2_p A, konst uint64x2_p b) 7{ 8    vrátit se vec_add(A, b); 9}1011/ * Provádí ab pomocí nativních vektorových 64bitových dvojitých slov * /12uint64x2_p sub64(konst uint64x2_p A, konst uint64x2_p b)13{14    vrátit se vec_sub(A, b);15}

Implementace

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

Motorola / Freescale

IBM

P.A. Semi

Reference

  1. ^ A b „Power ISA v.2.03“ (PDF). Power.org.[trvalý mrtvý odkaz ]
  2. ^ „Příběh procesoru Microsoft Xbox 360“. IBM. Říjen 2015. Archivovány od originálu dne 2008-01-20.CS1 maint: BOT: stav původní adresy URL neznámý (odkaz)
  3. ^ Využití datově paralelní architektury SIMD ve videohrách a superpočítačích IBM Research
  4. ^ Implementace architektur sady instrukcí s nesouvislými specifikátory souborů registrů US patent 7 421 566
  5. ^ „Zrychlení pracovního vytížení s vektorovou skalární architekturou IBM POWER“. IBM. 2016-03-01. Citováno 2017-05-02.
  6. ^ „Peter Bergner - [PATCH, COMMITTED] Přidat plnou podporu binutilů Power ISA 3.0 / POWER9“.

externí odkazy