[go: up one dir, main page]

Sari la conținut

SSE4

De la Wikipedia, enciclopedia liberă

SSE4 (Streaming SIMD Extensions 4) este un set de instrucțiuni SIMD pentru CPU utilizat în microarhitectura Intel Core⁠(d) și AMD K10 (K8L)⁠(d). Acesta a fost anunțat la 27 septembrie 2006, la Forumul dezvoltatorilor Intel⁠(d) din toamna anului 2006, cu detalii vagi într-o carte albă⁠(d);[1] detalii mai precise despre 47 de instrucțiuni au devenit disponibile la Forumul dezvoltatorilor Intel din primăvara anului 2007 de la Beijing, în prezentare.[2] SSE4 a extins setul de instrucțiuni SSE3⁠(d) care a fost lansat la începutul anului 2004. Toate programele care utilizează instrucțiunile Intel SIMD anterioare (ex. SSE3) sunt compatibile cu microprocesoarele moderne care acceptă instrucțiunile SSE4. Toate programele existente continuă să ruleze corect, fără modificări, pe microprocesoarele care încorporează SSE4, precum și în prezența aplicațiilor existente și noi care încorporează SSE4.[3]

La fel ca alte seturi de instrucțiuni SIMD CPU din generația anterioară, SSE4 acceptă până la 16 registre, fiecare cu o lățime de 128 de biți, care pot încărca patru numere întregi pe 32 de biți, patru numere în virgulă mobilă cu precizie simplă pe 32 de biți sau două numere în virgulă mobilă cu precizie dublă pe 64 de biți.[1] Operațiile SIMD, cum ar fi adunarea/multiplicarea vectorială a elementelor și adunarea/multiplicarea vectorială scalară, procesează mai mulți biți de date într-o singură instrucțiune CPU. Operația paralelă împachetează creșteri notabile ale performanței. SSE4.2 a introdus noi operații SIMD pentru șiruri de caractere, inclusiv o instrucțiune pentru compararea a două fragmente de șir de caractere de până la 16 octeți fiecare.[1] SSE4.2 este un subset al SSE4 și a fost lansat la câțiva ani după lansarea inițială a SSE4.

Subseturi SSE4

[modificare | modificare sursă]

Intel SSE4 constă din 54 de instrucțiuni. Un subset format din 47 de instrucțiuni, denumit SSE4.1 în unele documente Intel, este disponibil în Penryn. În plus, SSE4.2, un al doilea subset format din cele șapte instrucțiuni rămase, este disponibil pentru prima dată în Core i7 bazat pe Nehalem. Intel consideră că feedback-ul din partea dezvoltatorilor a jucat un rol important în dezvoltarea setului de instrucțiuni.

Începând cu procesoarele bazate pe Barcelona, AMD a introdus setul de instrucțiuni SSE4a, care are patru instrucțiuni SSE4 și patru noi instrucțiuni SSE. Aceste instrucțiuni nu se regăsesc în procesoarele Intel care suportă SSE4.1, iar procesoarele AMD au început să suporte SSE4.1 și SSE4.2 (setul complet de instrucțiuni SSE4) doar în procesoarele FX bazate pe Bulldozer. Cu SSE4a a fost introdusă, de asemenea, funcția SSE dezaliniată, ceea ce a însemnat că instrucțiunile de încărcare nealiniate erau la fel de rapide ca versiunile aliniate la adrese aliniate. De asemenea, a permis dezactivarea verificării alinierii în cazul operațiunilor SSE fără încărcare care accesează memoria.[4] Intel a introdus ulterior îmbunătățiri de viteză similare pentru SSE nealiniate în procesoarele sale Nehalem, dar nu a introdus accesul dezaliniat prin instrucțiuni SSE fără încărcare până la AVX⁠(d).[5]

Confuzie de nume

[modificare | modificare sursă]

Ceea ce acum este cunoscut sub numele de SSSE3⁠(d) (Supplemental Streaming SIMD Extensions 3), introdus în linia de procesoare Intel Core 2, a fost denumit SSE4 de unele mass-media până când Intel a venit cu apelativul SSSE3. Denumite intern Merom New Instructions, Intel nu intenționa inițial să le atribuie un nume special, ceea ce a fost criticat de unii jurnaliști.[6] Intel a clarificat în cele din urmă confuzia și a rezervat numele SSE4 pentru următoarea lor extensie a setului de instrucțiuni.[7]

