# SIMD

O modelo Single Instruction, Multiple Data (conhecido pelo acrônimo SIMD) é um método de operação de computadores com várias unidades operacionais em computação paralela; onde a mesma comando/instrução é aplicada simultaneamente a diversos dados para produzir mais resultados - modelo adequado para o tratamento de conjuntos regulares de dados como matrizes e vetores trabalhados com um único comando - tecnicamente, sendo uma máquina que aplique a "n" elementos uma determinada instrução e o vetor "t" contenha os elementos a serem processados, "t" terá todos seus elementos calculados "n" vezes mais rápido que uma máquina SISD na mesma tarefa.

## História

As primeiras máquinas SIMD foram os supercomputadores, estas máquinas são também chamadas de “processadores de vetor”, por funcionarem com vetores de comprimento. Depois se tornaram mais freqüentes em computadores pessoais, com o surgimento dos jogos de vídeo em tempo real. Isso criou uma grande demanda para um determinado tipo de poder computacional, fazendo com que os fabricantes migrassem para o SIMD. A primeira implantação ampla de jogos de vídeo foram para as extensões SIMD MMX para a arquitetura x86 da Intel. Depois para a IBM e a Motorola com a AltiVec para a arquitetura POWER, houve várias extensões para ambos os conjuntos de arquiteturas SIMD. Todos estes desenvolvimentos foram orientados para o apoio real, gráficos, tempo e, portanto, vetores orientados de dois, três ou quatro dimensões. Atualmente, um supercomputador quase sempre é um grupo de máquinas MIMD, com instruções SIMD sendo aplicadas com vetores de curto prazo, nas máquinas desktop são usados multiprocessadores MIMD, onde cada processador pode executar instruções Short SIMD. As instruções SIMD foram adicionadas para processadores modernos para melhorar a velocidade de processamento em cálculos envolvendo números de ponto flutuante.

## Arquitetura

Computadores SIMD são utilizados para a resolução de problemas computacionalmente intensivos da área científica e de engenharia, em que existem estruturas de dados como vetores e matrizes. Essas máquinas são caracterizadas por possuírem apenas uma unidade de controle que executa uma instrução de cada vez, mas cada instrução opera sobre vários dados. É uma classe importante de processadores, devido a fatores como: simplicidade de conceitos e programação, regularidade da estrutura, facilidade de escalabilidade em tamanho e desempenho, aplicação direta em uma série de aplicações que requerem paralelismo para obter o desempenho necessário , os processadores executam sincronizadamente a mesma instrução sobre dados diferentes.Utiliza-se vários processadores especiais muito mais simples, organizados em geral de forma matricial. Muito eficiente em aplicações onde cada processador pode ser associado a uma sub-matriz independente de dados (processamento de imagens, algoritmos matemáticos, etc.).

### Tipos de arquiteturas

Existem duas categorias de máquinas SIMD: processadores matriciais (array processors) e processadores vetoriais (vector processors). Os processadores matriciais não implementam funções escalares e, geralmente, são configurados como periféricos de outras arquiteturas (mainframes e minicomputadores)para a execução da porção vetorial dos programas. Já os processadores vetoriais são mais bem sucedidos comercialmente que os matriciais. Parte do seu sucesso deve-se ao fato de que um processador vetorial é uma arquitetura de uso geral, capaz de executar todas as operações escalares normais. Uma primeira caracterização dos processadores vetoriais diz respeito ao acesso à memória, e a arquiteturas orientadas a registradores e as arquiteturas orientadas à memória. A grande maioria dos computadores vetoriais produzidos a partir de 1980 são orientados a registradores. Quanto às unidades funcionais, os computadores vetoriais podem ser de dois tipos:
* ULAs pipeline;
* ULAs paralelas;
Na prática, poucos computadores vetoriais são construídos com ULAs paralelas, muito mais por razões econômicas do que por razões técnicas. Um projeto com 64ULAs de alta velocidade pode inviabilizar a comercialização, mesmo de um supercomputador (que custa em torno de 10 a 15 milhões de dólares). O método mais utilizado é a combinação de processamento vetorial com arquitetura pipeline. Operações com ponto flutuante são complexas e necessitam de uma série de passos (vários passos? pipeline!) para serem executadas. A realização das operações envolve a comparação dos expoentes, o ajuste dos expoentes, a execução da operação propriamente dita e a normalização do resultado. Uma grande diferença entre a utilização de pipeline em processamento vetorial e em processamento de uso geral é a ausência de desvios na operação vetorial. Desta forma, todos os ciclos são utilizados e não ocorrem paradas (stalls).

## Vantagens

As aplicações que utilizam o SIMD são aquelas em que o mesmo valor está sendo adicionado (ou subtraído) em um grande número de pontos de dados, uma operação comum em muitas aplicações multimídia. Um exemplo seria mudar o brilho de uma imagem. Cada pixel da imagem é composto por três valores para o brilho das porções vermelho, verde e azul da cor. Para alterar o brilho, o RG e os valores de B são lidos da memória, um valor é adicionado (ou subtraído) a partir deles, e os valores resultantes são gravados de volta à memória. Com um processador SIMD, uma série de valores podem ser carregados de uma só vez. Em vez de uma série de instruções, um processador SIMD terá uma única instrução que efetivamente obtém lotes de pixels. Por uma série de razões, isto pode demorar muito menos tempo do que obter cada pixel individualmente, como na concepção tradicional da CPU. Outra vantagem é que os sistemas de SIMD geralmente incluem apenas as instruções que podem ser aplicados a todos os dados em uma única operação. Em outras palavras, se o sistema SIMD funciona através do carregamento de oito pontos de dados de uma só vez, a operação aplicada aos dados acontecerá com todos os oito valores, ao mesmo tempo. O nível de paralelismo em um sistema SIMD é normalmente muito mais elevado.

## Desvantagens

* Nem todos os algoritmos podem ser vetorizados. Por exemplo, um fluxo de controle de tarefas pesadas como análise de código não se beneficiaria com o SIMD.
* A implementação de um algoritmo com as instruções SIMD geralmente requer trabalho humano, a maioria dos compiladores não geram instruções SIMD de um programa C comum.
* Programação com conjuntos de instruções SIMD particulares podem envolver numerosos desafios de baixo nível.

## Software

O desenvolvimento de software para computadores pessoais SIMD inicialmente avançou lentamente. Isto era devido a duas ameaças simultâneas. O primeiro problema foi devido ao fato de que a Intel e a AMD decidiram salvar registros para usar como instruções para a CPU. O segundo problema foi a gestão deficiente dos compiladores. Inicialmente, os compiladores não foram capazes de gerar eficazmente as instruções SIMD e, portanto, muitas vezes os programadores que queriam usar essas instruções foram obrigados a programar em assembly. O software SIMD teve um início lento em máquinas x86, após o melhoramento dos compiladores, a Intel lançou as instruções SSE que resolveram os principais problemas das instruções anteriores do SIMD. Atualmente o software SIMD está se espalhando rapidamente. As unidades computacionais AltiVec usadas pela Apple disponibilizam também instruções SIMD, semelhantes às instruções MMX da Intel. A Apple também coloca ênfase nas instruções SIMD porque muitos de seus programas como o QuickTime e o iTunes usam instruções SIMD.