SIMD

This is an experimental technology, part of the ECMAScript 2016 (ES7) proposal.
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.

SIMD (pronunciat "sim-dii") és l'acrònim de Single Instruction/Multiple Data, que és una classificació d'arquitectures de computació. Les operacions SIMD es caracteritzen per realitzar la mateixa instrucció amb múltiples punts de dades, resultant en paralelisme a nivell de dades i en conseqüència una millora en el rendiment, per exemple, per a gràfics 3D i processament de video, simulacions de físiques o criptografia, així com en altres dominis.

Aquesta pàgina així com les seves subpàgines formen la documentació de referència de la API SIMD. Vegeu també tipus de SIMD per a un article que descriu SIMD a JavaScript de forma més general.

Descripció

La API SIMD de JavaScript consisteix en diversos tipus i operacions. Els navegadors proporcionen implementacions altament optimitzades d'aquesta API que depenen del hardware del que disposi l'usuari. Actualment, SIMD està especialment modelat per a plataformes basades en l'arquitectura ARMv7 amb l'extensió NEON i plataformes x86 amb l'extensió SSE.

Els tipus SIMD estan instal·lats en un modul SIMD. A diferència d'altres objectes globals, SIMD no és un constructor. Això implica que no permet l'ús de l'operador new o invocar l'objecte SIMD com si fós una funció. Totes les propietats i mètodes de SIMD són estàtics (tal i com succeeix amb l'objecte Math).

Resum

Un valor SIMD te múltiples carrils. Per a un vector de longitud 4, anomenarem als carrils amb x, y, z i w. Ara, en comptes de tenir que realitzar 4 operacions diferents per a cadascun d'aquests carrils, SIMD ens permet realitzar una operació a tots cuatre carrils de forma simultània. Això requereix menys operacions i, per tant, augmenta el rendiment i resulta més eficient des del punt de vista energètic si ho comparem amb operacions escalars (SISD). Cal destacar que les operacions SIMD no es poden utilitzar per a processar múltiples dades de forma diferent. A la figura següent es mostra una sola instrucció (suma) i, per tant, podría ser realitzada mitjançant SIMD:

SISD SIMD

Figures 1 i 2: Comparació entre SISD i SIMD.

Suma aritmètica simple

El codi JavaScript per a realitzar una operació SIMD simple com la de la figura 2 és el següent:

var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a,b); // Float32x4[6,8,10,12]

Tipus de dades

Tots els tipus de dades SIMD són immutables. És a dir, el seu contingut no pot ser alterat directament. En comptes d'això, les operacions que es realitzen sobres les dades creen nous tipus de dades SIMD immutables.

La figura següent mostra els diferent tipus de dades SIMD en un registre SIMD de 128 bits. La API de SIMD de JavaScript actual conté 5 tipus diferents amb 2, 4, 8 o 16 carrils.

Lanes per type in a 128-bit SIMD register

Figura 3: Carrils per tipus en un registre SIMD de 128 bits.

SIMD.Int8x16
128 bits dividits en 16 carrils que emmagatzemen valors sencers de 8 bits.
SIMD.Int16x8
128 bits dividits en 8 carrils que emmagatzemen valors sencers de 16 bits.
SIMD.Int32x4
128 bits dividits en 4 carrils que emmagatzemen valors sencers de 32 bits.
SIMD.Float32x4
128 bits dividits en 4 carrils que emmagatzemen valors numèrics amb coma flotant de precisió simple (32 bits).
SIMD.Float64x2
128 bits dividits en 2 carrils que emmagatzemen valors numèrics amb coma flotant de precisió doble (64 bits).

Funcions constructores

A més de les funcions constructores simples (per exemple SIMD.Int32x4(1,2,3,4)), la API SIMD proporciona les funcions constructores següents:

SIMD.%type%.splat()
Crea un tipus de dades SIMD on tots els carrils reben el valor donat.
SIMD.%type%.bool()
Crea un tipus de dades SIMD amb paràmetres booleans, permetent crear màscares de selecció de manera explícita.

