A vetorização, em palavras simples, significa otimizar o algoritmo para que ele possa utilizar instruções SIMD nos processadores.
AVX, AVX2 e AVX512 são os conjuntos de instruções (intel) que executam a mesma operação em vários dados em uma instrução. por exemplo. AVX512 significa que você pode operar com 16 valores inteiros (4 bytes) por vez. O que isso significa é que, se você tiver um vetor de 16 números inteiros e quiser duplicar esse valor em cada número inteiro, adicione 10 a ele. Você pode carregar valores no registro geral [a, b, c] 16 vezes e executar a mesma operação ou pode executar a mesma operação carregando todos os 16 valores nos registros SIMD [xmm, ymm] e executar a operação uma vez. Isso permite acelerar o cálculo dos dados vetoriais.
Na vetorização, usamos isso para nossa vantagem, remodelando nossos dados para que possamos executar operações SIMD nele e acelerar o programa.
O único problema com a vetorização é lidar com as condições. Porque as condições ramificam o fluxo de execução. Isso pode ser tratado com mascaramento. Modelando a condição em uma operação aritmética. por exemplo. se quisermos adicionar 10 ao valor, se for maior que 100. também podemos.
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
ou podemos modelar a condição em operação aritmética, criando um vetor de condição c,
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
esse é um exemplo muito trivial ... portanto, c é o nosso vetor de máscara que usamos para executar a operação binária com base em seu valor. Isso evita a ramificação do fluxo de execução e permite a vetorização.
A vetorização é tão importante quanto a paralelização. Portanto, devemos usá-lo o máximo possível. Todos os processadores modernos têm instruções SIMD para cargas de trabalho pesadas de computação. Podemos otimizar nosso código para usar essas instruções SIMD usando vetorização. Isso é semelhante a paralelizar nosso código para executar em vários núcleos disponíveis nos processadores modernos.
Gostaria de sair com a menção do OpenMP, que permite vetorizar o código usando pragmas. Eu considero isso um bom ponto de partida. O mesmo pode ser dito para o OpenACC.