AltiVec - AltiVec
Architektury POWER , PowerPC a Power ISA |
---|
NXP (dříve Freescale a Motorola) |
IBM |
|
IBM/Nintendo |
jiný |
Související odkazy |
Zrušeno šedou barvou , historické kurzívou |
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 RGB „ pixel “, 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 vector
odstranění vector
klíčového slova a místo něj použít __vector
klíč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 add
a subtract
C 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
- MPC7400
- MPC7410
- MPC7450
- MPC7445/7455
- MPC7447/7447A/7457
- MPC7448
- MPC8641/8641D
- MPC8640/8640D
- MPC8610
- T2081/T2080
- T4080/T4160/T4240
- B4420/B4860
IBM
- PowerPC 970
- PowerPC 970FX
- PowerPC 970MP
- Xenon
- Buňka BE
- PowerXCell 8i
- POWER6/POWER6+
- POWER7/POWER7+
- VÝKON 8
- SÍLA 9
- Výkon 10
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.