També és posible convertir d'un tipus de dades SIMD a un altre.

Nota: els tipus SIMD no funcionen amb new, ja que els valors SIMD no són objectes "encapsulats" (en comparació a String(s) amb new String(s), que crea un objecte String).

var v = new SIMD.Float32x4(0,1,2,3);
// TypeError: SIMD.Float32x4 no és un constructor

En comptes d'això, s'escriu:

var v = SIMD.Float32x4(0,1,2,3);

Operacions

Per a poder operar dades de tipus SIMD és necesari utilitzar operacions SIMD.

Nota: No totes les operacions SIMD suporten tots els tipus SIMD, vegeu les pàgines de referència individuals per més detalls i disponibilitat.

Comprovar tipus de SIMD

SIMD.%type%.check()
Retorna una nova instància si el paràmetre és un tipus de dades SIMD vàlid i del mateix tipus que %type%. Llença un TypeError en cas contrari.

Accedir i modificar carrils

SIMD.%type%.extractLane()
Retorna el valor d'un carril donat.
SIMD.%type%.replaceLane()
Retorna una nova instància amb el valor del carril dona reemplaçat.

Llegir i escriure en arrays amb tipus

SIMD.%type%.load()
Retorna una nova instància amb els valors dels carrils proporcionats per una array amb tipus.
SIMD.%type%.store()
Emmagatzema un tipus de dades SIMD en un array amb tipus.

Operacions aritmètiques

SIMD.%type%.abs()
Retorna una nova instància amb el valor absolut dels carrils.
SIMD.%type%.add()
Retorna una nova instància amb el valor dels carrils sumats (a + b).
SIMD.%type%.div()
Retorna una instància amb el valor dels carrils dividit (a / b).
SIMD.%type%.mul()
Retorna una instància amb el valor dels carrils multiplicat (a * b).
SIMD.%type%.neg()
Retorna una instància amb el valor dels carrils negat.
SIMD.%type%.reciprocalApproximation()
Retorna una nova instància amb una aproximació recíproca del valor dels carrils.
SIMD.%type%.reciprocalSqrtApproximation()
Retorna una nova instància amb una aproximació de la rel quadrada recíproca als valors del carril.
SIMD.%type%.sub()
Retorna una nova instància amb la resta dels valors del carril (a - b).
SIMD.%type%.sqrt()
Retorna una nova instància amb la rel quadrada dels valors del carril.

Alteració de l'ordre

SIMD.%type%.shuffle()
Retorna una nova instància amb els valors dels carrils intercanviants de forma aleatòria.
SIMD.%type%.swizzle()
Retorna una nova instància amb els valors dels carrils intercanviats en l'ordre especificat.

Valors mínims i màxims

SIMD.%type%.max()
Retorna una nova instància amb el valor màxim de cada carril.
SIMD.%type%.maxNum()
Retorna una nova instància amb el valor màxim de cada carril, preferint nombres a NaN.
SIMD.%type%.min()
Retorna una nova instància amb el valor mínim de cada carril.
SIMD.%type%.minNum()
Retorna una nova instància amb el valor mínim de cada carril, preferint nombres a NaN.

Seleccions

SIMD.%type%.select()
Retorna una nova instància amb el valor dels carrils format mitjançant una màscara de selecció.
SIMD.%type%.selectBits()
Retorna una nova instància amb el valor dels carrils format mitjançant un conjunt de bits format per una màscara de selecció.

Comparacions

SIMD.%type%.equal()
Retorna una màscara de selecció generada mitjançant l'operació a == b.
SIMD.%type%.notEqual()
Retorna una màscara de selecció generada mitjançant l'operació a != b.
SIMD.%type%.lessThan()
Retorna una màscara de selecció generada mitjançant l'operació a < b.
SIMD.%type%.lessThanOrEqual()
Retorna una màscara de selecció generada mitjançant l'operació a <= b.
SIMD.%type%.greaterThan()
Retorna una màscara de selecció generada mitjançant l'operació a > b.
SIMD.%type%.greaterThanOrEqual()
Retorna una màscara de selecció generada mitjançant l'operació a >= b.