Intel utilizează termenul de marketing HD Boost pentru a se referi la SSE4.[8]

Noi instrucțiuni

[modificare | modificare sursă]

Spre deosebire de toate iterațiile anterioare ale SSE, SSE4 conține instrucțiuni care execută operații care nu sunt specifice aplicațiilor multimedia. Acesta conține un număr de instrucțiuni a căror acțiune este determinată de un câmp constant și un set de instrucțiuni care iau XMM0 ca al treilea operand implicit.

Câteva dintre aceste instrucțiuni sunt activate de motorul Shuffle cu ciclu unic din Penryn. (Operațiile Shuffle reordonează octeții dintr-un registru).

Aceste instrucțiuni au fost introduse cu microarhitectura Penryn⁠(d), reducerea la 45 nm a microarhitecturii Intel Core⁠(d). Suportul este indicat prin intermediul indicatorului CPUID.01H:ECX.SSE41[Bit 19].

Instrucțiune Descriere
MPSADBW Calculați opt sume offset ale diferențelor absolute, câte patru la un moment dat (de ex, |x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|, ..., |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|); această operație este importantă pentru unele codecuri HD⁠(d) și permite calcularea unei diferențe de bloc 8×8 în mai puțin de șapte cicluri.[9] Un bit al unui operand imediat pe trei biți indică dacă y0 .. y10 or y4 .. y14 ar trebui utilizat din operandul de destinație, iar celelalte două dacă

x0..x3, x4..x7, x8..x11 or x12..x15 ar trebui utilizate de la sursă.

PHMINPOSUW Stabilește cuvântul de 16 biți fără semn de jos al destinației la cel mai mic cuvânt de 16 biți fără semn din sursă, iar următorul cuvânt de jos în sus la indexul acelui cuvânt din sursă.
PMULDQ Înmulțire „lungă” semnată pe 32 de biți, două (prima și a treia) din patru numere întregi împachetate se înmulțesc dând două rezultate împachetate pe 64 de biți.
PMULLD Multiplicare „joasă” cu semn pe 32 de biți, patru seturi de numere întregi multiplicate, dând patru rezultate pe 32 de biți.
DPPS, DPPD Produs scalar⁠(d) pentru date AOS (Array of Structs). Aceasta utilizează un operand imediat format din patru (sau doi pentru DPPD) biți pentru a selecta care dintre intrările de la intrare trebuie multiplicate și acumulate și alți patru (sau doi pentru DPPD) pentru a selecta dacă se pune 0 sau produsul scalar în câmpul corespunzător de la ieșire.
BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDW Copierea condiționată a elementelor dintr-o locație cu o alta, pe baza (pentru forma non-V) a biților dintr-un operand imediat și (pentru forma V) a biților din registrul XMM0.
PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINSD, PMAXSD Minimul/maximul împachetat pentru diferite tipuri de operanzi întregi
ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD Rotunjește valorile dintr-un registru în virgulă mobilă în numere întregi, utilizând unul dintre cele patru moduri de rotunjire specificate de un operand imediat
INSERTPS, PINSRB, PINSRD/PINSRQ, EXTRACTPS, PEXTRB, PEXTRD/PEXTRQ Instrucțiunile INSERTPS și PINSR citesc 8, 16 sau 32 de biți dintr-un registru x86 sau dintr-o locație de memorie și îi inserează într-un câmp din registrul de destinație dat de un operand imediat. Instrucțiunile EXTRACTPS și PEXTR citesc un câmp din registrul sursă și îl introduc într-un registru x86 sau într-o locație de memorie. De exemplu, PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 stochează primul câmp din xmm1 în adresa dată de primul câmp din xmm0.
PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ Extinderea semnului/zeroului împachetat la tipuri mai largi
PTEST Această instrucțiune este similară instrucțiunii TEST în sensul că setează steagul Z⁠(d) to the result of an AND between its operands: ZF is set, if DEST AND SRC is equal to 0. Additionally it sets the C flag if (NOT DEST) AND SRC equals zero.
PCMPEQQ Cuvânt cvadruplu (64 biți) comparare pentru egalitate
PACKUSDW Conversia DWORD-urilor cu semn în WORD-uri fără semn cu saturație.
MOVNTDQA Citire eficientă din zona de memorie de combinare a scrierii în registrul SSE; acest lucru este util pentru recuperarea rezultatelor de la perifericele conectate la magistrala de memorie.

