Streaming extensii SIMD

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

SSE ( S treaming S IMD E xtensions ) este un set de instrucțiuni SIMD proiectat de Intel în 1999 și utilizat în procesorul său Pentium III ca răspuns la 3DNow! realizat de AMD , care se afla pe piață de aproximativ un an. Acesta a fost inițial cunoscut sub acronimul KNI , de la K atmai N ew I nstructions ( Katmai a fost numele de cod al primului Pentium III). În timpul proiectului Katmai, Intel a încercat să îl distingă de linia sa de produse anterioară, mai ales Pentium II . AMD a adăugat ulterior suport pentru instrucțiunile SSE în procesorul său Athlon XP .

Prima încercare a Intel cu SIMD, tehnologia MMX , a fost o dezamăgire. MMX are în principal două probleme: reutilizează registrele cu virgulă mobilă, ceea ce face imposibil ca CPU să funcționeze în același timp pe date în virgulă mobilă și date SIMD , dar poate funcționa doar pe numere întregi.

SSE adaugă opt registre noi pe 128 de biți cu nume variind de la XMM0 la XMM7. Fiecare registru grupează patru numere cu virgulă mobilă de 32 de biți (o singură precizie).

Deoarece aceste registre pe 128 de biți reprezintă stări suplimentare pe care sistemul de operare trebuie să le păstreze în timpul comutării contextului sarcinii , acestea sunt dezactivate până când sistemul de operare le permite în mod explicit. Aceasta înseamnă că sistemul de operare trebuie să fie programat pentru a utiliza instrucțiunile FXSAVE și FXRSTOR, care sunt perechea de instrucțiuni introduse de SSE pentru a salva x86 , MMX, 3DNow! și SSE. Suportul pentru aceste instrucțiuni a fost adăugat rapid la toate sistemele de operare majore pe 32 de biți.

Deoarece SSE adaugă suport în virgulă mobilă, a fost mult mai utilizat decât MMX, deoarece toate plăcile video gestionează calculele întregi la nivel intern. Întregul set consta din 70 de instrucțiuni. Odată cu introducerea SSE2, pot fi utilizate chiar și numere întregi cu noile registre XMM, deci setul de instrucțiuni MMX este acum redundant.

Cu toate acestea, pe Pentium III , SSE este implementat folosind aceleași circuite ca FPU , ceea ce înseamnă că CPU nu poate trimite instrucțiuni SSE și în virgulă mobilă în conductă în același timp. Registrele separate permit amestecarea operațiilor SIMD și virgulă mobilă, dar fără performanța obținută prin trecerea explicită de la virgulă mobilă la modul MMX.

Pentium 4 implementează SSE2 , o extensie a setului de instrucțiuni SSE. Principalele caracteristici ale SSE2 sunt suport pentru numerele cu virgulă mobilă de precizie dublă (64 de biți) și suport pentru numere întregi în vectorul de registru pe 128 de biți introdus cu SSE, care permite programatorului să utilizeze registre MMX. SSE2 în sine a fost extins de SSE3 introdus cu nucleul Prescott al ultimelor generații Pentium 4.

Registrele

SSE a adăugat opt ​​noi registre pe 128 de biți identificate cu codurile XMM0 la XMM7. Extensiile AMD64 (ulterior duplicate de Intel) au adăugat încă opt registre de la XMM8 la XMM15. Există, de asemenea, un nou registru de stare pe 32 de biți, MXCSR. Registrele XMM8 până la XMM15 sunt accesibile numai în modul pe 64 de biți.

XMM registers.svg

Fiecare registru poate conține împreună:

  • patru numere cu virgulă mobilă cu precizie simplă pe 32 de biți sau
  • două numere cu virgulă mobilă cu precizie dublă pe 64 de biți sau
  • două numere întregi pe 64 de biți sau
  • patru numere întregi de 32 de biți sau
  • opt numere scurte întregi de 16 biți sau
  • șaisprezece octeți de 8 biți.

Operațiile pe numere întregi au variante pentru numere semnate și nesemnate. Întreaga operațiune SIMD poate fi efectuată cu cele opt registre MMX pe 64 de biți.

Deoarece aceste registre pe 128 de biți sunt stări de program suplimentare care trebuie menținute de sistemul de operare în timpul comutării sarcinilor, acestea sunt dezactivate în mod implicit până când sistemul de operare le permite în mod explicit. Acest lucru necesită ca sistemul de operare să cunoască și să utilizeze perechea de instrucțiuni FXSAVE și FXRSTOR, care salvează toate registrele de stare x86 și SSE dintr-o singură dată. Această capacitate a fost adăugată rapid la toate sistemele de operare pe 32 de biți.

