Les thèses centrales

  • WebAssembly vise à fonctionner à la vitesse native en tirant parti des fonctionnalités matérielles communes disponibles sur une variété de plates-formes.
  • Les propositions SIMD et multithreading de WebAssembly ont le potentiel de rapprocher WebAssembly de la réalisation de cette vision grâce à l’utilisation d’opérations SIMD et d’architectures multicœurs.
  • Les premières implémentations des propositions ont été utilisées pour des tâches intensives en calcul (apprentissage automatique, bioinformatique, calcul scientifique), avec une amélioration significative des performances observée.
  • Les propositions sont mises en œuvre par un nombre croissant d’exécutables de navigateur et non-navigateur et poursuivent leur chemin ascendant dans le processus de normalisation.

Des efforts récents ont montré comment une instruction unique, le parallélisme de données multiples (SIMD) et le multithreading peuvent radicalement améliorer le profil de performance des logiciels portés sur WebAssembly pour une exécution dans des environnements de navigateur et non-navigateur. Cependant, la prise en charge de SIMD et du multithreading est inégale entre les plates-formes et est encore expérimentale.

Ann Yuan et Marat Dukhan, Développeur de logiciels chez Google, a expliqué comment les instructions SIMD et le multithreading fonctionnent en septembre de l’année dernière a entraîné une amélioration de la vitesse 10x dans le backend TensorFlow WebAssembly. Le couple a donné les données de performance suivantes pour le MobileNet V2, un modèle de taille moyenne avec 3,5 millions de paramètres et environ 300 millions d’opérations de multiplication:

TensorFlow.js est une bibliothèque d’apprentissage automatique JavaScript open source pour la formation et le déploiement de modèles dans le navigateur et sur Node.js. MobileNet V2 est une famille d’architectures de réseau neuronal pour un appareil efficace Classification des images, Détection et segmentation. Le module TensorFlow utilisé par MobileNet V2 contient une instance formée du réseau. Le backend WebAssembly TensorFlow est un Alternative au backend WebGLCela se traduit par une exécution rapide du processeur avec des changements de code minimes et améliore les performances sur les appareils mobiles moins chers qui peuvent ne pas prendre en charge WebGL ou avoir un GPU lent.

