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