O que é"Vectorização"?

Já encontrei este termo várias vezes em matlab, fortran ... outro ... mas nunca encontrei uma explicação o que significa e o que faz? Então eu estou perguntando aqui, o que é vetorização, e o que significa, por exemplo, que "um laço é vetorizado" ?

Author: Thomas Geritzma, 2009-09-14

5 answers

Muitos CPUs têm conjuntos de instruções" vectoriais "ou" SIMD " que aplicam a mesma operação simultaneamente a dois, quatro ou mais pedaços de dados. Chips x86 modernos têm as instruções SSE, muitos chips PPC têm as instruções Altivec, e mesmo alguns chips ARM têm um conjunto de instruções vetoriais, chamado NEON.

"Vectorização" (simplificado) é o processo de reescrever um loop de modo que, em vez de processar um único elemento de um array N Vezes, ele processa (digamos) 4 elementos do array simultaneamente n / 4 vezes.

(eu escolhi 4 porque é o que o hardware moderno tem mais probabilidade de suportar directamente; o termo "Vectorização" também é usado para descrever uma transformação de software de nível superior onde você pode simplesmente abstrair o loop completamente e apenas descrever a operação em arrays em vez dos elementos que os compõem)


A diferença entre a Vectorização e a rolagem em laço: Considere o seguinte loop muito simples que adiciona os elementos de duas matrizes e armazena os resultados para uma terceira matriz.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];
Desbloquear este loop transformava-o em algo assim.
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];
}
Por outro lado, a Vectorização produz algo assim:
for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Where "addfourthingsatonce andstoresult" is a placeholder for whatever(s) intrinsic (s) your compiler uses to specify vector instructions. Note - se que alguns compiladores são capazes de auto-vetorizar loops muito simples como este, que muitas vezes podem ser activados através de um opção compilar. Algoritmos mais complexos ainda requerem ajuda do programador para gerar um bom código vetorial.

 118
Author: Stephen Canon, 2009-09-14 17:01:39

Vectorização é o termo para converter um programa escalar para um programa vetorial. Programas vetorizados podem executar várias operações a partir de uma única instrução, enquanto scalar só pode operar em pares de operandos ao mesmo tempo.

Da Wikipédia:

Abordagem escalar:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

Abordagem vectorizada:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}
 20
Author: Anders, 2009-09-14 15:13:43

Refere-se à capacidade de fazer uma única operação matemática numa lista -- ou "vector" -- de números num único passo. Você vê isso muitas vezes com Fortran porque isso está associado com computação científica, que está associado com supercomputação, onde aritmética vetorizada apareceu pela primeira vez. Hoje em dia, quase todos os CPUs desktop oferecem alguma forma de aritmética vetorizada, através de tecnologias como a SSE da Intel. GPUs também oferece uma forma de aritmética vetorizada.

 5
Author: Warren Young, 2009-09-14 15:09:02

A Vectorização é muito utilizada na computação científica, onde enormes pedaços de dados precisam ser processados de forma eficiente.

Em aplicação de programação real , eu sei que é usado em NUMPY(Não tenho certeza de outra).

Numpy (pacote para computação científica em python) , usa Vectorização para manipulação rápida de matriz n-dimensional ,que geralmente é mais lento se for feito com opções python incorporadas para lidar com arrays.

Apesar de muitas explicações estão lá fora, Aqui está o que Vectorização é definido como em Página de documentação NUMPY

A Vectorização descreve a ausência de qualquer laço explícito, indexação, etc., no código - essas coisas estão ocorrendo, é claro, apenas "nos bastidores" em código C otimizado e pré-compilado. O código vectorizado tem muitas vantagens, entre as quais:

  1. Código vectorizado é mais conciso e mais fácil de ler

  2. Menos linhas de código geralmente significa Menos Erros

  3. O código assemelha-se mais à notação matemática padrão (tornando mais fácil, normalmente, codificar correctamente a matemática construções)

  4. Vectorização resulta em Mais código "Pythonic". Sem Vectorização, o nosso código estaria repleto de ineficientes e difícil de ler para loops.

 3
Author: bad programmer, 2017-05-03 15:37:03

Veja as duas respostas acima. Eu só queria acrescentar que a razão para querer fazer Vectorização é que essas operações podem ser facilmente realizadas em paraell por supercomputadores e multi-processadores, gerando um grande ganho de desempenho. Em computadores de processador único não haverá ganho de desempenho.

 -3
Author: Larry Watanabe, 2009-09-14 15:13:11