O estudo usa uma simulação que modelou uma
máquina com características do MIPS R2000, acrescida
de vários recursos superescalares. Uma série de
diferentes sequências de programa foi simulada. Em
cada um dos gráficos, o eixo vertical corresponde ao
aumento médio de velocidade (speed up) da máquina
superescalar em relação à maquina escalar. O eixo
horizontal mostra os resultados para quatro
organizações alternativas de processadores. A máquina
base não duplica nenhuma das unidades funcionais,
mas pode emitir instruções fora de ordem. A segunda
configuração duplica a unidade funcional de
leitura/escrita que acessa dados da cache. A terceira
confi guração duplica a ALU e a quarta organização
duplica ambos, leitura/escrita e ALU. Em cada gráfico, os
resultados são mostrados para tamanhos das janelas de
instruções de 8, 16 e 32 instruções, o que define a
quantidade de análise antecipada que o processador
consegue fazer.
Os dois gráficos
combinados produzem
algumas conclusões
importantes. A primeira é
que provavelmente não
vale a pena adicionar
unidades funcionais sem
renomeação de
registradores. Existe uma
pequena melhoria de
desempenho, mas a custo
de aumento da
complexidade do
hardware.
Nota:
A diferença entre os dois gráficos é que, no segundo, a renomeação de registradores é permitida. Isso equivale a dizer que o primeiro gráfico representa uma máquina limitada por todas as dependências, enquanto o segundo corresponde a uma máquina limitada apenas por dependências verdadeiras.
Previsão de desvio
Qualquer máquina de alto desempenho com pipeline deve ter
algum tipo de tratamento para lidar com desvios. Por
exemplo, o Intel 80486 tratava o problema tanto obtendo a
próxima instrução sequencial depois de um desvio, quanto
obtendo especulativamente a instrução alvo do desvio. Com a
chegada da máquinas RISC, a estratégia de desvio atrasado
foi explorada. Isso permite ao processador calcular o
resultado de instruções de desvio condicional antes que
qualquer instrução inutilizável seja obtida. Com este método,
o processador sempre executa a única instrução que vem
imediatamente depois do desvio. Isso mantém o pipeline
cheio enquanto o processador obtém um novo fluxo de
instruções. Com o desenvolvimento de máquinas
superescalares, a estratégia de desvio atrasado tem menos
apelo. O motivo é que múltiplas instruções precisam executar
no delay slot, trazendo vários problemas relacionados com
dependências das instruções.
Execução superescalar
O programa a ser executado consiste de uma sequência
linear de instruções. Esse é o programa estático conforme
escrito pelo programador ou gerado pelo compilador.
O processo de obter instrução, o que inclui a previsão de
desvio, é usado para formar um fluxo dinâmico de
instruções. Este fluxo é examinado para dependências e
o processador pode remover as dependências artificiais.
O processador então despacha as instruções para uma
janela de execução. Nesta janela, as instruções não
formam mais um fluxo sequencial, mas são estruturadas
de acordo com suas dependências de dados verdadeiras.
O processador efetua o estágio de execução de cada
instrução numa ordem determinada pelas dependências
de dados verdadeiras e pela disponibilidade de recursos
de hardware. Finalmente, as instruções são
conceitualmente colocadas de volta na ordem
sequencial e seus resultados são reordenados.
Nota:
O passo fi nal mencionado no parágrafo anterior é conhecido como concluir (commit) ou retirar a instrução.
Este passo é necessário pelo seguinte motivo. Por causa do uso de pipelines múltiplos e paralelos, as instruções
podem completar em uma ordem diferente daquela mostrada no programa estático.
Implementação superescalar
podemos fazer alguns comentários gerais sobre o hardware de
processador necessário para abordagem superescalar. Smith e Sohi
(1995m) listam os seguintes elementos chave: 1ª As estratégias de
busca de instrução que obtêm simultaneamente várias instruções,
frequentemente prevendo os resultados das instruções de desvios
condicionais. Estas funções requerem o uso de múltiplos estágios de
busca e decodifi cação e lógica de previsão de desvios. 2ª Lógica para
determinar dependências verdadeiras envolvendo valores de
registradores e mecanismos para transferir esses valores para onde
eles forem necessários durante a execução. 3ª Mecanismo para
iniciar, ou emitir, múltiplas instruções em paralelo. 4ª Recursos para
execução paralela de múltiplas instruções, incluindo múltiplas
unidades funcionais de pipeline e hierarquias de memória capazes de
atender simultaneamente várias referências de memória. 5ª
Mecanismos para concluir o estado do processo na ordem correta.