Operadors lògics de bits

SIMD.%type%.and()
Retorna una nova instància realitzant la operació lògica AND als valors dels carrils (a & b).
SIMD.%type%.or()
Retorna una nova instància realitzant la operació lògica OR als valors dels carrils (a | b).
SIMD.%type%.xor()
Retorna una nova instància realitzant la operació lògica XOR als valors dels carrils (a ^ b).
SIMD.%type%.not()
Retorna una nova instància realitzant la operació lògica NOT als valors dels carrils (~a).

Operacions de desplaçament de bits

SIMD.%type%.shiftLeftByScalar()
Retorna una nova instància amb els valors del carril desplaçats a l'esquerra un nombre determinat de bits (a << bits).
SIMD.%type%.shiftRightArithmeticByScalar()
Retorna una nova instància amb els valors del carril desplaçats a la dreta (desplaçament aritmètic) un nombre determinat de bits (a >> bits).
SIMD.%type%.shiftRightLogicalByScalar()
Retorna una nova instància amb els valors del carril desplaçats a la dreta (desplaçament lògic) un nombre determinat de bits (a >>> bits).

Conversions de dades

SIMD.%type%.fromFloat32x4()
Crea un nou tipus de dades SIMD amb una conversió en coma flotant a partir de dades de tipus Float32x4.
SIMD.%type%.fromFloat32x4Bits()
Crea un nou tipus de dades SIMD amb una còpia a nivell de bits de dades de tipus Float32x4.
SIMD.%type%.fromFloat64x2()
Crea un nou tipus de dades SIMD amb una conversió en coma flotant a partir de dades de tipus Float64x2.
SIMD.%type%.fromFloat64x2Bits()
Crea un nou tipus de dades SIMD amb una còpia a nivell de bits de dades de tipus Float64x2.
SIMD.%type%.fromInt32x4()
Crea un nou tipus de dades SIMD amb una conversió de nombre sencer a partir de dades de tipus Int32x4.
SIMD.%type%.fromInt32x4Bits()
Crea un nou tipus de dades SIMD amb una còpia a nivell de bits de dades de tipus Int32x4.
SIMD.%type%.fromInt16x8Bits()
Crea un nou tipus de dades SIMD amb una còpia a nivell de bits de dades de tipus Int16x8.
SIMD.%type%.fromInt8x16Bits()
Crea un nou tipus de dades SIMD amb una còpia a nivell de bits de dades de tipus Int8x16.

Polyfill

Existeix una implementació Polyfill basada en arrays amb tipus, disponible al repositori de GitHub ecmascript_simd.

Especificacions

Especificació Estat Comentaris
SIMD
The definition of 'SIMD' in that specification.
Draft Definició inicial.

Compatibilitat amb navegadors

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suport bàsic Not supported Nightly build Not supported Not supported Not supported
SIMD.Float32x4 Not supported Nightly build Not supported Not supported Not supported
SIMD.Float64x2 Not supported Nightly build Not supported Not supported Not supported
SIMD.Int8x16 Not supported Nightly build Not supported Not supported Not supported
SIMD.Int16x8 Not supported Nightly build Not supported Not supported Not supported
SIMD.Int32x4 Not supported Nightly build Not supported Not supported Not supported
Característica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suport bàsic Not supported Not supported Nightly build Not supported Not supported Not supported
SIMD.Float32x4 Not supported Not supported Nightly build Not supported Not supported Not supported
SIMD.Float64x2 Not supported Not supported Nightly build Not supported Not supported Not supported
SIMD.Int8x16 Not supported Not supported Nightly build Not supported Not supported Not supported
SIMD.Int16x8 Not supported Not supported Nightly build Not supported Not supported Not supported
SIMD.Int32x4 Not supported Not supported Nightly build Not supported Not supported Not supported

Notes quant a l'estat

Vegeu també

Document Tags and Contributors

 Contributors to this page: enTropy
 Last updated by: enTropy,