SIMD et le multithreading sont pris en charge dans TensorFlow 2.3.0 et versions ultérieures. La prise en charge inégale des fonctions sur les temps d’exécution conduit à trois versions binaires qui couvrent les scénarios dans lesquels une partie ou aucune des deux technologies est disponible. Les lecteurs intéressés par l’évaluation de l’amélioration des performances du point de vue de l’utilisateur peuvent comparer une version optimisée (avec le nouveau backend Wasm) vs. le binaire non optimisé avec SIMD désactivé et multithreading (les utilisateurs de Chrome doivent activer l’indicateur SIMD expérimental –#enable-webassembly-simd). Sur l’ordinateur sur lequel ce morceau a été écrit, la version optimisée avait deux fois plus d’images par seconde (environ 50 ips) que la version non optimisée.

Alors que SIMD se marie bien avec le multithreading, les gains de performances que chacun permet sont indépendants. Alors que le multithreading génère des performances supplémentaires grâce à l’utilisation d’architectures multicœurs, SIMD est lié à une commande à processeur unique. Les benchmarks TensorFlow Wasm mentionnés précédemment montrent que SIMD est responsable d’un facteur d’amélioration des performances de 1,7 à 4,5 par rapport au vanilla wasm, tandis que le multithreading provoque une accélération supplémentaire de 1,8 à 2,9 fois.

Google Research a présenté certaines applications avec des calculs complexes (Suivi des mains, Numérisation de documents, reconnaissance de carte de crédit) que le La bibliothèque de vision par ordinateur d’OpenCV s’accélère avec WebAssembly SIMD.Thomas Nattestad, Google V8 Product Manager, expliqué plus tôt événement web.dev LIVE comme l’application de visioconférence Zoom utilise SIMD pour remplacer l’arrière-plan réel de l’utilisateur avec un arrière-plan virtuel. Robert Aboukhalil, un développeur de logiciels bioinformatiques de la société de tests génétiques médicaux Invitae, a récemment annoncé que SIMD est largement utilisé dans Génomique– dans des outils qui alignent les séquences d’ADN sur un génome, y compris SSW, noeud papillon2, et minimap2. Aboukhalil a expérimenté le portage de SSW sur Wasm et l’a commenté Différence de performances significative avec SIMD activé lors de l’alignement de courtes séquences d’ADN sur le génome de référence du Phage lambda::

Les résultats sont impressionnants: sans WebAssembly SIMD, le code dans le navigateur est des centaines de fois plus lent que dans la ligne de commande:

(La source: Article de blog moyen)

En juin 2019 comme Wasmer a été le premier runtime Wasm à prendre entièrement en charge WASI et SIMD. Nick Lewycky, Directeur général de LLVM, a comparé les profils de performance natifs SIMD, Wasmer-SIMD et Wasmer-non-SIMD pour le Émulation de la physique des particules::

Voici les temps d’exécution de notre simulation physique:

Il est temps d’exécuter le programme d’émulation de particules (plus bas c’est mieux)

Comme vous pouvez le voir, la vitesse d’exécution du SIMD dans l’exécutable natif est presque la même par rapport à son exécution avec Wasmer!

Nous avons déjà mentionné que SIMD signifie Single Instruction, Multiple Data. Comme son nom l’indique, SIMD permet d’effectuer la même opération en une seule instruction sur plusieurs données. Par exemple, les registres SIMD 128 bits peuvent multiplier quatre nombres 32 bits en une seule instruction au lieu d’utiliser quatre instructions numériques 32 bits. Le parallélisme mis en œuvre par le processeur exécutant l’instruction SIMD se traduit par un meilleur profil de performance (amélioré d’un maximum de 4x) par rapport à l’exécution séquentielle de quatre instructions.

SIMD n’est pas nouveau. Hewlett-Packard a présenté les instructions pour les eXtensions d’accélération multimédia dans Ordinateurs de bureau PA-RISC en 1994 à Accélérez le décodage MPEG. Intel a fait de même avec ses extensions MMX pour cela x86 Architecture en 1996.

SIMD n’est pas limité à une longueur de données spécifique. le Extensions vectorielles avancées (AVX) pour l’architecture de jeu d’instructions x86 fournissent des registres de 256 bits, tandis que AVX512 fournir des registres de 512 bits. ARM a introduit l’architecture de jeu d’instructions SIME avec extension vectorielle évolutive (SVE), dans laquelle la taille des registres n’est pas connue au moment de la compilation et dépend du matériel. le Proposition SIMD WebAssembly ne traite que des données de 128 bits. Il contient un sous-ensemble d’opérations qui peuvent être portées vers des architectures de jeu d’instructions SIMD communes (EST UN). Un nouveau est introduit avec la proposition SIMA pour WebAssembly à largeur fixe v128 Type de valeur. Dans un (n contexte emscriptla multiplication de deux tableaux peut être stockée dans un troisième comme suit:


/* */
#include <wasm_simd128.h>

void multiply_arrays(int* out, int* in_a, int* in_b, int size) {
  for (int i = 0; i < size; i += 4) {
    v128_t a = wasm_v128_load(&in_a[i]);
    v128_t b = wasm_v128_load(&in_b[i]);
    v128_t prod = wasm_i32x4_mul(a, b);
    wasm_v128_store(&out[i], prod);
  }
}

Les chaînes d’outils, cependant, s’efforcent d’utiliser lorsque cela est possible optimisations de vectorisation automatique. Avec LLVM, il est possible d’utiliser des constructions de programmation standard et de les convertir en instructions SIMD par le compilateur. La multiplication de tableau précédente pourrait donc s’écrire comme suit:


void multiply_arrays(int* out, int* in_a, int* in_b, int size) {
  for (int i = 0; i < size; i++) {
    out[i] = in_a[i] * in_b[i];
  }
}

Comme SIMD ne peut appliquer qu’une seule opération à plusieurs éléments de données, il est particulièrement adapté aux calculs qui consistent en grande partie en opérations sur des vecteurs. Le blog des développeurs Apple a expliqué comment utiliser une bibliothèque SIMD 128 bits calculs généraux pour les vecteurs, les matrices et les quaternions qui surviennent dans la programmation graphique 3D. Avec le multithreading, les développeurs peuvent utiliser des architectures multicœurs pour exécuter des tâches en parallèle, pas seulement simultanément. SIMD et le parallélisme multithreading ont été utilisés pour le traitement d’image, audio et vidéo. et en applications cryptographiques.

La prise en charge SIMD pour WebAssembly est encore expérimentale dans les environnements de navigateur. Aucun navigateur ne l’active par défaut. Cependant, les développeurs peuvent l’activer en modifiant les indicateurs dans les navigateurs Chrome et Firefox. Fils de WebAssembly (et Atomique) sont est pris en charge dans Evergreen Chrome et Firefox. Aboukhalil indique la nécessité de prévoir que les fonctionnalités souhaitées ne seront pas prises en charge:

Notez, cependant, que si SIMD n’est pas activé, votre application plantera simplement. Pour résoudre ce problème, vous pouvez compiler deux versions de votre application: une avec SIMD et une sans. Ensuite, vous pouvez utiliser Détection des fonctionnalités Wasm pour charger la version correcte. Assurez-vous simplement de ne pas utiliser trop de nouvelles fonctionnalités ou vous obtiendrez beaucoup de permutations de votre application.

Dans les environnements sans navigateur, les environnements d’exécution Wasmer et Wasmtime offrent la fonction via un --enable-simd Possibilité. Wasmer en a un aussi --enable-threads Option pour activer le multithreading. La simulation de physique des particules susmentionnée peut être réalisée avec Wasmer comme suit:


wasmer run --backend=llvm --enable-simd particle-repel-simd.wasm

La proposition de threads WebAssembly est en Niveau 2Autrement dit, le projet de spécification est complet et contient au moins une implémentation. La proposition SIMD WebAssembly est en cours niveau 3. Deepti Gandluri et Thomas Lively mentionnés dans un article de blog travaux futurs possibles Cela tire parti des opérations SIMD de largeur plus grande ou variable offertes par certaines architectures de jeu d’instructions:

Le SIMD à largeur fixe offre des gains de performances significatifs par rapport au scalaire, mais n’utilise pas efficacement les opérations vectorielles de plus grande largeur disponibles dans le matériel moderne. Au fur et à mesure que la proposition actuelle progresse, des travaux prospectifs sont en cours pour déterminer la faisabilité d’étendre la proposition à des opérations plus larges.

WebAssembly SIMD et le multithreading sont des éléments clés dans la réalisation de la vision de WebAssembly de créer des programmes qui s’exécutent à des vitesses natives sur une variété de plates-formes. WebAssembly aborde sa vision en implémentant des suggestions, affine les suites de tests et les spécifications, et sollicite les commentaires critiques des premières expériences. Les premiers utilisateurs ont déjà présenté des applications non triviales de la technologie avec des gains de performances encourageants. Il sera intéressant de voir comment le standard WebAssembly évoluera en 2021, quelles applications sont déclenchées par les performances plus élevées et comment les nouvelles avancées peuvent être intégrées sans la complexité que les développeurs doivent gérer pour s’aligner sur WebAssembly.augmenter excessivement.

A propos de l’auteur

Bruno Couriol est titulaire d’un MSc en Télécommunications, d’un BSC en Mathématiques et d’un MBA de l’INSEAD. En commençant par Accenture, il a passé la majeure partie de sa carrière en tant que consultant à aider les grandes entreprises à résoudre leurs problèmes stratégiques, organisationnels et techniques critiques. Ces dernières années, il s’est concentré sur l’intersection des affaires, de la technologie et de l’entrepreneuriat.





Source link

Recent Posts