Plusieurs fois maintenant, j'ai rencontré ce terme dans matlab, fortran ... un autre ... mais je n'ai jamais trouvé d'explication qu'est-ce que cela signifie, et qu'est-ce que cela signifie? Je demande donc ici, qu'est-ce que la vectorisation, et que signifie par exemple «une boucle est vectorisée»?
vectorization
Thomas Geritzma
la source
la source
Réponses:
De nombreuses CPU ont des jeux d'instructions "vectoriels" ou "SIMD" qui appliquent la même opération simultanément à deux, quatre ou plus de données. Les puces x86 modernes ont les instructions SSE, de nombreuses puces PPC ont les instructions "Altivec", et même certaines puces ARM ont un jeu d'instructions vectorielles, appelé NEON.
La "vectorisation" (simplifiée) est le processus de réécriture d'une boucle de sorte qu'au lieu de traiter un seul élément d'un tableau N fois, il traite (disons) 4 éléments du tableau simultanément N / 4 fois.
(J'ai choisi 4 parce que c'est ce que le matériel moderne est le plus susceptible de prendre directement en charge; le terme «vectorisation» est également utilisé pour décrire une transformation logicielle de plus haut niveau où vous pourriez simplement résumer complètement la boucle et décrire simplement le fonctionnement sur des tableaux au lieu des éléments qui les composent)
La différence entre la vectorisation et le déroulement de boucle: considérez la boucle très simple suivante qui ajoute les éléments de deux tableaux et stocke les résultats dans un troisième tableau.
Le déroulement de cette boucle la transformerait en quelque chose comme ceci:
Le vectoriser, en revanche, produit quelque chose comme ceci:
Où «addFourThingsAtOnceAndStoreResult» est un espace réservé pour tout élément (s) intrinsèque (s) utilisé par votre compilateur pour spécifier des instructions vectorielles. Notez que certains compilateurs sont capables de vectoriser automatiquement des boucles très simples comme celle-ci, qui peut souvent être activée via une option de compilation. Des algorithmes plus complexes nécessitent toujours l'aide du programmeur pour générer un bon code vectoriel.
la source
La vectorisation est le terme utilisé pour convertir un programme scalaire en programme vectoriel. Les programmes vectorisés peuvent exécuter plusieurs opérations à partir d'une seule instruction, tandis que le scalaire ne peut fonctionner que sur des paires d'opérandes à la fois.
De wikipedia :
Approche scalaire:
Approche vectorisée:
la source
Il fait référence à la capacité d'effectuer une seule opération mathématique sur une liste - ou «vecteur» - de nombres en une seule étape. Vous le voyez souvent avec Fortran parce que cela est associé au calcul scientifique, qui est associé au supercalcul, où l'arithmétique vectorisée est apparue pour la première fois. De nos jours, presque tous les processeurs de bureau offrent une forme d'arithmétique vectorisée, grâce à des technologies telles que le SSE d'Intel. Les GPU offrent également une forme d'arithmétique vectorisée.
la source
La vectorisation est largement utilisée dans le calcul scientifique où d'énormes morceaux de données doivent être traités efficacement.
Dans une vraie application de programmation, je sais qu'il est utilisé dans NUMPY (pas sûr d'autre).
Numpy (package pour le calcul scientifique en python), utilise la vectorisation pour une manipulation rapide d'un tableau à n dimensions, qui est généralement plus lent si cela est fait avec des options python intégrées pour la gestion des tableaux.
bien que des tonnes d'explications soient disponibles, VOICI CE QUE LA VECTORISATION EST DÉFINIE COMME DANS LA PAGE DE DOCUMENTATION NUMPY
La vectorisation décrit l'absence de boucle explicite, d'indexation, etc. dans le code - ces choses se déroulent, bien sûr, juste «en coulisse» dans un code C optimisé et précompilé. Le code vectorisé présente de nombreux avantages, parmi lesquels:
le code vectorisé est plus concis et plus facile à lire
moins de lignes de code signifie généralement moins de bogues
le code ressemble plus étroitement à la notation mathématique standard (ce qui facilite généralement la codification correcte des constructions mathématiques)
la vectorisation donne plus de code «pythonique». Sans vectorisation, notre code serait parsemé de boucles for inefficaces et difficiles à lire.
la source
La vectorisation, en termes simples, signifie optimiser l'algorithme afin qu'il puisse utiliser les instructions SIMD dans les processeurs.
AVX, AVX2 et AVX512 sont les jeux d'instructions (Intel) qui effectuent la même opération sur plusieurs données en une seule instruction. par exemple. AVX512 signifie que vous pouvez utiliser 16 valeurs entières (4 octets) à la fois. Cela signifie que si vous avez un vecteur de 16 entiers et que vous voulez doubler cette valeur dans chaque entier, puis y ajouter 10. Vous pouvez soit charger des valeurs sur le registre général [a, b, c] 16 fois et effectuer la même opération, soit effectuer la même opération en chargeant les 16 valeurs sur les registres SIMD [xmm, ymm] et effectuer l'opération une fois. Cela permet d'accélérer le calcul des données vectorielles.
Dans la vectorisation, nous utilisons cela à notre avantage, en remodelant nos données afin que nous puissions effectuer des opérations SIMD dessus et accélérer le programme.
Le seul problème de vectorisation concerne les conditions de manipulation. Parce que les conditions branchent le flux de l'exécution. Cela peut être géré par masquage. En modélisant la condition en une opération arithmétique. par exemple. si nous voulons ajouter 10 à la valeur si elle est supérieure à 100. nous pouvons non plus.
ou nous pouvons modéliser la condition en opération arithmétique créant un vecteur de condition c,
c'est un exemple très trivial cependant ... ainsi, c est notre vecteur de masquage que nous utilisons pour effectuer une opération binaire basée sur sa valeur. Cela évite le branchement du flux d'exécution et permet la vectorisation.
La vectorisation est aussi importante que la parallélisation. Ainsi, nous devons en faire autant que possible. Tous les processeurs modernes ont des instructions SIMD pour les charges de travail de calcul lourdes. Nous pouvons optimiser notre code pour utiliser ces instructions SIMD en utilisant la vectorisation, cela revient à paralléliser notre code pour qu'il s'exécute sur plusieurs cœurs disponibles sur les processeurs modernes.
Je voudrais repartir avec la mention d'OpenMP, qui vous permet de vectoriser le code à l'aide de pragmas. Je considère cela comme un bon point de départ. On peut dire la même chose d'OpenACC.
la source
Par les gens d'Intel, je pense que c'est facile à comprendre.
Lien https://software.intel.com/en-us/articles/vectorization-a-key-tool-to-improve-performance-on-modern-cpus
En Java, il existe une option pour que cela soit inclus dans Jdk 15 de 2020 ou tardivement au JDK 16 à 2021.
https://bugs.openjdk.java.net/browse/JDK-8201271
L'API Vector est le premier JEP proposé pour cibler dans JDK 16.
https://bugs.openjdk.java.net/secure/Dashboard.jspa?selectPageId=19517
la source
Voir les deux réponses ci-dessus. Je voulais juste ajouter que la raison de vouloir faire de la vectorisation est que ces opérations peuvent facilement être effectuées en paraell par des supercalculateurs et des multi-processeurs, ce qui donne un gros gain de performances. Sur les ordinateurs à processeur unique, il n'y aura aucun gain de performances.
la source