# Streaming SIMD Extensions

En informàtica, Streaming SIMD Extensions (SSE) és una extensió SIMD del repertori d'instruccions de l'arquitectura x86, dissenyada per Intel i introduïda el 1999 amb la seva sèrie de processadors Pentium III en resposta de 3DNow! d'AMD (que va debutar un any abans). SSE conté 70 noves instruccions.
Originàriament va ser conegut com a KNI, Katmai New Instructions (Katmai va ser el nom amb clau per la primera revisió del nucli Pentium III). Durant el projecte Katmai, Intel va buscar la forma per diferenciar-lo de la seva línia de productes anteriors, en particular, el seu producte insígnia Pentium II. AMD eventualment va afegir suport per a instruccions SSE, començant amb el seu processador Athlon XP. Que va ser posteriorment rebatejat ISSE, per Internet Streaming SIMD Extensions, després SSE.
Intel, en general, es va decebre del seu primer esforç d'implementació de SIMD a IA-32, MMX. MMX tenia dos problemes principals: Aquest reutilitzava els registres de punt flotant existents fent la CPU incapaç de treballar amb ambdós punt flotant i les dades SIMD al mateix moment, i solament treballava amb enters.

## Registres

SSE originàriament va afegir vuit registres nous de 128 bits coneguts com a XMM0 a XMM7. Les extensions x86-64 d'AMD (anomenades originàriament AMD64) i després duplicades per Intel afegeixen uns altres vuit registres de XMM8 fins a XMM15. També hi ha un nou registre control/estat de 32 bits, MXCSR. Tots els 16 registres 16 XMM de 128 bits són només accessibles en mode d'operació de 64 bits.
Cada registre de paquets engloba 4 nombres en punt flotant de precisió simple de 32 bits o 2 nombres en punt flotant de precisió doble de 64 bits o quatre enters de 32 bits o vuit enters curts de 16 bits o setze octets o caràcters de 8 bits. Les operacions amb enters tenen instruccions per variant amb signe o sense. Les operacions enteres SIMD encara poden ser portades a terme pels vuit registres MMX de 64 bits.
A causa que aquests registres de 128 bits són estats de programa addicional que el sistema operatiu ha de preservar a través de l'activació de tasques, per defecte estan desactivats fins que el sistema operatiu els activi de forma explícita. Això significa que els sistema operatiu ha de saber com utilitzar les instruccions FXSAVE i FXRSTOR, que són el parell d'instruccions que poden emmagatzemar d'un sol cop tots els registres d'estat x87 i SSE. Aquest suport va ser ràpidament afegit a la gran majoria de sistemes operatius IA-32.
A causa del fet que SSE afegeix suport per a punt flotant, té molta més utilització que MMX. L'addició d'afegir suport d'enters a SSE2 fa encara més flexible SSE. Mentre que MMX és redundant, les operacions es poden realitzar amb paral·lel amb les operacions SSE oferint a més un augment en el rendiment en algunes situacions.
La primera CPU que va suportar SSE, el Pentium III, compartia els recursos d'execució entre SSE i la FPU. Mentres una aplicació compilada pot interpaginar cara a cara instruccions FPU i SSE, el Pentium III no podrà proporcionar en el mateix cicle de rellotge instruccions FPU i SSE. Aquesta limitació redueix l'eficàcia de la segmentació, però els registres separats XMM fan possible barrejar operacions SIMD i punt flotant escalar sense el compliment explícit d'èxit del canvi de mode MMX/punt flotant.

## Instruccions SSE

