Arquiteturas Superescalares
Por: Luiz Fernando Elesbão • 4/6/2015 • Artigo • 1.689 Palavras (7 Páginas) • 458 Visualizações
Nome: Luiz Fernando Elesbão dos Santos Matrícula: 83838
Arquiteturas Superescalares
Em meados da década de 1980, processadores superescalares começaram a aparecer. Processadores superescalares decodificam múltiplas instruções de uma vez e o resultado de instruções de desvio condicional são geralmente preditas antecipadamente, durante a fase de busca, para assegurar um fluxo ininterrupto. Instruções são analisadas para identificar dependências de dados e, posteriormente, distribuídas para execução em unidades funcionais. Conforme a disponibilidade de operandos e unidades funcionais, as instruções executam em paralelo, com grande possibilidade de ser fora da ordem sequencial.
Pode-se dizer que processadores superescalares procuram remover sequenciamentos de instruções desnecessários, mantendo, aparentemente, o modelo sequencial de execução. Os elementos essenciais de processadores superescalares são: (1) busca de várias instruções simultaneamente, possivelmente predizendo branchs; (2) determinação de dependências verdadeiras envolvendo registradores; (3) despacho de múltiplas instruções; (4) execução paralela, incluindo múltiplas unidades funcionais com pipeline e hierarquias de memória capazes de atender múltiplas referências de memória; (5) comunicação de dados através da memória usando loads e stores e interfaces de memória que permitam o comportamento de desempenho dinâmico ou não previsto de hierarquias de memória; (6) métodos para commit do estado do processo, em ordem. Processadores superescalares mantém projetos lógicos com- plexos. Mais de 100 instruções são comumente encontradas em fase de execução, interagindo entre elas e gerando exceções.
O processo de execução acontece da seguinte forma: o processo de busca de instruções, com predição de desvio, ´e usado para formar um conjunto dinâmico de instruções. Dependências são então verificadas e as instruções são despachadas (dispatch) para a janela de execução. Nesse ponto, as instruções não são mais sequenciais, mas possuem certa ordenação causada por dependências verdadeiras. As instruções são então emitidas (issue) da janela conforme a ordem das dependências verdadeiras e a disponibilidade de recursos de hardware. Após a execução, as instruções são novamente colocadas em ordem sequencial e atualizam o estado do processo.
Para diminuir a latência de buscas são, em geral, usadas caches de instruções. As caches de instruções mantém blocos contendo instruções consecutivas. A arquitetura superescalar deve ser capaz de buscar, a partir da cache, múltiplas instruções em um único ciclo. A separação de caches de dados e de instruções é um ponto quase essencial para habilitar essa característica. O despacho de um número máximo de instruções pode ser impedido por situações como misses na cache. O primeiro passo para realizar desvios rápidos envolve o reconhecimento de instruções de desvio. Uma maneira de tornar o processo rápido é armazenar, na cache de instruções, informações de decodificação.
A fase de decodificação, renomeação e despacho de instruções envolve a remoção de instruções do buffer de instruções, tratamento de dependências e despacho de instruções para buffers de unidades funcionais. Durante a decodificação são preenchidos campos de: operação; elementos de armazenamento relacionados com os locais onde operandos residem ou residirão; locais de armazenamento de resultado. Os elementos de armazenamento são gerenciados por lógicas de renomeamento que, em geral, podem ser de dois tipos. Na primeira, uma tabela faz o mapeamento de registradores lógicos para registradores físicos. Caso não haja registradores livres, o despacho é parado momentaneamente até algum registrador seja liberado. A renomeação é feita na ordem do programa. O segundo método de renomeação é o Reorder Buffer. O número de registradores lógicos e físicos é igual. O reorder buffer mantém um entrada para cada instrução despachada mas que ainda não recebeu commit. A medida que instruções são despachadas na ordem sequencial do programa, elas são relacionadas a uma entrada no fim do reorder buffer.
A fase de emissão de instrução e execução paralela acontece após a decodificação e é preciso identificar quais instruções podem ser executadas. Assim que os operandos estão disponíveis, a instrução está pronta para entrar em execução. No entanto, ainda á preciso verificar a disponibilidade de unidades funcionais, portas do arquivo de registradores ou do reorder buffer. Três modos de organizar buffers para emissão de instruções são: Método de Fila Única, Método de Filas Múltiplas e Estações de Reserva. No Método de Fila Única, apenas uma fila é usada, sem emissão fora de ordem. Não é preciso renomeamento de registradores. No Método de Filas Múltiplas, instruções em uma mesma fila são emitidas em ordem, mas as diversas filas podem emitir instruções fora de ordem. Estações de reserva permitem que instruções sejam emitidas fora de ordem. Todas as estações de reserva monitoram simultaneamente a disponibilidade de seus operandos. Quando uma instrução é despachada para uma estação de reserva, os operandos disponíveis são armazenados nela.
Nas operações de memória ao contrário do que acontece com operações de ULA, não são conhecidos durante a decodificação. A determinação do local de acesso requer uma adição para formar o endereço, o que é feito na fase de execução. Após o cálculo do endereço, pode ainda ser necessária uma tradução (translation) para gerar o endereço físico. Esse processo é comumente acelerado por uma TLB. Uma vez obtido o endereço válido, a operação pode ser submetida para a memória. Existe a possibilidade de traduções e acessos serem realizados simultaneamente. Para executar operações de memória mais rapidamente, podem ser usadas técnicas como: redução da latência, execução de m´múltiplas instruções ao mesmo tempo, execução sobreposta de operações de memória e operações sem acesso a memória e, possivelmente, execução de operações de memória fora de ordem.
A fase de commit permite manter os efeitos das instruções como se a execução fosse sequencial. Duas técnicas são comumente usadas para recuperar estados precisos. Ambas mantém um estado enquanto a operação executa e outro estado para recuperação. A primeira técnica usa checkpoints. O estado da máquina é salvo em determinados pontos enquanto instruções executam e, também, quando uma estado preciso é necessário. Estados precisos são recuperados de um history buffer. Na fase de commit são eliminados estados do history buffer que não são mais necessários.
...