Suoratoisto SIMD-laajennukset

Tämä artikkeli on luonnos noin tietokoneista .

Voit jakaa tietosi parantamalla sitä ( miten? ) Vastaavien projektien suositusten mukaisesti .

SIMD Extensions , yleisestilyhennettä SSE, on joukko 70 lisäohjeitax86mikroprosessorien , julkaistiin vuonna1999onPentium III vastauksena3DNow! ofAMDilmestyi 1 vuosi aikaisemmin. Toiminta onSIMD-tyyppistä.

Se paljastettiin ensimmäisen kerran nimellä KNI, joka tarkoittaa "  Katmai uudet ohjeet  " ( Katmai New Instructions englanniksi , Katmai on Pentium III -ydin ensimmäisen version koodinimi ). Katmai-projektin aikana Intel halusi erottaa sen aiemmista tuotelinjoistaan ​​ja erityisesti lippulaivatuotteestaan, Pentium II: sta . AMD lisäsi SSE-ohjeiden tuen Athlon XP -prosessoreillaan . Myöhemmin se nimettiin uudelleen ISSE, joka tarkoittaa "  Intel Streaming SIMD Extensions  ", sitten SSE.

Kaiken kaikkiaan IA-32 SIMD: t ja MMX: t ovat osoittautuneet pettymyksiksi. MMX: llä oli kaksi pääongelmaa: se käytti uudelleen olemassa olevia liukulukurekistereitä, jolloin prosessori ei kyennyt toimimaan samanaikaisesti liukuluku- ja SIMD-tiedoissa, ja työskenteli vain kokonaislukujen kanssa.

Rekisterit

SSE lisäsi alun perin kahdeksan uutta 128-bittistä rekisteriä nimeltä XMM0 - XMM7. Intel- ja AMD x64 -laajennukset lisäävät kahdeksan uutta rekisteriä XMM8: sta XMM15: een. Siellä on myös uusi 32-bittinen ohjaus / tilarekisteri nimeltä MXCSR.

Jokainen rekisteri tiivistää neljä 32-bittistä yhden tarkkuuden liukulukua. Kahdeksan 64-bittistä MMX-rekisteriä voi silti suorittaa täydet SIMD-toiminnot.

SSE-ohjeet

SSE esitteli sekä skalaariset että pakatut liukulukuohjeet.

Liukulukuohjeet

Täydelliset ohjeet

Tarkemmat ohjeet

Esimerkki

Seuraava yksinkertainen esimerkki osoittaa ESS: n käytön edut.

SSE1-ohjeet toimivat yhden tarkkuuden liukulukujen eli 4 tavuun tallennettujen numeroiden kanssa. Rekisteröihin sopiva 4-ulotteinen vektorimuuttuja koostuu siis 16 tavusta. Jos data on kohdistettu 128-bittisesti, se voidaan lukea movaps-käskyllä , muuten, jos sitä ei voida taata, tulisi käyttää movupeja . Muuten saamme virheen ajon aikana.

Vektorin lisäysoperaatiota varten x87 vaatii neljä liukulukujen lisäysohjetta kahden yhden tarkkuuden 4-ulotteisen vektorin lisäämiseksi toisiinsa.

vec_res.x = v1.x + v2.x;
vec_res.y = v1.y + v2.y;
vec_res.z = v1.z + v2.z;
vec_res.w = v1.w + v2.w;

Tämä vastaa neljää FADDx87- käskyä kohdekoodissa. Seuraava pseudokoodi osoittaa, että yksi 128-bittinen pakattu lisäyskäsky voi korvata kaikki neljä skalaarisen lisäysohjetta. Tässä oletetaan, että data on kohdistettu muistiin yli 128 bittiä.

movaps xmm0,adresse-de-v1 ;xmm0 = v1.w | v1.z | v1.y | v1.x addps xmm0,adresse-de-v2 ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps adresse-du-vec_res,xmm0

Siitä huolimatta, että rekistereitä käytetään maksimaalisesti arvojen tallentamiseen monimutkaisten operaatioiden aikana, saavutetaan todella nopeuden lisäys.

Normalisoi vektori

Oletetaan, että xmm0 rekisteri sisältää kolmiulotteisen vektorin normalisoituu (jäljempänä 4 : nnen  komponentin ollessa nolla). Käyttämällä väliaikaisesti xmm6- ja xmm7-rekistereitä voimme normalisoida vektorin seuraavasti:

//Entrée: xmm0 contient un vecteur à normaliser movaps xmm6, xmm0 //effectue une copie du vecteur dans xmm6 mulps xmm0, xmm0 //carré de chaque composante //mix1 movaps xmm7, xmm0 shufps xmm7, xmm7, $4e addps xmm0, xmm7 //additionne les composantes mélangées //mix2 movaps xmm7, xmm0 shufps xmm7, xmm7, $11 addps xmm0, xmm7 //additionne les composantes mélangées //1/sqrt rsqrtps xmm0, xmm0 //inverse de la racine carrée (= longueur) mulps xmm0, xmm6 //que multiplie le vecteur initial //Sortie: xmm0 contient le vecteur normalisé

Vektorituote

Oletetaan, että muuttujat vS1 ja vS2 sisältävät kaksi vektoria, jotka määrittelevät tason, jossa on 3 komponenttia ja 1 käyttämätön komponentti. Ristitulo antaa mahdollisuuden saada normaali vektori, toisin sanoen kohtisuorassa tähän tasoon nähden. Käyttämällä väliaikaisesti xmm6- ja xmm7-rekistereitä voimme laskea ristituotteen ja tallentaa sen kohtaan xmm0 seuraavasti:

movups xmm6, vS1 //le U signifie qu'on ne suppose pas que les données sont alignées à 128 bits shufps xmm6, xmm6, 9 //= 1 + 8, c'est-à-dire une rotation des 3 composantes movups xmm7, vS2 shufps xmm7, xmm7, 18 //= 2 + 16, c'est-à-dire une rotation dans l'autre sens movaps xmm0,xmm6 //premier produit pour chaque composante mulps xmm0,xmm7 movups xmm6, vS1 shufps xmm6, xmm6, 18 movups xmm7, vS2 shufps xmm7, xmm7, 9 mulps xmm7,xmm6 //deuxième produit retranché pour chaque composante subps xmm0,xmm7 //Sortie: xmm0 contient le produit vectoriel de vS1 et vS2

Evoluutiot

Huomautuksia ja viitteitä

  1. (en) [1]
  2. (en) [2]
  3. (en) AMD: n yksisäikeiset tehostetyynyt x86-laajennuksilla osoitteessa theregister.co.uk
  4. (tuumaa) 128-bittinen ohjeisto SSE5 osoitteessa developer.AMD.com

Aiheeseen liittyvät artikkelit