Qu'est-ce que "vectorisation"?
Plusieurs fois maintenant, j'ai rencontré ce terme dans matlab, fortran ... certains autres ... mais je ne l'ai jamais trouvé une explication qu'est-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, que "une boucle est vectorisée"?
5 réponses
De nombreux processeurs ont des ensembles d'instructions" vector "ou" SIMD " qui appliquent la même opération simultanément à deux, quatre ou plusieurs 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.
"Vectorisation" (simplifié) 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 supporter directement; le terme "vectorisation" est également utilisé pour décrire une transformation logicielle de niveau supérieur où vous pouvez simplement abstraire complètement la boucle et décrire simplement fonctionner sur des tableaux au lieu des é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];
Le déroulement de 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];
}
La vectoriser, d'autre part, 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 tout(s) intrinsèque (s) 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 un option de compilation. Des algorithmes plus complexes nécessitent encore l'aide du programmeur pour générer un bon code vectoriel.
La vectorisation est le terme utilisé pour convertir un programme scalaire en un programme vectoriel. Les programmes vectorisés peuvent exécuter plusieurs opérations à partir d'une seule instruction, alors que scalar ne peut fonctionner que sur des paires d'opérandes à la fois.
À Partir 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 se réfère à la capacité de faire seule opération mathématique sur une liste -- ou "vecteur" -- de numéros en une seule étape. Vous le voyez souvent avec Fortran parce que c'est associé à l'informatique scientifique, qui est associée 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 certaine forme d'arithmétique vectorisée, 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ù d'énormes morceaux de données doivent être traités efficacement.
Dans une application de programmation réelle, je sais qu'elle est utilisée dans NUMPY (pas sûr d'autre chose).
Numpy (package pour l'informatique scientifique en python) , utilise vectorisation pour une manipulation rapide du tableau n-dimensionnel, qui est généralement plus lente si elle est faite avec des options Python intégrées pour gérer les tableaux.
Bien que des tonnes d'explications soient là-bas, voici ce que vectorisation est défini comme dans NUMPY DOCUMENTATION PAGE
La vectorisation décrit l'absence de boucle explicite, d'indexation,etc., dans le code-ces choses se déroulent, bien sûr, juste "dans les coulisses" dans le code C optimisé, pré-compilé. Le code vectorisé présente de nombreux avantages, parmi lesquels:
Vectorisé code est plus concis et plus facile à lire
Moins de lignes de code signifie généralement moins bugs
-
Le code ressemble plus étroitement à la notation mathématique standard (ce qui rend plus facile, généralement, de coder correctement mathématique construction)
La vectorisation entraîne plus de code "pythonique". Sans vectorisation, notre code serait jonché d'inefficaces et difficile à lire pour les boucles.
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 dans paraell par des supercalculateurs et des multi-processeurs, ce qui donne un gros gain de performance. Sur les ordinateurs à processeur unique, il n'y aura pas de gain de performance.