SSE ( Streaming SIMD Extensions , extensia SIMD de streaming a procesorului) este SIMD - ( ing . Single Instruction, Multiple Data , One instruction - a lot of data) un set de instrucțiuni dezvoltat de Intel și introdus pentru prima dată în procesoarele din seria Pentium III ca un răspuns la un set de instrucțiuni similar 3DNow! de la AMD , care a fost introdus cu un an mai devreme. Numele original al acestor instrucțiuni a fost KNI - Katmai New Instructions (Katmai este numele primei versiuni a nucleului procesorului Pentium III ).
Tehnologia SSE a făcut posibilă depășirea a două probleme principale ale MMX : atunci când se folosea MMX, era imposibil să se utilizeze simultan instrucțiunile coprocesorului , deoarece registrele sale erau partajate cu registrele MMX și capacitatea MMX de a lucra numai cu numere întregi.
SSE include opt registre de 128 de biți și un set de instrucțiuni care funcționează cu tipuri de date scalare și împachetate în arhitectura procesorului .
Avantajul de performanță este atins atunci când este necesară efectuarea aceleiași secvențe de acțiuni pe date diferite. În acest caz, blocul SSE paralelizează procesul de calcul între date.
Opt (șaisprezece pentru x64) registre pe 128 de biți au fost adăugate la SSE, numite xmm0 - xmm7 (-xmm15).
Fiecare registru poate conține patru valori cu virgulă mobilă de precizie unică de 32 de biți.
Comenzi pentru numere în virgulă mobilă
Comenzi pentru numere întregi
Alte comenzi
Următorul exemplu arată înmulțirea a patru perechi de numere în virgulă mobilă cu o instrucțiune 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 ; // pune 4 variabile în virgulă mobilă din a în registrul xmm0 movups xmm1 , b ; // pune 4 variabile în virgulă mobilă din b în registrul xmm1 mulps xmm0 , xmm1 ; // înmulțim pachetele cu virgulă mobilă: xmm0 = xmm0 * xmm1 ; // xmm00 = xmm10 * xmm00 ; // xmm01 = xmm11 * xmm01 ; // xmm02 = xmm12 * xmm02 ; // xmm03 = xmm13 * xmm03 movups a , xmm0 ; // descărcați rezultatele din registrul xmm0 la adresele a };Același exemplu, dar inserția de asamblare asm este realizată în standardul 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__ volatile ( "movups %[a], %%xmm0 \n\t " // pune 4 variabile cu virgulă mobilă din a în registrul xmm0 "movups %[b], %%xmm1 \n\t " // pune 4 variabile cu virgulă mobilă de la b pentru a înregistra xmm1 "mulps %%xmm1, %%xmm0 \n\t " // înmulțirea pachetelor cu virgulă mobilă: xmm0 = xmm0 * xmm1 // xmm00 = xmm00 * xmm10 // xmm01 = xmm01 * xmm11 // xmm02 = xmm02 * xmm12 // xmm03 = xmm03 * xmm13 "movups %%xmm0, %[a] \n\t " // dump rezultatele din registrul xmm0 la adresele a : : [ a ] "m" ( * a ), [ b ] " m " ( * b ) : "%xmm0" , "%xmm1" );seturi de instrucțiuni procesor x86 | |
---|---|
Intel | |
AMD | |
Cyrix |