Deoarece instrucțiunile SSE funcționează și cu numere în virgulă mobilă, acestea sunt mult mai utile decât extensiile MMX, iar adăugarea instrucțiunilor SSE2 le-a făcut și mai atractive. Deși instrucțiunile MMX sunt redundante, ele pot rula în paralel cu instrucțiunile SSE, sporind performanța în anumite circumstanțe.

Instrucțiuni SSE

SSE introduce atât operații pe scalari unici, cât și pe grupuri de numere în virgulă mobilă (împachetate).

Instrucțiuni în virgulă mobilă

  • Mișcări de înregistrare-memorie / înregistrare-memorie / înregistrare-înregistrare
    • Scalari - MOVSS
    • Ambalat - MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
  • Aritmetic
    • Scalare - ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
    • Ambalat - ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
  • Comparații
    • Scalare - CMPSS, COMISS, UCOMISS
    • Ambalat - CMPPS
  • Ambalarea / despachetarea datelor
    • Ambalat - SHUFPS, UNPCKHPS, UNPCKLPS
  • Tastați conversiile
    • Scalare - CVTSI2SS, CVTSS2SI, CVTTSS2SI
    • Ambalat - CVTPI2PS, CVTPS2PI, CVTTPS2PI
  • Operații logice pe biți
    • Ambalat - ANDPS, ORPS, XORPS, ANDNPS

Instrucțiuni privind numerele întregi

  • Aritmetic
    • PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
  • Mișcări de date
    • PEXTRW, PINSRW
  • Alte
    • PMOVMSKB, PSHUFW

Alte instrucțiuni

  • Managementul MXCSR
    • LDMXCSR, STMXCSR
  • Gestionarea memoriei și a cache-ului
    • MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

Exemple

Următoarele exemple demonstrează avantajul utilizării instrucțiunilor SSE. Luați în considerare o operație cum ar fi suma vectorilor, care este foarte des utilizată în grafica computerizată; Adăugarea a doi vectori de precizie unici cu câte 4 componente necesită patru instrucțiuni de sumă în virgulă mobilă într-un procesor x86 normal:

 vec_res.x = v1.x + v2.x ;
vec_res.y = v1.y + v2.y ;
vec_res.z = v1.z + v2.z ;
vec_res.w = v1.w + v2.w ;

Aceste patru linii devin tot atâtea instrucțiuni FADD în codul obiect compilat. Pe de altă parte, cu instrucțiunile SSE, după cum puteți vedea din codul următor, este suficientă o singură instrucțiune de 128 de biți „ambalare-adăugare” pentru a efectua calculul.

 movaps xmm0, adresa-de-v1 ; xmm0 = v1.w | v1.z | v1.y | v1.x
addps xmm0, adresa-v2 ; xmm0 = v1.w + v2.w | v1.z + v2.z | v1.y + v2.y | v1.x + v2.x

Diferențe între x87 FPU și SSE

Instrucțiunile FPU (x87) stochează de obicei rezultatele cu 80 de biți de precizie. Când algoritmii vechi scrise pentru FPU x87 sunt adaptate noilor extensii SSE, care acceptă doar 64 de biți de precizie, unele combinații de operații aritmetice și seturi de date pot da naștere la diferențe numerice semnificative: acest lucru este foarte important în calculele științifice, dacă calculul trebuie comparat cu rezultatele obținute pe alte arhitecturi hardware.

În funcție de interpretul sau compilatorul utilizat și de optimizările alese, poate fi necesar să salvați temporar anumite date și să le reîncărcați ulterior; de obicei, rezultatele FPU x87 sunt, de asemenea, rotunjite la 64 sau 32 de biți, dar locul și timpul exact în care se produce acest lucru pot provoca diferențe în rezultatul final al calculelor. Următorul exemplu de cod din Fortran 95 oferă dovada: valoarea corectă a celui de-al treilea și ultimul număr de imprimat este zero.

 program salut
real a, b, c, d
x real, y, z
a = .013
b = .027
c = .0937
d = .79
y = -a / b + (a / b + c) * EXP (d)
print *, y
z = (- a) / b + (a / b + c) * EXP (d)
print *, z
x = yz
print *, x
Sfârșit

Compilând cu instrucțiunile x87 FPU și executând avem:

 # g95 -o hi -mfpmath = 387 -fzero -ftrace = full -fsloppy-char hi.for
# ./Salut
 0,78587145
 0,7858714
 5.9604645E-8

Compilând folosind extensii SSE și executând veți obține:

 # g95 -o hi -mfpmath = sse -msse2 -fzero -ftrace = full -fsloppy-char hi.for
# ./Salut
 0,78587145
 0,78587145
 0.

Elemente conexe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT