SIMD

Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

SIMD est le sigle pour Single Instruction/Multiple Data qui est une classification d'architecture d'ordinateurs. SIMD permet d'effectuer une même opération sur plusieurs points de données, ce qui permet d'effectuer des traitements en parallèle et d'augmenter les performances (par exemple lors du traitement de vidéos, de simulations physique, de cryptanalyse, etc.).

Cette page, ainsi que les sous-pages associées constituent une documentation de référence pour l'API SIMD. Cet autre article sur les types SIMD décrit l'implémentation de cette API dans JavaScript de façon plus générale.

Description

L'API JavaScript SIMD comprend différents types et opérations. Les navigateurs fournissent des implémentations de cette API qui sont optimisées en fonction des composants matériels de l'environnement de l'utilisateur. Actuellement, SIMD est surtout conçu pour les plates-formes ARMv7 avec NEON et les plates-formes x86 avec SSE.

Les types pour l'API SIMD sont installés sur un module SIMD. À la différence de la plupart des objets globaux, SIMD n'est pas un constructeur. Aussi, on ne peut pas utiliser l'opérateur new ou appeler l'objet SIMD comme une fonction. L'ensemble des propriétés et méthodes de SIMD sont statiques (comme c'est le cas pour l'objet Math).

Aperçu

Un SIMD possède plusieurs voies (lanes). Pour un vector dont la longueur vaut 4, les voies seront appelées x, y, z, et w. Désormais, au lieu d'effectuer quatre opérations séparées sur chacune de ces voies, SIMD permet d'effectuer des opérations sur les 4 voies de façon simultanée. Cela nécessite moins d'opérations et entraîne donc une augmentation des performances et une meilleure efficacité énergétique comparé aux opérations scalaires (SISD). Les opérations SIMD ne peuvent pas être utilisées pour traiter différentes données de différentes façons. Avec le schéma suivant, on a une unique opération (l'addition) afin qu'elle puisse être effectuée avec SIMD :

 SIMD

Comparaison de SISD et SIMD

Addition arithmétique simple

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

Types de données

Tous les types de données SIMD sont immuables. Il n'est pas possible de les modifier directement. Ce qu'on peut faire, c'est effectuer des opérations afin de créer de nouveaux types de données SIMD immuables. Le schéma suivant illustre les différents types de données SIMD dans un registre SIMD sur 128 bits. L'API SIMD JavaScript actuelle possède cinq types différents avec des voies longues de 2, 4, 8 ou 16 bits.

Nombres de voie selon les types pour un registre SIMD 128 bits

Nombres de voies pour chaque type SIMD sur un registre 128 bits

Les types SIMD booléens

SIMD.Bool8x16
128 bits divisés en 16 voies qui stockent chacune des valeurs booléennes.
SIMD.Bool16x8
128 bits divisés en 8 voies qui stockent chacune des valeurs booléennes
SIMD.Bool32x4
128 bits divisés en 4 voies qui stockent chacune des valeurs booléennes.
SIMD.Bool64x2
128 bits divisés en 2 voies qui stockent chacune des valeurs booléennes.

Les types SIMD entiers signés

SIMD.Int8x16
128 bits divisés en 16 voies qui stockent chacune des valeurs entières signées sur 8 bits.
SIMD.Int16x8
128 bits divisés en 8 voies qui stockent chacune des valeurs entières signées sur 16 bits.
SIMD.Int32x4
128 bits divisés en 4 voies qui stockent chacune des valeurs entières signées sur 32 bits.

Les types SIMD entiers non-signés

SIMD.Uint8x16
128 bits divisés en 16 voies qui stockent chacune des valeurs entières non signées sur 8 bits.
SIMD.Uint16x8
128 bits divisés en 8 voies qui stockent chacune des valeurs entières non signées sur 16 bits.
SIMD.Uint32x4
128 bits divisés en 4 voies qui stockent chacune des valeurs entières non signées sur 32 bits.

Les types SIMD flottants

SIMD.Float32x4
128 bits divisés en 4 voies qui stockent chacune des valeurs flottantes à précision simple.
SIMD.Float64x2
128 divisés en 2 voies qui stockent chacune des valeurs flottantes à précision double.

Constructeurs

En plus des constructeurs « simples » (tels que new SIMD.Int32x4(1,2,3,4)), l'API SIMD fournit les constructeurs suivants.

SIMD.%type%.splat()
Crée un type de donnée SIMD dont toutes les voies sont définies avec une même valeur donnée.

Note : Les types SIMD ne fonctionnent pas avec new, en effet, les valeurs SIMD ne sont pas des objets classiques qu'on peut envelopper dans un constructeur (comme, par exemple,, pour les chaînes avec String(s) et new String(s)).

var v = new SIMD.Float32x4(0,1,2,3); 
// TypeError: SIMD.Float32x4 is not a constructor

Ici, on écrira juste :

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

Opérations

Pour effectuer des opérations avec les types SIMD, il est nécessaire d'utiliser des opérations SIMD qui fonctionnent sur ces types de données.

Note : L'ensemble des opérations SIMD ne sont pas disponibles pour tous les types SIMD. Pour plus de détails, voir les pages des différents types dans la référence.

Vérification des types SIMD

SIMD.%type%.check()
Renvoie une nouvelle instance si le paramètre passé est un type de donnée SIMD valide et si c'est le même que %type%. Sinon, cette méthode lèvera une exception TypeError.

Accès et modification des voies

SIMD.%type%.extractLane()
Renvoie la valeur d'une voie donnée.
SIMD.%type%.replaceLane()
Renvoie une nouvelle instance dont la valeur de la voie a été remplacée.

Chargement et enregistrement à partir et vers un tableau typé

SIMD.%type%.load()
SIMD.%type%.load1()
SIMD.%type%.load2()
SIMD.%type%.load3()
Renvoie une nouvelle instance dont les voies sont chargées avec les valeurs d'un tableau typé.
SIMD.%type%.store()
SIMD.%type%.store1()
SIMD.%type%.store2()
SIMD.%type%.store3()
Enregistre un type de donnée SIMD dans un tableau typé.

Opérations arithmétiques

SIMD.%FloatType%.abs()
Renvoie une nouvelle instance avec les valeurs absolues des voies.
SIMD.%type%.add()
Renvoie une nouvelle instance avec la somme des voies (a + b).
SIMD.%type%.addSaturate()
Renvoie une nouvelle instance avec la somme des voies (a + b) et une « saturation » lors du dépassement.
SIMD.%type%.div()
Renvoie une nouvelle instance dont les valeurs des voies sont les résultats de la division des voies (a / b).
SIMD.%type%.mul()
Renvoie une nouvelle instance avec la multiplication des voies (a * b).
SIMD.%type%.neg()
Renvoie une nouvelle instance avec les valeurs opposées des voies.
SIMD.%FloatType%.reciprocalApproximation()
Renvoie une nouvelle instance avec une approximation des inverses des valeurs des voies.
SIMD.%FloatType%.reciprocalSqrtApproximation()
Renvoie une nouvelle instance avec une approximation des inverses des racines carrées des valeurs des voies.
SIMD.%type%.sub()
Renvoie une nouvelle instance avec la soustraction des voies (a - b).
SIMD.%type%.subSaturate()
Renvoie une nouvelle instance avec la différence des voies (a - b) et une « saturation » lors du dépassement.
SIMD.%FloatType%.sqrt()
Renvoie une nouvelle instance avec la racine carrée des valeurs des voies.

Mélange aléatoire et échange

SIMD.%type%.shuffle()
Renvoie une nouvelle instance dont les valeurs des voies ont été mélangées aléatoirement.
SIMD.%type%.swizzle()
Renvoie une nouvelle instance dont les valeurs des voies ont été échangées.

Minimum, maximum

SIMD.%FloatType%.max()
Renvoie une nouvelle instance qui contient les maximums des valeurs des voies.
SIMD.%FloatType%.maxNum()
Renvoie une nouvelle instance qui contient les maximums des valeurs des voies et qui privilégie les nombres par rapport à NaN.
SIMD.%FloatType%.min()
Renvoie une nouvelle instance avec les minimums des valeurs des voies.
SIMD.%FloatType%.minNum()
Renvoie une nouvelle instance qui contient les minimums des valeurs des voies et qui privilégie les nombres par rapport à NaN.

Sélections

SIMD.%type%.select()
Renvoie une nouvelle instance dont les valeurs des voies sont un mélange des différentes voies en fonction d'un masque de sélection.

Comparaisons

SIMD.%type%.equal()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a == b.
SIMD.%type%.notEqual()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a != b.
SIMD.%type%.lessThan()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a < b.
SIMD.%type%.lessThanOrEqual()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a <= b.
SIMD.%type%.greaterThan()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a > b.
SIMD.%type%.greaterThanOrEqual()
Renvoie une nouvelle instance avec true ou false pour chaque voie selon le résultat de a >= b.

