SSE

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 19. února 2021; kontroly vyžadují 5 úprav .

SSE ( Streaming SIMD Extensions , streaming SIMD rozšíření procesoru) je SIMD - ( angl  . Single Instruction, Multiple Data , One Instruction - hodně dat) sada instrukcí vyvinutá společností Intel a poprvé představená v procesorech řady Pentium III jako odpověď na podobnou instrukční sadu 3DNow! od AMD , který byl představen o rok dříve. Původní název těchto instrukcí byl KNI - Katmai New Instructions (Katmai je název první verze jádra procesoru Pentium III ).  

Technologie SSE umožnila překonat dva hlavní problémy MMX : při použití MMX nebylo možné používat instrukce koprocesoru současně , protože jeho registry byly sdíleny s registry MMX, a schopnost MMX pracovat pouze s celými čísly.

SSE obsahuje osm 128bitových registrů a sadu instrukcí, které pracují se skalárními a sbalenými datovými typy v architektuře procesoru .

Výkonové výhody je dosaženo, když je nutné provést stejnou sekvenci akcí na různých datech. V tomto případě blok SSE paralelizuje výpočetní proces mezi daty.

Funkce

Registry

Do SSE bylo přidáno osm (šestnáct pro x64) 128bitových registrů nazvaných xmm0 - xmm7 (-xmm15).

Každý registr může obsahovat čtyři 32bitové jednoduché hodnoty s plovoucí desetinnou čárkou.

Příkazy SSE

Příkazy pro čísla s pohyblivou řádovou čárkou

Příkazy pro celá čísla

Další příkazy

Příklad

Následující příklad ukazuje násobení čtyř párů čísel s plovoucí desetinnou čárkou jednou instrukcí mulps :

__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 ; // vloží 4 proměnné s plovoucí desetinnou čárkou z a do registru xmm0 movups xmm1 , b ; // vložte 4 proměnné s plovoucí desetinnou čárkou z b do registru xmm1 mulps xmm0 , xmm1 ; // násobení paketů s pohyblivou řádovou čárkou: xmm0 = xmm0 * xmm1 ; // xmm00 = xmm10 * xmm00 ; // xmm01 = xmm11 * xmm01 ; // xmm02 = xmm12 * xmm02 ; // xmm03 = xmm13 * xmm03 movups a , xmm0 ; // uvolní výsledky z registru xmm0 na adresách a };

Stejný příklad, ale vložka asm z assembleru je vyrobena ve standardu AT&T (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__ volatilní ( "movups %[a], %%xmm0 \n\t " // vložte 4 proměnné s pohyblivou řádovou čárkou z a do registru xmm0 "movups %[b], %%xmm1 \n\t " // vložte 4 proměnné s pohyblivou řádovou čárkou. od b k registraci xmm1 "mulps %%xmm1, %%xmm0 \n\t " // násobení paketů s pohyblivou řádovou čárkou: xmm0 = xmm0 * xmm1 // xmm00 = xmm00 * xmm10 // xmm01 = xmm01 * xmm11 // xmm02 = xmm02 * xmm12 // xmm03 = xmm03 * xmm13 "movups %%xmm0, %[a] \n\t " // výpis výsledků z registru xmm0 na adresy a : : [ a ] ​​„m“ ( * a ), [ b ] „m“ ( * b ) : "%xmm0" , "%xmm1" );

Viz také

Odkazy