SSE4.2 a adăugat STTNI (String and Text New Instructions),[10] mai multe instrucțiuni noi care efectuează căutări și comparații de caractere pe doi operanzi de câte 16 octeți. Acestea au fost concepute (printre altele) pentru a accelera analizarea documentelor XML.[11] De asemenea, a adăugat o instrucțiune CRC32 pentru a calcula controalele redundante ciclice utilizate în anumite protocoale de transfer de date. Aceste instrucțiuni au fost implementate pentru prima dată în linia de produse Intel Core i7 bazată pe Nehalem⁠(d) și completează setul de instrucțiuni SSE4. AMD, pe de altă parte, a adăugat primul suport începând cu microarhitectura Bulldozer⁠(d). Suportul este indicat prin intermediul indicatorului CPUID.01H:ECX.SSE42[Bit 20].

Windows 11 24H2 necesită ca procesorul să suporte SSE4.2, în caz contrar nucleul Windows este imposibil de inițializat.[12] (Diverse variante neoficiale de Windows 11, cum ar fi Tiny11 și instalațiile de virtualizare Parallels, ocolesc această cerință).

Instrucțiune Descriere
CRC32 Acumularea valorii CRC32C folosind polinomul 0x11EDC6F41 (sau, fără bitul de ordin superior, 0x1EDC6F41).[13][14]
PCMPESTRI Compararea la pachet a șirurilor de lungimi explicite, returnarea indicelui
PCMPESTRM Comparare la pachet a șirurilor de lungimi explicite, returnarea măștii (return mask)
PCMPISTRI Compararea la pachet a șirurilor cu lungime implicită, returnarea indicelui
PCMPISTRM Comparare la pachet a șirurilor cu lungime implicită, returnarea măștii
PCMPGTQ Compararea datelor semnate pe 64 de biți pentru mai mult decât

POPCNT și LZCNT

[modificare | modificare sursă]

Aceste instrucțiuni operează pe registre întregi mai degrabă decât pe registre SSE, deoarece nu sunt instrucțiuni SIMD, dar apar în același timp și, deși au fost introduse de AMD odată cu setul de instrucțiuni SSE4a, sunt considerate extensii separate, cu biți CPUID proprii dedicați pentru a indica suportul. Intel implementează POPCNT începând cu microarhitectura Nehalem și LZCNT începând cu microarhitectura Haswell. AMD implementează ambele, începând cu microarhitectura Barcelona.

AMD numește această pereche de instrucțiuni Advanced Bit Manipulation (ABM).

Codificarea LZCNT urmează aceeași cale de codificare ca și codificarea instrucțiunii BSR (bit scan reverse). Acest lucru duce la o problemă în care LZCNT apelată pe unele procesoare care nu o acceptă, cum ar fi procesoarele Intel înainte de Haswell, poate executa incorect operația BSR în loc să ridice o excepție de instrucțiune invalidă. Aceasta este o problemă deoarece valorile rezultatelor LZCNT și BSR sunt diferite.

Zerourile din urmă pot fi numărate utilizând instrucțiunile BSF (bit scan forward) sau TZCNT.

Windows 11 24H2 necesită ca procesorul să suporte POPCNT, în caz contrar nucleul Windows este imposibil de inițializat.[15]

Instrucțiune Descriere
POPCNT Numărătoarea populării (numără numărul de biți setați la 1). Suportul este indicat prin indicatorul CPUID.01H:ECX.POPCNT[Bit 23].[16]
LZCNT Numărătoare de zerouri principale. Suportul este indicat prin indicatorul CPUID.80000001H:ECX.ABM[Bit 5] flag.[17]

Grupul de instrucțiuni SSE4a a fost introdus în microarhitectura Barcelona a AMD. Aceste instrucțiuni nu sunt disponibile în procesoarele Intel. Suportul este indicat prin indicatorul CPUID.80000001H:ECX.SSE4A[Bit 6].[17]