Opérations logiques binaires

SIMD.%type%.and()
Renvoie une nouvelle instance dont les voies sont le résultat d'un ET logique sur les voies des instances fournies (a & b).
SIMD.%type%.or()
Renvoie une nouvelle instance dont les voies sont le résultat d'un OU logique sur les voies des instances fournies (a | b).
SIMD.%type%.xor()
Renvoie une nouvelle instance dont les voies sont le résultat d'un XOR logique sur les voies des instances fournies (a ^ b).
SIMD.%type%.not()
Renvoie une nouvelle instance dont les voies sont le résultat d'un NON logique sur les voies des instances fournies (~a).

Opérations de décalage binaires

SIMD.%IntegerType%.shiftLeftByScalar()
Renvoie une nouvelle instance dont les valeurs des voies sont décalées à gauche d'un certain nombre de bits (a << bits).
SIMD.%IntegerType%.shiftRightByScalar()
Renvoie une nouvelle instance dont les valeurs des voies sont décalées à droite d'un certain nombre de bits. Le comportement du type sous-jacent et notamment du caractère signé/non-signé.

Conversion

SIMD.%type%.fromFloat32x4()
Crée un nouveau type de données SIMD avec une conversion flottante depuis un Float32x4.
SIMD.%type%.fromFloat32x4Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Float32x4.
SIMD.%type%.fromFloat64x2Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Float64x2.
SIMD.%type%.fromInt32x4()
Crée un nouveau type de données SIMD avec une conversion entière depuis un Int32x4.
SIMD.%type%.fromInt32x4Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Int32x4.
SIMD.%type%.fromInt16x8Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Int16x8.
SIMD.%type%.fromInt8x16Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Int8x16.
SIMD.%type%.fromUint32x4()
Crée un nouveau type de données SIMD avec une conversion entière depuis un Uint32x4.
SIMD.%type%.fromUint32x4Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Uint32x4.
SIMD.%type%.fromUint16x8Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Uint16x8.
SIMD.%type%.fromUint8x16Bits()
Crée un nouveau type de données SIMD avec une conversion binaire depuis un Uint8x16.

Prototype SIMD

Les méthodes et propriétés suivantes sont rattachées à SIMD.%type%.prototype.

SIMD.%type%.prototype.constructor
Définit la fonction qui crée le prototype d'un objet SIMD.
SIMD.%type%.prototype.toLocaleString()
Renvoie une chaîne localisée qui représente le type SIMD et ses éléments. Cette méthode surcharge la méthode Object.prototype.toLocaleString().
SIMD.%type%.prototype.toString()
Renvoie une chaîne qui représente le type SIMD et ses éléments. Cette méthode surcharge la méthode Object.prototype.toString().
SIMD.%type%.prototype.valueOf()
Renvoie la valeur primitive d'un objet SIMD.
SIMD.%type%.prototype.toSource()
Renvoie une chaîne qui représente le code source de l'objet. Cette méthode surcharge la méthode Object.prototype.toSource().

Prothèse d'émulation (polyfill)

Une implémentation pour prothèse, basée sur les tableaux typés, est disponible sur le dépôt GitHub ecmascript_simd.

Spécifications

Spécification Statut Commentaires
SIMD
La définition de 'SIMD' dans cette spécification.
Projet Définition initiale.

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Edge Internet Explorer Opera Safari
Support simple Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Float32x4 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Float64x2 Pas de support Nightly build Pas de support Pas de support Pas de support Pas de support
SIMD.Int8x16 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Int16x8 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Int32x4 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint8x16 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint16x8 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint32x4 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool8x16 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool16x8 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool32x4 Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool64x2 Pas de support Nightly build Pas de support Pas de support Pas de support Pas de support
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) Edge IE Mobile Opera Mobile Safari Mobile
Support simple Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Float32x4 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Float64x2 Pas de support Pas de support Nightly build Pas de support Pas de support Pas de support Pas de support
SIMD.Int8x16 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Int16x8 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Int32x4 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint8x16 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint16x8 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Uint32x4 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool8x16 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool16x8 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool32x4 Pas de support Pas de support Nightly build Nightly build Pas de support Pas de support Pas de support
SIMD.Bool64x2 Pas de support Pas de support Nightly build Pas de support Pas de support Pas de support Pas de support

Notes de statut

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight
 Dernière mise à jour par : SphinxKnight,