Vés al contingut

Streaming SIMD Extensions

De la Viquipèdia, l'enciclopèdia lliure
Aquesta és una versió anterior d'aquesta pàgina, de data 18:59, 18 des 2008 amb l'última edició de Rbuj (discussió | contribucions). Pot tenir inexactituds o contingut no apropiat no present en la versió actual.

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 serie de processadors Pentium III en resposta de 3DNow! d'AMD (que va debutar un any abans). SSE conté 70 noves instruccions.

Originariament va ser conegut com 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 diferienciar-lo de la seva linea 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 renombrat ISSE, per Internet Streaming SIMD Extensions, després SSE.

Intel pel 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 originariariament va afegir vuit registres nous de 128 bits coneguts com XMM0 a XMM7. Les extensions x86-64 d'AMD (anomenadaes originariament 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 presició simple de 32 bits o 2 nombres en punt flotant de presició 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 o sense signe. 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 adicional que el sistema operatiu ha de preservar a través de l'activació de tasques, Per defecte estan desactivats mentres el sistema operatiu els activi de forma explícita. Això significa que els sistema operatiu ha de sbaer com utilitzar les instruccions FXSAVE i FXRSTOR, que són el parell d'instruccions que poden enmagatzemar 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 de que SSE afegeix suport per a punt flotant, te molta més utilització que MMX. L'adició d'afegir suport d'enters a SSE2 fa encara més flexible SSE. mentres que MMX es 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 posible 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: Memoria-a-Registre / Registre-a-Memoria / 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 números de precissió simple, juntar vectors de 4 components utilitzant x87 necessita quatre operacions de suma en punt flotant

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;

Aquest podria correspondre a quatre instruccions FADD de x87 FADD en codi odjecte. Per un altre costat, com en el següent preudocodi mostra, una sola instrucció de 128 bits 'packed-add' que pot remplaçar les quatre operacions de suma.

movaps xmm0,address-of-v1          ;xmm0=v1.w | v1.z | v1.y | v1.x 
addps xmm0,address-of-v2 ;xmm0=v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps address-of-vec_res,xmm0

Versions posteriors

  • SSE2, introduced with the Pentium 4, is a major enhancement to SSE (which some programmers renamed "SSE1"). SSE2 adds new math instructions for double-precision (64-bit) floating point and also extends MMX instructions to operate on 128-bit XMM registers. Until SSE4 [see below], SSE integer instructions introduced with later SSE extensions would still operate on 64-bit MMX registers because the new XMM registers require operating system support. SSE2 enables the programmer to perform SIMD math of virtually any type (from 8-bit integer to 64-bit float) entirely with the XMM vector-register file, without the need to touch the (legacy) MMX/FPU registers. Many programmers consider SSE2 to be "everything SSE should have been", as SSE2 offers an orthogonal set of instructions for dealing with common datatypes.
  • SSE3, also called Prescott New Instructions, is an incremental upgrade to SSE2, adding a handful of DSP-oriented mathematics instructions and some process (thread) management instructions.
  • SSSE3 is an incremental upgrade to SSE3, adding 16 new opcodes which include permuting the bytes in a word, multiplying 16-bit fixed-point numbers with correct rounding, and within-word accumulate instructions. SSSE3 is often mistaken for SSE4 as this term was used during the development of the Core microarchitecture.
  • SSE4 is another major enhancement, adding a dot product instruction, lots of additional integer instructions, a popcnt instruction, and more. SSE4 ends MMX register support.[1]
  • AVX (Advanced Vector Extensions) is an advanced version of SSE announced by Intel featuring a widened data path from 128 bits to 256 bits and 3-operand instructions (up from 2). Products implementing AVX are slated for 2010. [1]

Vegeu també

Referències