SSE

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 19. februar 2021; checks kræver 5 redigeringer .

SSE ( Streaming SIMD Extensions , streaming SIMD extension of the processor) er SIMD - ( eng  . Single Instruction, Multiple Data , One instruction - a lot of data) et sæt instruktioner udviklet af Intel og først introduceret i Pentium III -seriens processorer som et svar på et lignende instruktionssæt 3DNow! fra AMD , som blev introduceret et år tidligere. Det originale navn på disse instruktioner var KNI - Katmai New Instructions (Katmai er navnet på den første version af Pentium III -processorkernen ).  

SSE- teknologien gjorde det muligt at overvinde to hovedproblemer ved MMX : ved brug af MMX var det umuligt at bruge coprocessorinstruktioner samtidigt , da dets registre blev delt med MMX-registre, og MMX's evne til kun at arbejde med heltal.

SSE inkluderer otte 128-bit registre og et sæt instruktioner, der arbejder med skalære og pakkede datatyper i processorarkitekturen .

Ydeevnefordelen opnås, når det er nødvendigt at udføre den samme rækkefølge af handlinger på forskellige data. I dette tilfælde paralleliserer SSE-blokken beregningsprocessen mellem dataene.

Funktioner

Registre

Otte (seksten for x64) 128-bit registre er blevet tilføjet til SSE, kaldet xmm0 - xmm7 (-xmm15).

Hvert register kan indeholde fire 32-bit enkelt præcision flydende kommaværdier.

SSE-kommandoer

Kommandoer til flydende kommatal

Kommandoer for heltal

Andre kommandoer

Eksempel

Følgende eksempel viser multiplikationen af ​​fire par flydende kommatal med en mulp- instruktion :

__declspec ( align ( 16 )) float a [ 4 ] = { 300.0 , 4.0 , 4.0 , 12.0 }; __declspec ( juster ( 16 )) float b [ 4 ] = { 1,5 , 2,5 , 3,5 , 4,5 }; __asm { movups xmm0 , a ; // sæt 4 variabler med flydende komma fra a i registeret xmm0 movups xmm1 , b ; // sæt 4 flydende kommavariable fra b i register xmm1 mulper xmm0 , xmm1 ; // multiplicer flydende kommapakker: xmm0 = xmm0 * xmm1 ; // xmm00 = xmm10 * xmm00 ; // xmm01 = xmm11 * xmm01 ; // xmm02 = xmm12 * xmm02 ; // xmm03 = xmm13 * xmm03 movups a , xmm0 ; // aflæs resultaterne fra xmm0-registret på adresserne a };

Det samme eksempel, men assembler -indsatsen asm er lavet i AT&T-standarden (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__ flygtig ( "movups %[a], %%xmm0 \n\t " // sæt 4 variable med flydende komma fra a i registeret xmm0 "movups %[b], %%xmm1 \n\t " // sæt 4 variable med flydende komma punkt fra b til register xmm1 "mulper %%xmm1, %%xmm0 \n\t " // multiplicer flydende kommapakker: xmm0 = xmm0 * xmm1 // xmm00 = xmm00 * xmm10 // xmm01 = xmm01 * xmm11 // xmm02 = xmm02 * xmm12 // xmm03 = xmm03 * xmm13 "movups %%xmm0, %[a] \n\t " // dump resultater fra xmm0 register til adresser a : : [ a ] "m" ( * a ), [ b ] "m" ( * b ) : "%xmm0" , "%xmm1" );

Se også

Links