SSE va introduir instruccions en punt flotant: escalars i empaquetades.
Instruccions en punt flotant
* Moviment de dades: Memòria-a-Registre / Registre-a-Memòria / Registre-a-Registre
** Escalar – MOVSS
** Empaquetat – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
* Aritmètiques
** Escalar – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
** Empaquetat – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
* Comparació
** Escalar – CMPSS, COMISS, UCOMISS
** Empaquetat – CMPPS
* Data shuffle and unpacking
** Packed – SHUFPS, UNPCKHPS, UNPCKLPS
* Conversió de tipus de dades
** Escalar – CVTSI2SS, CVTSS2SI, CVTTSS2SI
** Empaquetat – CVTPI2PS, CVTPS2PI, CVTTPS2PI
* Operacions lòguiques binàries
** Empaquetat – ANDPS, ORPS, XORPS, ANDNPS
Instruccions per a nombres enters
* Aritmètiques
** PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
* Moviment de dades
** PEXTRW, PINSRW
* Altres
** PMOVMSKB, PSHUFW
Altres instruccions
* Gestió MXCSR
** LDMXCSR, STMXCSR
* Gestió de cache i memoria
** MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

## Exemple

El següent exemple demostra els avantatges de la utilització de SSE. Considera una operació com la suma de vectors, que és molt utilitzada en aplicacions gràfiques d'ordinadors. Per sumar dos nombres de precisió simple, unir vectors de 4 components utilitzant x87 necessita quatre operacions de suma en punt flotant
Aquest podria correspondre a quatre instruccions FADD de x87 FADD en codi objecte. Per un altre costat, com en el següent preudocodi mostra, una sola instrucció de 128 bits 'packed-add' que pot reemplaçar les quatre operacions de suma.

## Versions posteriors

* SSE2, va ser introdduït amb el Pentium 4, és una millora important de SSE (que alguns programadors el van rebatejar a "SSE1"). SSE2 afegeix noves instruccions matemàtiques per a precisió doble (64 bits) en punt flotant i a més expandeix les instruccions MMX per a poder operar amb registres XMM de 128 bits. Fins SSE4 [vegeu a continuació], Les instruccions SSE d'enters introduïdes amb les posteriors extensions SSE, extensions que encara operen amb registres MMX de 64 bits, ja que els nous registres XMM necessiten el suport del sistema operatiu. SSE2 permet al programador realitzar matemàtica SIMD de pràcticament qualsevol tipus (d'enters de 8 bits a fotants de 64 bits) amb el nou fitxer vector-registre XMM, sense la necessitat de tocar els registres MMX/FPU. Molts programadors consideren SSE2 a ser "tot el que hauria d'haver estat la SSE", com SSE2 ofereix un repertori d'instruccions ortogonal per al tractamenent comú de tipus de dades.
* SSE3, també anomenades instruccions noves Prescott, és una actualització incremental per SSE2, afegint un grapat d'instruccions orientades a matemàtiques DSP i algunes instruccions de gestió de processos (fils).
* SSSE3 és una actualització incremental a SSE3, afegint 16 nous codis d'operació que inclouen la permutació de bytes a words, multiplicació nombres amb punt flotant de 16 bits amb redondeig corecte, i instruccions d'acumulador dins de word. SSSE3 sovint es confon amb SSE4, ja que aquest terme es va utilitzar durant el desenvolupament del nucli microarquitectura.
* SSE4 és una altra millora important, afegint una instrucció de punt a la multiplicació, conjunts d'instruccions d'addició d'enters, una instrucció popcnt, i més. SSE4 finalitza el suport pel registre MMX.
* SSE5 és una nova versió de l'anunci fet per AMD l'agost de 2007.
* AVX (Extensions vectorials avançades) és una versió avançada de SSE anunciada per Intel que amplia la ruta de dades de 128 a 256 bits i instruccions de 3 operands (incrementat de 2). L'amplicació de productes AVX estan previstes pel 2010. Arxivat 2011-06-07 a Wayback Machine.

## Vegeu també

* Llenguatge d'assemblador
* MMX (instruction set)
* 3DNow!
* AltiVec
* Pentium III's SSE implementation

## Referències

* ↑ Intel® Streaming SIMD Extensions 4 Instruction Set Innovation
* ↑ «AMD plots single thread boost with x86 extensions». The Register, 30-08-2007 [Consulta: 1r febrer 2008].
* ↑ http://developer.amd.com/sse5.jsp Arxivat 2007-09-03 a Wayback Machine.