Pergunta

Várias vezes agora, eu encontrei este termo em Matlab, fortran ... algum outro ... mas eu nunca encontrei uma explicação O que significa, eo que ele faz? Então eu estou pedindo aqui, o que é vetorização, e o que significa por exemplo, que "um loop é vetorizado"?

Foi útil?

Solução

Muitas CPUs têm "vector" ou "SIMD" conjuntos de instruções que se aplicam a mesma operação simultaneamente para dois, quatro, ou mais partes de dados. chips x86 modernos têm as instruções SSE, muitos chips PPC tem as instruções de "Altivec", e até mesmo alguns chips ARM ter um conjunto de instruções vetor, chamado NEON.

"Vectorization" (simplificada) é o processo de reescrever um laço, de forma que, em vez de processar um único elemento de uma vezes matriz N, processa (por exemplo) 4 elementos da matriz simultaneamente N / 4 vezes.

(eu escolhi 4 porque é o que é mais provável que diretamente suportam hardware moderno, o termo "vetorização" também é usado para descrever uma transformação software de nível superior, onde você pode simplesmente abstrair o circuito completamente e apenas descrever a operar em matrizes vez dos elementos que os compõem)


A diferença entre vectorização e laço desenrolamento: Considere o seguinte circuito muito simples que adiciona os elementos de duas matrizes e armazena os resultados de uma terceira matriz.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

Desenrolando este ciclo iria transformá-lo em algo como isto:

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];
}

Vetorizar que, por outro lado, produz algo como isto:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Onde "addFourThingsAtOnceAndStoreResult" é um espaço reservado para quaisquer que sejam intrínsecas (s) seus usos compilador para especificar instruções de vetor. Note-se que alguns compiladores são capazes de auto vectorize laços muito simples como este, que muitas vezes podem ser ativados através de uma opção de compilação. algoritmos mais complexos ainda necessitam de ajuda do programador para gerar código bom vetor.

Outras dicas

Vectorization é o termo para converter um programa de escalar a um programa do vetor. programas vectorized pode executar várias operações a partir de uma única instrução, enquanto escalar só pode operar em pares de operandos ao mesmo tempo.

A partir wikipedia :

abordagem escalar:

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

abordagem Vectorized:

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

Trata-se de um a capacidade de fazer operações matemáticas simples em uma lista - ou "vector" - de números em uma única etapa. Você vê-lo muitas vezes com Fortran porque isso está associado com computação científica, que está associado com supercomputação, onde vetorizado aritmética apareceu pela primeira vez. Hoje em dia quase todas as CPUs de desktop oferecem algum tipo de aritmética vetorizado, através de tecnologias como SSE da Intel. GPUs oferecem também uma forma de vetorizado aritmética.

Vectorization é usado muito na computação científica, onde enormes pedaços de necessidades de dados a serem processados ??de forma eficiente.

Na aplicação de programação de verdade, eu sei que é usado em Numpy (não tenho certeza de outra pessoa).

Numpy (pacote para computação científica em python), usos vectorização para a manipulação rápida da matriz n-dimensional, que geralmente é mais lento se feito com opções python embutido para a manipulação de matrizes.

apesar de toneladas de explicação estão lá fora, aqui está o vetorização é definida como no Numpy DOCUMENTAÇÃO página

Vectorization descreve a ausência de qualquer looping explícita, indexação, etc., no código - essas coisas estão ocorrendo, é claro, apenas “nos bastidores” em otimizado, código C pré-compilados. código vetorizado tem muitas vantagens, entre as quais:

  1. código vetorizado é mais conciso e fácil de ler

  2. menos linhas de código geralmente significa menos erros

  3. O código mais se assemelha a notação matemática padrão (Tornando-o mais fácil, tipicamente, para corretamente código matemático construções)

  4. vetorização resulta em código mais “Pythonic”. Sem vetorização, o nosso código seria repleta de ineficiente e difícil de ler para loops.

Vectorization, 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 realizam mesma operação em vários dados em uma instrução. por exemplo. AVX512 significa que pode operar em 16 valores inteiros (4 bytes) de cada vez. O que isto significa é que se você tiver vector de 16 números inteiros e você quiser dobrar esse valor em cada um inteiros e em seguida, adicione 10 a ele. Você pode valores de carga sobre a registo geral [a, b, c] 16 vezes e executar mesma operação ou você pode executar mesma operação, carregando todos os 16 valores para registradores SIMD [XMM, ymm] e executar a operação uma vez. Isso permite acelerar a computação de dados vetoriais.

Em vetorização usamos isso a nosso favor, por remodelar os nossos dados para que possamos realizar operações SIMD sobre ele e acelerar o programa.

Apenas problema com vetorização está a lidar com condições. Como as condições ramificar o fluxo de execução. Isto pode ser tratado por mascaramento. Ao modelar a condição em uma operação aritmética. por exemplo. se queremos adicionar 10 a valor se ele é maior do que 100. nós pode.

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

ou podemos modelar a condição em operação aritmética criando uma condição vetor c,

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

Este é um exemplo muito trivial embora ... assim, c é o nosso vector de máscara que usamos para executar a operação binária com base em seu valor. Este evitar ramificação do fluxo de execução e permite vetorização.

Vectorization é tão importante quanto paralelização. Assim, devemos fazer uso dela como muito possível. Todos os processadores dias modernos têm instruções SIMD para cargas de trabalho de computação pesados. Podemos otimizar o nosso código para usar estas instruções SIMD usando vetorização, este é semelhante ao parrallelizing nosso código para ser executado em múltiplos núcleos disponíveis nos processadores modernos.

Eu gostaria de ficar com a menção de OpenMP, que permite que yo vectorize o código usando pragmas. Eu considerá-lo como um bom ponto de partida. Mesmo pode ser dito para OpenACC.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top