Question

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

Était-ce utile?

La solution

De nombreux processeurs ont un "vecteur". ou " SIMD " jeux d'instructions qui appliquent la même opération simultanément à deux, quatre ou plusieurs données. Les puces x86 modernes ont les instructions SSE, beaucoup de puces PPC ont les balises "Altivec". instructions, et même certaines puces ARM ont un jeu d’instructions vectorielles appelé NEON.

" Vectorisation " (simplifié) 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, il 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 pourriez simplement faire abstraction de la boucle et décrire le fonctionnement sur des tableaux au lieu des éléments qui les composent)

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 vectoriser automatiquement 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.

Autres conseils

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];
}

Il fait référence à la possibilité d'effectuer une opération mathématique unique 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 vectorielle, grâce à des technologies telles que SSE d'Intel. Les GPU offrent également une forme d’arithmétique vectorisée.

La

vectorisation est largement utilisée dans l'informatique scientifique, où de grandes quantités de données doivent être traitées efficacement.

Dans les applications de programmation réelles, je sais qu’elles sont utilisées dans NUMPY (pas sur d’autre chose).

Numpy (package de calcul scientifique en python) utilise la vectorisation pour une manipulation rapide du tableau à n dimensions, généralement plus lent si des options python intégrées le gèrent pour le traitement des tableaux.

Bien que de nombreuses explications soient disponibles, VOICI CE QUE LA VECTORISATION EST DÉFINIE PAR LA PAGE DE LA DOCUMENTATION NUMPY

La vectorisation décrit l’absence de boucle explicite, d’indexation, etc., dans le code - cela se produit, bien sûr, juste dans les coulisses & # 8221; en C optimisé, 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 bogues

  3. le code ressemble plus à la notation mathématique standard (facilitant, de manière générale, à coder correctement constructions)

  4. La vectorisation
  5. se traduit par plus & # 8220; Pythonic & # 8221; code. Sans pour autant vectorisation, notre code serait jonché d’inefficaces et inefficaces difficile à lire pour les boucles.

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 en tirons avantage en remodelant nos données de manière à pouvoir effectuer des opérations SIMD sur celui-ci et à accélérer le programme.

Le seul problème avec la vectorisation concerne les conditions de traitement. 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 soit.

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 à l'aide de 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.

Voir les deux réponses ci-dessus. Je voulais simplement ajouter que la vectorisation est motivée par le fait que ces opérations peuvent facilement être réalisées en parallèle par des superordinateurs et des multi-processeurs, ce qui permet de réaliser de gros gains de performances. Sur les ordinateurs à processeur unique, les performances ne seront pas améliorées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top