web-dev-qa-db-fra.com

Qu'est-ce que la "vectorisation"?

Plusieurs fois maintenant, j'ai rencontré ce terme dans matlab, fortran ... un autre ... mais je n'ai jamais trouvé d'explication sur ce que cela signifie et ce qu'il fait. Donc, je demande ici, qu'est-ce que la vectorisation, et qu'est-ce que cela signifie par exemple, "une boucle est vectorisée"?

145
Thomas Geritzma

De nombreux processeurs 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 PPC ont les instructions "Altivec") et même certaines ARM avoir un jeu d'instructions vectorielles, appelé NEON.

La "vectorisation" (simplifiée) est le processus de réécriture d'une boucle de telle sorte qu'au lieu de traiter un seul élément d'un tableau N fois, elle traite (par exemple) 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 supporter directement; le terme "vectorisation" est également utilisé pour décrire une transformation logicielle de niveau supérieur où vous pouvez simplement faire abstraction de la boucle et décrire le fonctionnement sur des tableaux plutôt que sur les éléments qui les composent)


La différence entre la vectorisation et le déroulement de la 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.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

Dérouler cette boucle la transformerait en quelque chose comme ceci:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

En revanche, la vectorisation produit quelque chose comme ceci:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Où "addFourThingsAtOnceAndStoreResult" est un espace réservé pour le ou les éléments intrinsèques que votre compilateur utilise pour spécifier des instructions vectorielles. Notez que certains compilateurs sont capables de auto-vectoriser des boucles très simples comme celle-ci, qui peuvent souvent être activées via une option de compilation. Des algorithmes plus complexes nécessitent toujours l'aide du programmeur pour générer un bon code vectoriel.

174
Stephen Canon

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, alors que scalar ne peut opérer que sur des paires d'opérandes à la fois.

De wikipedia :

Approche scalaire:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

Approche vectorisée:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}
30
Anders

Il fait référence à la capacité d'effectuer une seule opération mathématique sur une liste - ou un "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, via des technologies telles que le SSE d'Intel. Les GPU offrent également une forme d'arithmétique vectorisée.

10
Warren Young

Vectorisation est largement utilisé en informatique scientifique où de gros morceaux de données doivent être traités efficacement.

Dans la vraie application de programmation, je sais que c'est utilisé dans NUMPY (pas sûr des autres).

Numpy (package de calcul scientifique en python), utilise vectorisation pour une manipulation rapide du tableau à n dimensions, généralement plus lent si on le fait avec les options intégrées python pour tableaux de manutention.

bien que des tonnes d'explications soient disponibles, VOICI QUOI VECTORISATION IS DEFINI COMME IN PAGE DE DOCUMENTATION NUMPIE =

La vectorisation décrit l'absence de boucles, d'indexations, etc. explicites dans le code - ces choses se produisent, bien sûr, dans les coulisses d'un code C optimisé et précompilé. Le code vectorisé présente de nombreux avantages, parmi lesquels:

  1. le code vectorisé est plus concis et plus facile à lire

  2. moins de lignes de code signifie généralement moins de bugs

  3. le code ressemble plus à la notation mathématique standard (ce qui permet généralement de coder correctement les constructions mathématiques)

  4. la vectorisation donne plus de code "pythonique". Sans vectorisation, notre code serait encombré d'inefficaces et difficiles à lire pour les boucles.

6
bad programmer

La vectorisation, en termes simples, signifie l'optimisation de 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. pour 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 nombres entiers et que vous voulez doubler cette valeur dans chaque nombre entier, puis y ajouter 10. Vous pouvez charger les valeurs dans le registre général [a, b, c] 16 fois et effectuer la même opération ou effectuer la même opération en chargeant les 16 valeurs dans les registres SIMD [xmm, ymm] et en effectuant l'opération une fois. Cela permet d’accélérer le calcul des données vectorielles.

Dans la vectorisation, nous exploitons cet avantage à notre avantage, en modifiant les données de manière à pouvoir effectuer des opérations SIMD dessus et à accélérer le programme.

Le seul problème avec la vectorisation est la manipulation. Parce que les conditions branchent le flux d'exécution. Ceci peut être manipulé en masquant. En modélisant la condition dans une opération arithmétique. par exemple. si nous voulons ajouter 10 à la valeur si elle est supérieure à 100, nous pouvons le faire non plus.

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

ou nous pouvons modéliser la condition en opération arithmétique créant un vecteur de condition c,

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

c’est un exemple très trivial cependant ... c est donc notre vecteur de masquage que nous utilisons pour effectuer une opération binaire en fonction de sa valeur. Cela évite la création de branches dans le flux d'exécution et permet la vectorisation.

La vectorisation est aussi importante que la parallélisation. Nous devrions donc en tirer parti 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, ce qui revient à parralléliser notre code pour qu'il s'exécute sur plusieurs cœurs disponibles sur les processeurs modernes.

Je voudrais partir avec la mention d'OpenMP, qui vous permet de vectoriser le code à l'aide de pragmas. Je le considère comme un bon point de départ. La même chose peut être dite pour OpenACC.

2
Market Queue