Arquiteturas superescalares são aquelas que permitem que instruções sejam executadas simultaneamente e de modo independente. A essência da abordagem superescalar é a capacidade de executar múltiplas instruções de forma independente em diferentes pipelines.
O termo paralelismo em nível de instruções se refere à possibilidade de executar múltiplas instruções em paralelo. Tal paralelismo depende das instruções serem independentes umas das outras.
A diferença entre arquiteturas superescalares e superpipeline é que uma arquitetura superescalar executa instruções simultaneamente através de suas múltiplas unidades funcionais, enquanto o superescalar executa algumas instruções em um ciclo de clock muito mais curto.
Existem cinco limitações que impedem o paralelismo a nível de instruções:
-
Dependência verdadeira de dados: a execução de uma instrução depende de dados produzidos pela primeira
-
Dependência procedural: a execução de uma instrução que vem logo após um desvio não podem ser executadas até que o desvio seja tomado.
-
Conflito de recursos: a execução de duas instruções que utilizam um mesmo recurso de hardware ao mesmo tempo
-
Dependência de saída (WAW): quando duas instruções escrevem em um mesmo espaço de memória
-
Dependência de escrever após ler (WAR ou antidependência): a execução de uma instrução depende de dados que vão ser sobrescritos por uma instrução subsequente
Enquanto o paralelismo em nível de instruções descreve a possibilidade das instruções serem executadas simultaneamente, o paralelismo de máquina descreve a capacidade de uma arquitetura aproveitar essa possibilidade e de fato executar as instruções em paralelo. Isso depende principalmente do número de instruções que podem ser buscadas e decodificadas ao mesmo tempo.
O processo de renomeação de registrados permite eliminar “dependências falsas”, ou dependências de nome entre registradores, aumentando o paralelismo em nível de instruções. O uso de uma janela de instruções permite o desacoplamento entre a fase de decode e execução do pipeline, permitindo que o processador decodifique instruções fora de ordem a fim de melhorar o paralelismo em nível de instruções e às coloque em um buffer para serem executadas.
Os elementos chave na organização de processadores superescalares são:
- Estratégias de fetching de múltiplas instruções
- Lógica para determinar dependências verdadeiras de dados
- Mecanismos para fazer issue e executar múltiplas instruções em paralelo
- Mecanismos para fazer o commit das instruções em ordem