Přeskočit na obsah

Streaming SIMD Extensions

Z Wikipedie, otevřené encyklopedie

SSE (Streaming SIMD Extensions, původně nazvaná ISSE, Internet Streaming SIMD Extensions) je instrukční sada typu SIMD (Single Instruction, Multiple Data - jedna instrukce, více dat) navržená Intelem v roce 1999 pro procesor Pentium III jako odpověď na instrukční sadu 3DNow! od konkurenční společnosti AMD (která debutovala o rok dříve).

SSE obsahuje 70 nových instrukcí.

SSE byla původně známá pod jménem KNI což byla zkratka pro Katmai New Instructions (Katmai bylo první jádro Pentia III). Tato sada instrukcí byla jednou z mála věcí, která odlišovala Pentium III od Pentia II. SSE později implementovalo i AMD ve svých procesorech Athlon XP.

Intel později uvedl další revize SSE2 (u Pentia 4 s jádrem Northwood), SSE3 (u Pentia 4 s jádrem Prescott), SSE4 (u Core 2 Duo s jádrem Conroe), SSE4.1 (Core 2 Duo s jádrem Penryn) a SSE4.2 u Core i7 (jádro Nehalem).

  • SSE - přidala 70 nových instrukcí
  • SSE2 - přidala 144 nových instrukcí
  • SSE3 - přidala 13 nových instrukcí
  • SSSE3 - přidala 16 nových instrukcí
  • SSE4 - přidala 47 nových instrukcí
  • SSE4.1, 4.2 - přidaly 170 nových instrukcí

SSE původně přidalo 8 nových 128bitových registrů pojmenovaných jako XMM0 až XMM7. Rozšíření AMD64 od společnosti AMD přidalo dalších 8 registrů XMM8 až XMM15, jsou přístupné pouze v 64bitovém režimu CPU. K dispozici je nový 32bitový řídící/stavový registr MXCSR.

Každý z nich obsahoval čtyři 32bitové registry pro čísla s plovoucí desetinnou čárkou.

Každý registr obsahoval:

  • čtyři 32bitové registry pro čísla s plovoucí desetinnou čárkou (single-precision)
  • dva 64bitové registry pro čísla s plovoucí desetinnou čárkou (double-precision)
  • dva 64bitové registry pro celá čísla
  • čtyři 32bitové registry pro celá čísla
  • osm 16bitových registrů pro krátká celá čísla
  • šestnáct 8bitových registrů pro byty nebo znaky

SSE představilo jak skalární tak vektorové („sbalené“ do složek/souřadnic) operace.

S plovoucí desetinnou čárkou
  • přesuny (z paměti do registru, z registru do paměti, mezi registry)
    • skalární – MOVSS
    • vektorové – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
  • aritmetické (sčítání, odečítání, násobení, dělení, převrácená hodnota, určení maxima a minima, 2. mocnina a odmocnina)
    • skalární – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, MAXSS, MINSS, SQRTSS, RSQRTSS
    • vektorové – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, MAXPS, MINPS, SQRTPS, RSQRTPS
  • bitové operace
    • vektorové – ANDPS, ORPS, XORPS, ANDNPS
  • porovnávání
    • skalární – CMPSS, COMISS, UCOMISS
    • vektorové – CMPPS
  • „zamíchání“ a „rozbalení“ dat (shuffle and unpack – manipulace s jednotlivými bitovými částmi 128bitového registru)
    • vektorové – SHUFPS, UNPCKHPS, UNPCKLPS
  • datový převod
    • skalární – CVTSI2SS, CVTSS2SI, CVTTSS2SI
    • vektorové – CVTPI2PS, CVTPS2PI, CVTTPS2PI
Celočíselné
  • aritmetické
    • PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
  • přenos dat
    • PEXTRW, PINSRW
  • jiné
    • PMOVMSKB, PSHUFW
Ostatní
  • správa MXCSR
    • LDMXCSR, STMXCSR
  • správa cache a paměti
    • MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE