SSE2 - SSE2

SSE2 ( Streaming SIMD Extensions 2 ) er et af Intel SIMD (Single Instruction, Multiple Data) supplerende instruktions sæt, der først blev introduceret af Intel med den oprindelige version af Pentium 4 i 2000. Det udvider det tidligere SSE instruktions sæt og er beregnet til at udskifte MMX fuldt ud . Intel udvidede SSE2 til at oprette SSE3 i 2004. SSE2 tilføjede 144 nye instruktioner til SSE, som har 70 instruktioner. Konkurrerende chipproducent AMD tilføjede support til SSE2 med introduktionen af ​​deres Opteron og Athlon 64- serier af AMD64 64-bit CPU'er i 2003.

Funktioner

De fleste af SSE2-instruktionerne implementerer heltalvektoroperationer, der også findes i MMX. I stedet for MMX-registre bruger de XMM-registre, som er bredere og giver mulighed for betydelige præstationsforbedringer i specialiserede applikationer. En anden fordel ved at erstatte MMX med SSE2 er at undgå tilstandsskiftestraf for udstedelse af x87- instruktioner, der er til stede i MMX, fordi den deler registerplads med x87 FPU. SSE2 supplerer også flydepunktvektoroperationerne i SSE-instruktionssættet ved at tilføje understøttelse til datatypen med dobbelt præcision.

Andre SSE2-udvidelser inkluderer et sæt cache-kontrolinstruktioner, der primært er beregnet til at minimere cache-forurening, når der behandles uendelige informationsstrømme, og et sofistikeret supplement til konverteringsinstruktioner i numerisk format.

AMDs implementering af SSE2 på AMD64- platformen ( x86-64 ) inkluderer yderligere otte registre, der fordobler det samlede antal til 16 (XMM0 til XMM15). Disse ekstra registre er kun synlige, når de kører i 64-bit-tilstand. Intel vedtog disse ekstra registre som en del af deres understøttelse af x86-64 arkitektur (eller i Intels sprog, "Intel 64") i 2004.

Forskelle mellem x87 FPU og SSE2

FPU (x87) instruktioner giver højere præcision ved at beregne mellemresultater med 80 bit præcision som standard for at minimere afrundingsfejl i numerisk ustabile algoritmer (se IEEE 754 design rationale og referencer deri). Imidlertid er x87 FPU kun en skalar enhed, mens SSE2 kan behandle en lille vektor af operander parallelt.

Hvis koder designet til x87 overføres til SSE2-flydepunktet med lavere præcision med dobbelt præcision, kan visse kombinationer af matematiske operationer eller inputdatasæt resultere i målelig numerisk afvigelse, hvilket kan være et problem i reproducerbare videnskabelige beregninger, f.eks. Hvis beregningsresultaterne skal sammenlignes mod resultater genereret fra en anden maskinarkitektur. Et beslægtet problem er, at sprogstandarder og kompilatorer historisk set har været inkonsekvente i deres håndtering af x87 80-bit-registre, der implementerer dobbelt udvidede præcisionsvariabler sammenlignet med de dobbelte og enkle præcisionsformater implementeret i SSE2: afrunding af udvidede præcision mellemværdier til dobbelt præcisionsvariabler var ikke fuldt defineret og var afhængig af implementeringsdetaljer, som når registre blev spildt til hukommelsen.

Forskelle mellem MMX og SSE2

SSE2 udvider MMX-instruktioner til at fungere på XMM-registre. Derfor er det muligt at konvertere al eksisterende MMX-kode til en SSE2-ækvivalent. Da et SSE2-register er dobbelt så langt som et MMX-register, kan det være nødvendigt at ændre looptællere og hukommelsesadgang for at imødekomme dette. Imidlertid er 8 bytebelastninger og butikker til XMM tilgængelige, så dette er ikke strengt nødvendigt.

Selvom en SSE2-instruktion kan fungere dobbelt så mange data som en MMX-instruktion, kan ydelsen muligvis ikke stige markant. To hovedårsager er: at få adgang til SSE2-data i hukommelsen, der ikke er justeret til en 16-byte-grænse, kan medføre betydelig straf, og gennemstrømningen af SSE2-instruktioner i ældre x86- implementeringer var halvdelen af ​​MMX-instruktioner. Intel adresserede det første problem ved at tilføje en instruktion i SSE3 for at reducere omkostningerne ved at få adgang til ikke-justerede data og forbedre den samlede ydeevne for forkert justerede belastninger og det sidste problem ved at udvide udførelsesmotoren i deres Core-mikroarkitektur i Core 2 Duo og senere produkter.

Da MMX og x87 registrerer filer alias hinanden, forhindrer brug af MMX, at x87 instruktioner fungerer som ønsket. Når MMX er brugt, skal programmøren bruge emms-instruktionen (C: _mm_empty ()) for at gendanne driften til x87-registerfilen. På nogle operativsystemer bruges x87 ikke meget, men kan stadig bruges i nogle kritiske områder som pow (), hvor der er behov for ekstra præcision. I sådanne tilfælde kan den korrupte tilstand med flydende punkt forårsaget af manglende udsendelse af emmer gå uopdaget i millioner af instruktioner, før den i sidste ende får flydepunktsrutinen til at mislykkes og returnerer NaN. Da problemet ikke er tydeligt lokalt i MMX-koden, kan det være meget tidskrævende at finde og rette fejlen. Da SSE2 ikke har dette problem, normalt giver meget bedre gennemstrømning og giver flere registre i 64-bit kode, bør det foretrækkes til næsten alt vektoriseringsarbejde.

Compiler brug

Da SSE2 blev introduceret i 2000, blev det ikke understøttet af softwareudviklingsværktøjer. For eksempel for at bruge SSE2 i et Microsoft Visual Studio- projekt måtte programmøren enten manuelt skrive inline-samling eller importere objekt-kode fra en ekstern kilde. Senere tilføjede Visual C ++ Processor Pack SSE2-understøttelse til Visual C ++ og MASM .

Den Intel C ++ Compiler kan automatisk generere SSE4 , SSSE3 , SSE3 , SSE2, og SSE kode uden anvendelse af hånd-kodet samling.

Da GCC 3 kan GCC automatisk generere SSE / SSE2 skalarkode, når målet understøtter disse instruktioner. Automatisk vektorisering til SSE / SSE2 er tilføjet siden GCC 4.

Den Sun Studio Compiler Suite kan også generere SSE2 instruktioner, når -xvector = SIMD anvendes compiler flag.

Siden Microsoft Visual C ++ 2012 er kompilatorindstillingen til at generere SSE2-instruktioner slået til som standard.

CPU-understøttelse

SSE2 er en udvidelse af IA-32- arkitekturen baseret på x86-instruktionssættet . Derfor er det kun x86-processorer, der kan inkludere SSE2. De AMD64 arkitektur understøtter de IA-32 som en kompatibilitetstilstand og omfatter SSE2 i dens specifikationer. Det fordobler også antallet af XMM-registre, hvilket giver bedre ydeevne. SSE2 er også et krav til installation af Windows 8 (og nyere) eller Microsoft Office 2013 (og nyere) "for at forbedre pålideligheden af ​​tredjepartsapps og -drivere, der kører i Windows 8".

Følgende IA-32 CPU'er understøtter SSE2:

Følgende IA-32 CPU'er blev frigivet efter SSE2 blev udviklet, men implementerede det ikke:

Se også

Referencer