Qual é a diferença entre um processador superescalar e um vetor?

7

Ambos podem processar várias instruções ao mesmo tempo, mas suponho que exista uma diferença fundamental que explica por que existem dois nomes e nós não mudamos apenas para usar sempre os superescalares?

Além disso, se eu entendi corretamente, tanto as instruções escalares quanto as vetoriais estão presentes em uma CPU moderna, então eu suponho que elas não sejam mutuamente exclusivas (instruções escalares como mov ou add serão executadas de forma superescalar e por exemplo ser calculado vetor-em algum tipo de magia negra especial de maneira)?

    
por Luke 21.01.2017 / 17:23

2 respostas

2

Um processador superescalar é capaz de executar múltiplas instruções dentro de um único programa em paralelo. Ele faz isso analisando o fluxo de instruções para determinar quais instruções não dependem umas das outras e tendo várias unidades de execução dentro do processador para fazer o trabalho simultaneamente (por exemplo, várias ALUs ). O suporte ao compilador geralmente não é necessário para otimizar o código para processadores superescalares, pois a funcionalidade é tipicamente implementada inteiramente em hardware. 1

Um processador vetorial contém instruções especificamente projetadas para operar em grupos inteiros de múltiplos valores de dados de uma só vez (chamados arrays ou vetores ). A maioria dos processadores modernos de alto desempenho contém alguma forma de capacidade de processamento vetorial; por exemplo; A instrução SSE ADDPS disponível na maioria dos processadores x86 calcula a soma de dois vetores, cada um contendo quatro valores de precisão simples. Compilador, desenvolvedor e suporte ao sistema operacional normalmente são obrigados a usar instruções vetoriais, e nem todos os processadores, mesmo nas gerações atuais, suportam as instruções vetoriais mais avançadas (por exemplo, processadores Intel Celeron e Pentium, mesmo em Kaby Lake , não suportam AVX ).

Mais informações técnicas sobre como os processadores de hoje alcançam alto desempenho estão disponíveis em esta resposta .

1 Uma abordagem de design alternativa e bastante incomum é ter várias unidades de execução, mas deixar o compilador determinar quais instruções devem ser emitidas para cada unidade de execução para cada ciclo de clock. Isso é chamado de palavra de instrução muito longa e normalmente é encontrado apenas em processadores especializados.

    
por 25.01.2017 / 19:59
0

Como ninguém apareceu com uma resposta, acho que descobri isso no meio tempo.

Processador escalar é apenas um processador comum, executando instruções escalares que estão trabalhando em um número por vez. Nada de especial.

Por outro lado, o

processador vetorial usa instruções vetoriais que devem funcionar em vários números ao mesmo tempo. Existem registradores especiais, mais amplos, destinados a esse propósito (por exemplo, xmm * de 128 bits do SSE, no qual vários valores podem ser agrupados, por exemplo, 4 inteiros de 32 bits; o AVX-512 introduz os registradores de 512 bits poderia encontrar). Operações vetoriais são feitas por unidades especiais no processador que são feitas para esse propósito. Um exemplo típico de um processador vetorial seria GPU - ele faz apenas cálculos vetoriais.

Superscalar é o termo usado para denotar uma otimização específica, permitindo que instruções escalares sejam executadas em paralelo, em diferentes unidades de execução "regulares" (por exemplo, várias ALUs). Ele divide instruções em múltiplos "streams" (acabei de fazer este termo) que são então executados ao mesmo tempo.

Então, como eles são diferentes de suas contrapartes vetoriais? As instruções escalares não devem ser executadas dessa forma . Há vários possíveis riscos que podem surgir e impedir a execução completamente paralela, como dados ou dependências procedurais. Nesse caso, a execução dessa instrução teria que esperar que suas dependências fossem satisfeitas, pausando a execução desse "fluxo". A CPU tem que cuidar de todas as dependências para evitar corrupção de dados, portanto, cuidado especial deve ser tomado ao otimizar a execução dessa maneira.

Ele também não introduz novas instruções - tudo parece apenas a operação normal da CPU escalar. Por outro lado, os processadores vetoriais possuem instruções especiais para operações vetoriais. A principal diferença é que para operações vetoriais, o programador (ou melhor, o compilador) deve cuidar dos dados e porque não há interferência com registros diferentes ao mesmo tempo (lembre-se, todos os valores são agrupados em registros grandes), vários riscos são evitados. Por outro lado, as CPUs superescalares fazem o melhor para descobrir quais instruções são independentes umas das outras e executá-las ao mesmo tempo.

Observe como eu nunca disse que nenhuma das categorias é mutuamente exclusiva? Eles não são. Unidades vetoriais executarão instruções vetoriais e a CPU tentará encontrar a melhor maneira de paralelizar as escalares. De fato, todas as CPUs modernas suportam tanto instruções vetoriais (SSE *, 3DNow !, AVX, ...) e escalares (x86) que serão executadas de maneira "superescalar".

    
por 25.01.2017 / 19:24