Várias vezes agora, encontrei esse termo no matlab, fortran ... em outro ... mas nunca encontrei uma explicação sobre o que isso significa e o que faz? Então, eu estou perguntando aqui, o que é vetorização e o que significa, por exemplo, que "um loop é vetorizado"?
vectorization
Thomas Geritzma
fonte
fonte
Respostas:
Muitas CPUs possuem conjuntos de instruções "vetor" ou "SIMD" que aplicam a mesma operação simultaneamente a dois, quatro ou mais dados. Os chips x86 modernos têm as instruções SSE, muitos chips PPC têm as instruções "Altivec" e até alguns chips ARM têm um conjunto de instruções vetoriais, chamado NEON.
"Vetorização" (simplificado) é o processo de reescrever um loop para que, em vez de processar um único elemento de uma matriz N vezes, processe (digamos) 4 elementos da matriz simultaneamente N / 4 vezes.
(Escolhi 4 porque é mais provável que o hardware moderno ofereça suporte direto; o termo "vetorização" também é usado para descrever uma transformação de software de nível superior, na qual você pode abstrair completamente o loop e descrever a operação em matrizes em vez dos elementos que os compõem)
A diferença entre vetorização e desenrolamento de loop: Considere o seguinte loop muito simples que adiciona os elementos de duas matrizes e armazena os resultados em uma terceira matriz.
Desenrolar esse loop o transformaria em algo assim:
A vetorização, por outro lado, produz algo como isto:
Onde "addFourThingsAtOnceAndStoreResult" é um espaço reservado para quaisquer intrínsecos que seu compilador usa para especificar instruções de vetor. Observe que alguns compiladores são capazes de vetorizar automaticamente loops muito simples como esse, que geralmente podem ser ativados por meio de uma opção de compilação. Algoritmos mais complexos ainda precisam da ajuda do programador para gerar um bom código vetorial.
fonte
Vetorização é o termo para converter um programa escalar em um programa vetorial. Programas vetorizados podem executar várias operações a partir de uma única instrução, enquanto escalar pode operar apenas em pares de operandos de uma só vez.
Da wikipedia :
Abordagem escalar:
Abordagem vetorizada:
fonte
Refere-se à capacidade de executar uma operação matemática única em uma lista - ou "vetor" - de números em uma única etapa. Você o vê frequentemente com o Fortran porque está associado à computação científica, associada à supercomputação, onde a aritmética vetorizada apareceu pela primeira vez. Atualmente, quase todas as CPUs de desktop oferecem alguma forma de aritmética vetorizada, através de tecnologias como o SSE da Intel. As GPUs também oferecem uma forma de aritmética vetorizada.
fonte
A vetorização é muito usada na computação científica, em que grandes quantidades de dados precisam ser processadas com eficiência.
Na aplicação de programação real, eu sei que é usado em NUMPY (não tenho certeza de outra coisa).
O Numpy (pacote para computação científica em python), usa vetorização para manipulação rápida de matriz n-dimensional, que geralmente é mais lenta se feita com opções de python embutidas para manipular matrizes.
Embora existam toneladas de explicações, aqui está a definição de que a vetor é definida na página de documentação NUMPY
A vetorização descreve a ausência de loop, indexação, etc. explícitos no código - essas coisas estão ocorrendo, é claro, apenas "nos bastidores" em código C otimizado e pré-compilado. O código vetorizado tem muitas vantagens, entre as quais:
código vetorizado é mais conciso e fácil de ler
menos linhas de código geralmente significa menos erros
o código se assemelha mais à notação matemática padrão (tornando mais fácil, normalmente, codificar corretamente construções matemáticas)
a vetorização resulta em um código mais “Pythonic”. Sem vetorização, nosso código seria repleto de ineficientes e difíceis de ler para loops.
fonte
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.
ou podemos modelar a condição em operação aritmética, criando um vetor de condição c,
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.
fonte
Pelas pessoas da Intel, acho que é fácil de entender.
Link https://software.intel.com/pt-br/articles/vectorization-a-key-tool-to-improve-performance-on-modern-cpus
Em Java, há uma opção para isso ser incluído no Jdk 15 de 2020 ou atrasado no JDK 16 em 2021.
https://bugs.openjdk.java.net/browse/JDK-8201271
fonte
Veja as duas respostas acima. Eu só queria acrescentar que o motivo para querer fazer a vetorização é que essas operações podem ser facilmente executadas em paralelo por supercomputadores e multiprocessadores, gerando um grande ganho de desempenho. Em computadores com processador único, não haverá ganho de desempenho.
fonte