SSE

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 19 februarie 2021; verificările necesită 5 modificări .

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.

Caracteristici

Registre

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 SSE

Comenzi pentru numere în virgulă mobilă

Comenzi pentru numere întregi

Alte comenzi

Exemplu

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" );

Vezi și

Link -uri