SSE

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 19. helmikuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 5 muokkausta .

SSE ( Streaming SIMD Extensions , streaming SIMD Extensions of the processor) on SIMD - ( eng  . Single Instruction , Multiple Data , One Instruction - A lot of data ) Intelin kehittämä ohjesarja, joka esiteltiin ensimmäisen kerran Pentium III -sarjan prosessoreissa vastaus samanlaiseen käskysarjaan 3DNow! AMD : ltä , joka esiteltiin vuotta aiemmin. Näiden ohjeiden alkuperäinen nimi oli KNI - Katmai New Instructions (Katmai on Pentium III -prosessoriytimen ensimmäisen version nimi ).  

SSE - teknologia mahdollisti kaksi MMX:n pääongelmaa: MMX :ää käytettäessä rinnakkaisprosessoriohjeita ei voitu käyttää samanaikaisesti , koska sen rekisterit jaettiin MMX-rekisterien kanssa, ja MMX:n kyky toimia vain kokonaislukujen kanssa.

SSE sisältää kahdeksan 128-bittistä rekisteriä ja joukon ohjeita, jotka toimivat skalaari- ja pakattujen tietotyyppien kanssa prosessoriarkkitehtuurissa .

Suorituskykyetu saavutetaan, kun on tarpeen suorittaa sama toimintosarja eri datalle. Tässä tapauksessa SSE-lohko rinnastaa laskentaprosessin tietojen välillä.

Ominaisuudet

Rekisterit

SSE:hen on lisätty kahdeksan (x64:lle kuusitoista) 128-bittistä rekisteriä, nimeltään xmm0 - xmm7 (-xmm15).

Kukin rekisteri voi sisältää neljä 32-bittistä yhden tarkkuuden liukulukuarvoa.

SSE-komennot

Liukulukujen komennot

Komennot kokonaisluvuille

Muut komennot

Esimerkki

Seuraava esimerkki näyttää neljän liukulukuparin kertomisen yhdellä mulps- käskyllä :

__declspec ( align ( 16 )) float a [ 4 ] = { 300.0 , 4.0 , 4.0 , 12.0 }; __declspec ( align ( 16 )) float b [ 4 ] = { 1,5 , 2,5 , 3,5 , 4,5 }; __asm- { movups xmm0 , a ; // laita 4 liukulukumuuttujaa a:sta rekisteriin xmm0 movups xmm1 , b ; // laita 4 liukulukumuuttujaa b:stä rekisteriin xmm1 mulps xmm0 , xmm1 ; // kerrotaan liukulukupaketit: xmm0 = xmm0 * xmm1 ; // xmm00 = xmm10 * xmm00 ; // xmm01 = xmm11 * xmm01 ; // xmm02 = xmm12 * xmm02 ; // xmm03 = xmm13 * xmm03 movups a , xmm0 ; // purka tulokset xmm0-rekisteristä osoitteissa a };

Sama esimerkki, mutta assembler insert asm on tehty AT&T-standardissa (GNU Assembler)

float a [ 4 ] = { 300,0 , 4,0 , 4,0 , 12,0 }; float b [ 4 ] = { 1,5 , 2,5 , 3,5 , 4,5 }; __asm__ epävakaa ( "movups %[a], %%xmm0 \n\t " // laittaa 4 liukulukumuuttujaa a:sta rekisteriin xmm0 "movups %[b], %%xmm1 \n\t " // laittaa 4 liukulukumuuttujaa piste b:stä rekisteriin xmm1 "mulps %%xmm1, %%xmm0 \n\t " // kerro liukulukupaketit: xmm0 = xmm0 * xmm1 // xmm00 = xmm00 * xmm10 // xmm01 = xmm01 * xmm11 // xmm02 = xmm02 * xmm12 // xmm03 = xmm03 * xmm13 "movups %%xmm0, %[a] \n\t " // vedä tulokset xmm0-rekisteristä osoitteisiin a : : [ a ] "m" ( * a ), [ b ] "m" ( * b ) : "%xmm0" , "%xmm1" );

Katso myös

Linkit