Instrucțiune Descriere
EXTRQ/INSERTQ Instrucțiuni combinate mask-shift.[18]
MOVNTSD/MOVNTSS Instrucțiuni de stocare în flux scalar.[19]

CPU-uri suportate

[modificare | modificare sursă]

CPU-uri X86-64 v2:

  • Intel
  • AMD
    • Procesoarele bazate pe K10 (SSE4a, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe „Cat” de putere mică
      • Procesoarele bazate pe Bobcat (SSE4a, POPCNT și LZCNT suportate)
      • Procesoarele bazate pe Jaguar și mai noi (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
      • Procesoarele bazate pe Puma și mai noi (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele „Heavy Equipment” (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen+- (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen2 (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen3 (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen4 (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
    • Procesoarele bazate pe Zen5 (SSE4a, SSE4.1, SSE4.2, POPCNT și LZCNT suportate)
  • VIA
    • Procesoarele Nano 3000, X2, QuadCore (SSE4.1 suportat)
    • Procesoarele Nano QuadCore seriile C4000 (SSE4.1, SSE4.2 suportate)
    • Procesoarele Eden X4 (SSE4.1, SSE4.2 suportate)
  • Zhaoxin
    • Procesoarele ZX-C și mai noi (SSE4.1, SSE4.2 suportate)
  1. ^ a b c Intel Streaming SIMD Extensions 4 (SSE4) Instruction Set Innovation Arhivat în , la Wayback Machine., Intel.
  2. ^ Tuning for Intel SSE4 for the 45nm Next Generation Intel Core Microarchitecture Arhivat în , la Wayback Machine., Intel.
  3. ^ „Intel SSE4 Programming Reference” (PDF). Arhivat din original (PDF) la . Accesat în . 
  4. ^ "Barcelona" Processor Feature: SSE Misaligned Access”. AMD. Arhivat din original la . Accesat în . 
  5. ^ „Inside Intel Nehalem Microarchitecture”. Arhivat din original la . Accesat în . 
  6. ^ Experiența mea cu "Conroe" Arhivat în , la Wayback Machine., DailyTech
  7. ^ Extinderea celei mai populare arhitecturi de procesoare din lume Arhivat în , la Wayback Machine., Intel
  8. ^ {„Intel - Data Center Solutions, IOT, and PC Innovation”. Intel. Arhivat din original la . Accesat în . 
  9. ^ Motion Estimation with Intel Streaming SIMD Extensions 4 (Intel SSE4) Arhivat în , la Wayback Machine., Intel.
  10. ^ „Schema Validation with Intel® Streaming SIMD Extensions 4 (Intel® SSE4)”. Arhivat din original la . Accesat în . 
  11. ^ „XML Parsing Accelerator with Intel® Streaming SIMD Extensions 4 (Intel® SSE4)”. Arhivat din original la . Accesat în . 
  12. ^ Klotz, Aaron (). „Microsoft blocks some PCs from Windows 11 24H2 — CPU must support SSE4.2 or the OS will not boot”. Tom's Hardware⁠(d). Accesat în . 
  13. ^ Intel SSE4 Programming Reference Arhivat în , la Wayback Machine. p. 61. See also RFC 3385 Arhivat în , la Wayback Machine. for discussion of the CRC32C polynomial.
  14. ^ Fast, Parallelized CRC Computation Using the Nehalem CRC32 Instruction — Dr. Dobbs, April 12, 2011
  15. ^ Sen, Sayan (). „Microsoft fixes a misfired PopCnt block but Windows 11 24H2 requirements may be here to stay”. Neowin (în engleză). Accesat în . 
  16. ^ Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2B: Instruction Set Reference, N–Z Arhivat în , la Wayback Machine..
  17. ^ a b „AMD CPUID Specification” (PDF). Arhivat din original (PDF) la . Accesat în . 
  18. ^ Rahul Chaturvedi (). "Barcelona" Processor Feature: SSE4a Instruction Set”. Arhivat din original la . 
  19. ^ Rahul Chaturvedi (). "Barcelona" Processor Feature: SSE4a, part 2”. Arhivat din original la . 
  20. ^ „AMD FX-Series FX-6300 - FD6300WMW6KHK / FD6300WMHKBOX”. Arhivat din original la . Accesat în .