Sada instrukcí XOP - XOP instruction set
The XOP (rozšířené operace[1]) instrukční sada, oznámil AMD 1. května 2009 představuje rozšíření 128bitové verze SSE základní pokyny v x86 a AMD64 instrukční sada pro Buldozer procesorové jádro, které vyšlo 12. října 2011.[2] AMD však odstranil podporu XOP z Zen (mikroarchitektura) Kupředu.[3]
Sada instrukcí XOP obsahuje několik různých typů vektorových instrukcí, protože byla původně zamýšlena jako hlavní upgrade na SSE. Většina pokynů je celočíselných, ale obsahuje také pokyny pro permutaci s plovoucí desetinnou čárkou a extrakci zlomků s plovoucí desetinnou čárkou. Seznam typů instrukcí najdete v rejstříku.
Dějiny
XOP je revidovaná podmnožina toho, co bylo původně zamýšleno jako SSE5. Bylo změněno, aby bylo podobné, ale nepřekrývalo se AVX, části, které se překrývaly s AVX, byly odstraněny nebo přesunuty do samostatných standardů, jako je FMA4 (vektor s plovoucí desetinnou čárkou znásobit – hromadit ) a CVT16 (Poloviční přesnost převod s plovoucí desetinnou čárkou implementován jako F16C uživatelem Intel ).[1]
Všechny pokyny SSE5, které byly ekvivalentní nebo podobné instrukcím v AVX a FMA4 instrukční sady oznámené společností Intel byly změněny, aby používaly kódování navržené společností Intel. Celé číslo instrukce bez ekvivalenty v AVX byly klasifikovány jako rozšíření XOP.[1] Pokyny XOP mají bajt opcode 8F (hexadecimální ), ale jinak téměř identické kódovací schéma jako AVX s 3bajtovou předponou VEX.
Komentátoři[4] to viděli jako důkaz, že Intel nedovolil AMD používat žádnou část velkého kódovacího prostoru VEX. AMD byla nucena používat různé kódy, aby se vyhnula použití jakékoli kombinace kódů, kterou by společnost Intel mohla použít ve svém vývojovém kanálu pro něco jiného. Schéma kódování XOP je co nejblíže schématu VEX, jak je technicky možné, aniž by riskovalo, že se kódy AMD překrývají s budoucími kódy Intel. Tento závěr je spekulativní, protože nejsou k dispozici žádné veřejné informace o jednáních mezi dvěma společnostmi o této otázce.
Použití bajtu 8F vyžaduje, aby m-bity (viz Schéma kódování VEX ) mají hodnotu větší nebo rovnou 8, aby se zabránilo překrývání s existujícími pokyny. Bajt C4 použitý ve schématu VEX nemá žádné takové omezení. To může v budoucnu zabránit použití m-bitů pro jiné účely ve schématu XOP, ale ne ve schématu VEX. Dalším možným problémem je, že bity pp mají ve schématu XOP hodnotu 00, zatímco ve schématu VEX mají hodnotu 01 pro instrukce, které nemají žádný starší ekvivalent. To může v budoucnu komplikovat použití bitů pp pro jiné účely.
Podobným problémem s kompatibilitou je rozdíl mezi FMA3 a FMA4 instrukční sady. Intel původně navrhoval FMA4 ve specifikaci AVX / FMA verze 3, aby nahradil 3-operandový FMA navržený AMD v SSE5. Poté, co AMD přijalo FMA4, Intel zrušil podporu FMA4 a vrátil se k FMA3 ve specifikaci AVX / FMA verze 5 (viz Historie FMA ).[1][5][6]
V březnu 2015 společnost AMD v popisu opravy balíčku GNU Binutils výslovně odhalila, že Zen, jeho architektura x86-64 třetí generace ve své první iteraci (znver1 - Zen, verze 1), nebude podporovat instrukce TBM, FMA4, XOP a LWP vyvinuté speciálně pro rodinu mikroarchitektur „Bulldozer“.[7][8]
Násobení celého čísla - hromadění pokynů
Jedná se o celočíselnou verzi souboru Sada instrukcí FMA. To jsou všechny čtyři instrukce operandu podobné FMA4 a všichni pracují na podepsaných celých číslech.
Návod | Popis[9] | Úkon |
---|---|---|
VPMACSWW
| Znásobte hromadění (se sytostí) slovo na slovo | 2x8 slov (a0-a7, b0-b7) + 8 slov (c0-c7) → 8 slov (r0-r7) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
| Znásobte akumulaci (se sytostí), nízké slovo na dvojslovo | 2x8 slov (a0-a7, b0-b7) + 4 dvojitá slova (c0-c3) → 4 dvojitá slova (r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, .[2] |
VPMACSDD
| Znásobte akumulaci (se sytostí) Doubleword na Doubleword | 2x4 dvojitá slova (a0-a3, b0-b3) + 4 dvojitá slova (c0-c3) → 4 dvojitá slova (r0-r3) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
| Znásobte akumulaci (se sytostí) Nízké dvojslovo na čtyřslovo | 2x4 dvojitá slova (a0-a3, b0-b3) + 2 hesla (c0-c1) → 2 quadwords (r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
| Znásobte hromadění (se sytostí) vysoké dvojslovo na čtyřslovo | 2x4 dvojitá slova (a0-a3, b0-b3) + 2 quadwords (c0-c1) → 2 quadwords (r0-r3) r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
| Násobení přidání hromadění (se sytostí) Wordu do Doubleword | 2x8 slov (a0-a7, b0-b7) + 4 dvojitá slova (c0-c3) → 4 dvojitá slova (r0-r3) r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
Celočíselný vektor horizontální přidání
Pokyny pro vodorovné přidání přidají sousední hodnoty ve vstupním vektoru k sobě navzájem. Velikost výstupu v níže uvedených pokynech popisuje, jak široké je horizontální přidání. Například vodorovný bajt do slova přidá dva bajty najednou a vrátí výsledek jako vektor slov, ale bajt do čtyřslova přidá dohromady osm bajtů najednou a vrátí výsledek jako vektor čtyřslov. Šest dalších pokynů pro vodorovné sčítání a odčítání najdete v SSSE3, ale fungují na dvou vstupních vektorech a provádějí pouze dvě a dvě operace.
Návod | Popis[9] | Úkon |
---|---|---|
VPHADDBW
| Vodorovně přidat dva podepsané / nepodepsané bajty do slova | 16 bajtů (a0-a15) → 8 slov (r0-r7) r0 = a0 + a1, r1 = a2 + a3, r2 = a4 + a5, ... |
VPHADDBD
| Vodorovně přidejte k dvojslovu čtyři podepsané / nepodepsané bajty | 16 bajtů (a0-a15) → 4 dvojitá slova (r0-r3) r0 = a0 + a1 + a2 + a3, r1 = a4 + a5 + a6 + a7, ... |
VPHADDBQ
| Vodorovně přidejte k čtyřslovu osm podepsaných / nepodepsaných bajtů | 16 bajtů (a0-a15) → 2 quadwords (r0-r1) r0 = a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7, ... |
VPHADDWD
| Vodorovně přidejte dvě podepsaná / nepodepsaná slova k dvojslovu | 8 slov (a0-a7) → 4 dvojitá slova (r0-r3) r0 = a0 + a1, r1 = a2 + a3, r2 = a4 + a5, ... |
VPHADDWQ
| Vodorovně přidejte do čtyřslovnosti čtyři podepsaná / nepodepsaná slova | 8 slov (a0-a7) → 2 quadwords (r0-r1) r0 = a0 + a1 + a2 + a3, r1 = a4 + a5 + a6 + a7 |
VPHADDDQ
| Vodorovně přidejte dvě podepsaná / nepodepsaná dvojitá slova do čtyřslov | 4 dvojitá slova (a0-a3) → 2 quadwords (r0-r1) r0 = a0 + a1, r1 = a2 + a3 |
VPHSUBBW | Vodorovně odečtěte dva podepsané bajty od slova | 16 bajtů (a0-a15) → 8 slov (r0-r7) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, ... |
VPHSUBWD | Vodorovně odečtěte dvě podepsaná slova od dvouslov | 8 slov (a0-a7) → 4 dvojitá slova (r0-r3) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, ... |
VPHSUBDQ | Vodorovně odečtěte dvě podepsaná dvojitá slova od čtyřslov | 4 dvojitá slova (a0-a3) → 2 quadwords (r0-r1) r0 = a0-a1, r1 = a2-a3 |
Porovnání celočíselných vektorů
Tato sada instrukcí pro porovnání vektorů bere okamžitý jako další argument. Okamžitě kontroluje, jaký druh srovnání se provádí. Pro každou instrukci je možné osm srovnání. Vektory jsou porovnány a všechna srovnání, která vyhodnocují na true, nastavují všechny odpovídající bity v cíli na 1 a falešná srovnání nastavuje všechny stejné bity na 0. Tento výsledek lze použít přímo v instrukci VPCMOV pro vektorizovanou podmíněný tah.
Návod | Popis[9] | Bezprostřední | Srovnání | |
---|---|---|---|---|
VPCOMB | Porovnejte vektorové signované bajty | 000 | Méně než | |
VPCOMW | Porovnejte vektorová signovaná slova | 001 | Méně než nebo stejné | |
VPCOMD | Porovnejte vektorová podepsaná slova | 010 | Větší než | |
VPCOMQ | Porovnejte vektorová čtyřnásobná hesla | 011 | Větší než nebo stejné | |
VPCOMUB | Porovnejte vektorové nepodepsané bajty | 100 | Rovnat se | |
VPCOMUW | Porovnejte vektorová nepodepsaná slova | 101 | Není to stejné | |
VPCOMUD | Porovnejte vektorová nepodepsaná dvojí slova | 110 | Nepravdivé | |
VPCOMUQ | Porovnejte vektorová nepodepsaná čtyřnásobná hesla | 111 | Skutečný |
Podmíněný tah vektoru
VPCMOV funguje jako bitová varianta instrukcí pro míchání v SSE4. Pro každý bit ve voliči 1 vybere stejný bit v prvním zdroji a 0 vybere stejný v druhém zdroji. Při použití společně s výše uvedenými instrukcemi pro srovnání vektoru XOP lze toto použít k implementaci vektorizovaného ternárního pohybu, nebo pokud je druhý vstup stejný jako cíl, podmíněného pohybu (CMOV).
Návod | Popis[9] |
---|---|
VPCMOV | Podmíněný pohyb vektoru |
Pokyny pro posun a otáčení celého čísla
Pokyny pro řazení se zde liší od pokynů v SSE2 v tom, že mohou posunout každou jednotku o jinou částku pomocí vektorového registru interpretovaného jako zabalená celá čísla se znaménkem. Značka označuje směr řazení nebo otáčení, přičemž kladné hodnoty způsobují posun vlevo a záporný posun doprava[10]Intel v AVX2 specifikoval jinou nekompatibilní sadu instrukcí posunu variabilního vektoru.[11]
Návod | Popis[9] |
---|---|
VPROTB | Zabalené rotační bajty |
VPROTW | Zabalená otočná slova |
VPROTD | Zabalené otočení dvojitých slov |
VPROTQ | Zabalené rotační čtverce |
VPSHAB | Sbalené aritmetické bajty posunu |
VPSHAW | Zabalená směnová aritmetická slova |
VPSHAD | Zabalená aritmetická dvojitá slova Shift |
VPSHAQ | Zabalené směnné aritmetické čtverce |
VPSHLB | Sbalené logické bajty Shift |
VPSHLW | Zabalená logická slova Shift |
VPSHLD | Balíček Shift Logical Doublewords |
VPSHLQ | Balíček Shift Logical Quadwords |
Vektorové permutace
VPPERM je jediná instrukce, která kombinuje SSSE3 instrukce PALIGNR a PSHUFB a přidává další k oběma. Někteří to srovnávají Altivec instrukce VPERM.[12] Jako vstup je zapotřebí tři registry, první dva jsou zdrojové a třetí selektorový. Každý bajt ve voliči vybírá jeden z bajtů v jednom ze dvou vstupních registrů pro výstup. Selektor může také aplikovat efekty na vybrané bajty, jako je nastavení na 0, obrácení pořadí bitů a opakování většiny signativního bitu. Všechny efekty nebo vstup lze navíc invertovat.
Pokyny VPERMIL2PD a VPERMIL2PS jsou dvě zdrojové verze pokynů VPERMILPD a VPERMILPS v AVX což znamená, že jako VPPERM mohou vybrat výstup z kteréhokoli z polí ve dvou vstupech.
Návod | Popis[9] |
---|---|
VPPERM | Zabalený Permute Byte |
VPERMIL2PD | Permutovat dva zdroje s dvojitou přesností s pohyblivou řádovou čárkou |
VPERMIL2PS | Permutovat dva zdroje s jednou přesnou plovoucí desetinnou čárkou |
Extrakce s plovoucí desetinnou čárkou
Tyto pokyny extrahují zlomkovou část s plovoucí desetinnou čárkou, tj. Část, která by byla ztracena při převodu na celé číslo.
Návod | Popis[9] |
---|---|
VFRCZPD | Extrahujte frakci s dvojitou přesností s plovoucí desetinnou čárkou |
VFRCZPS | Extrahujte zlomek s jednou přesnou plovoucí desetinnou čárkou |
VFRCZSD | Extrahujte zlomkovou skalární dvojitou přesností s plovoucí desetinnou čárkou |
VFRCZSS | Extrahujte zlomkový skalární jednopřesný plovoucí bod |
CPU s XOP
- AMD:
- Procesory „Heavy Equipment“
- Buldozer procesory, 4. čtvrtletí 2011[13]
- Na základě pilota procesory, 4. čtvrtletí 2012[14]
- Na bázi parního válce procesory, 1. čtvrtletí 2014
- Na základě rypadla procesory (včetně „v2“), 2015
- Procesory „Heavy Equipment“
Viz také
Reference
- ^ A b C d Dave Christie (07.05.2009), Dosažení rovnováhy Blogy AMD Developer, archivovány z originál dne 04.11.2013, vyvoláno 2013-11-04
- ^ A b AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions (PDF), AMD, 1. května 2009
- ^ Michael Larabel (3. března 2017). „Dopad ladění kompilátoru GCC Zen na výkon AMD Ryzen“. Phoronix.
Ale vzhledem k tomu, že Zen je designem čistého listu, existují v procesorech Bulldozer, která nebyla nalezena v Zen / znver1, některá rozšíření sady instrukcí. Mezi ty, které již nejsou přítomny, patří FMA4 a XOP.
- ^ Agner Fog (5. prosince 2009), Zastavte válku s instrukční sadou
- ^ Intel AVX Programming Reference (PDF), Březen 2008, vyvoláno 2012-01-17
- ^ Referenční příručka k programování Intel Advanced Vector Extensions, Leden 2009, archivovány od originál 29. února 2012, vyvoláno 2012-01-17
- ^ Ganesh Gopalasubramanian (10. března 2015). „[PATCH] add znver1 processor“. [email protected] (Poštovní seznam).
- ^ Amit Pawar (7. srpna 2015). „[PATCH] Odebrat CpuFMA4 z příznaků CPU Znver1“. [email protected] (Poštovní seznam).
- ^ A b C d E F G „AMD64 Architecture Programmer's Manual, Volume4: 128-Bit and 256-Bit Media Instructions“ (PDF). AMD. Citováno 2014-01-13.
- ^ "Nové" pokyny "Buldozer" a "Piledriver" (PDF). AMD. Citováno 2014-01-13.
- ^ „Referenční příručka k programování rozšíření architektury Intel“. Intel. Archivovány od originál (PDF) 1. února 2014. Citováno 2014-01-29.
- ^ „Optimalizace Buldozer x264“. Citováno 2014-01-13.
- ^ Dave Christie (07.05.2009), Dosažení rovnováhy Blogy AMD Developer, archivovány z originál dne 09.11.2013, vyvoláno 2012-01-17
- ^ Nové pokyny pro „buldozer“ a „piledriver“ (PDF), AMD, říjen 2012