Na arquitetura de computadores, Renomeação de Registradores refere-se a uma técnica utilizada para evitar a desnecessária serialização das operações de um programa, imposta pelo reuso dos registradores por essas operações.Stallings, W. (2012). "Paralelismo no nível de instruções e processadores superescalares". Arquitetura e Organização de Computadores. 5ª edição.
Introdução Em um computador programas são executados. Programas são compostos por inúmeras instruções (comandos). As instruções de um programa operam sobre valores alocados em registradores. Algumas instruções demoram mais tempos que outras para serem executadas. Ao acabarem de executar, liberam o processador para executarem outras instruções, que, por sua vez, acessaram novamente os registradores. Entretanto, como forma de melhorar o desempenho do computador, as instruções poderão ser executadas em qualquer ordem, observando as unidades de execução especializadas. O problema é que certas instruções têm dependência com outras instruções e isso pode gerar conflitos de dados. Vejamos a tabela 1.
# Instruction 1 R1 = M 2 R1 = R1 + 8 3 M = R1 4 R1 = M 5 R1 = R1 + 2 6 M = R1
Se todas as instruções executarem sobre um único registrador, ou seja, utilizando o mesmo registrador para recolher e salvar valores, uma instrução sempre precisará esperar a anterior terminar para poder utilizar o registrador, pois a instrução anterior o está utilizando. Mas, se as instruções 4, 5 e 6 utilizassem outro registrador, elas poderiam executar ao mesmo tempo que as instruções 1, 2 e 3, se houvesse processador disponível (tabela 2).Smith, J. E.; Pleszkun, A. R. (June 1985). "Implementation of precise interrupts in pipelined processors". ACM SIGARCH Computer Architecture News 13 (3): 36–44. doi:10.1145/327070.327125.
# Instruction # Instruction 1 R1 = M 4 R2 = M 2 R1 = R1 + 8 5 R2 = R2 + 2 3 M = R1 6 M = R2
Os processadores atuais possuem inúmeros registradores para proporcionar a otimização ofertada pela técnica Register Renaming.
Perigos de Dados ou Conflitos de Dados - Problema principal a ser solucionado Ocorre quando mais de uma instrução acessa o mesmo registrador, seja para leitura ou para escrita, mas precisa observar certa ordem de instruções, do contrário poderá haver o conflito de dados, que pode ser classificado de três formas:
RAW – Read After Write (Leitura após Escrita/Dependência Verdadeira) Ocorre quando uma Leitura é feita após uma escrita na sequência de um programa, e portanto, espera recolher o valor colocado lá por essa última escrita em específico, e não uma outra escrita qualquer. O exemplo abaixo é um exemplo de RAW porque a instrução 2 deve recolher o valor 5 e não, por acaso, o valor 10.
# Instruction 1 R1 = 5 2 MEM = R1 3 R1 = 10 4 MEM = R1 + 1
WAW – Write After Write (Escrita após Escrita/Dependência de Saída) Ocorre quando existem várias instruções gravando valores no mesmo registrador numa determinada sequência. Nesse caso, o registrador deve permanecer com o valor setado pela última instrução da sequência. No exemplo abaixo o registrador R1 deverá ficar com o valor 20, portanto, a instrução 4 deve necessariamente ser a última a ser executada.Stallings, W. (2012). "Paralelismo no nível de instruções e processadores superescalares". Arquitetura e Organização de Computadores. 8ª edição.
# Instruction 1 R1 = 5 2 R1 = 200 3 R1 = 10 4 R1 = 20
WAR – Write After Read (Escrita após Leitura/Anti-dependência) Ocorre quando um registrador deverá retornar um determinado valor, e após essa instrução, o registrador será alterado, e portanto, precisa-se assegurar que ele não seja alterado antes de retornar o valor para a primeira instrução. No exemplo abaixo, a instrução 3 não pode ser executada antes da instrução 2.
# Instruction 1 R2 = 10 2 R1 = R2 + 5 3 R2 = 43
A dependência de saída e a antidependência são consideradas dependências falsas, visto que a serialização das instruções só é necessária por se utilizar o mesmo registrador nas duas instruções. Esta serialização não precisa ocorrer se houver a Renomeação de Registradores..Andaló, F. A. "Register Renaming" - Unicamp. Disponível em: <http://www.ic.unicamp.br/~rodolfo/Cursos/mo401/2s2005/Trabalho/>
Renomeação de Registradores Levando em consideração que as instruções não podem simplesmente serem executadas serialmente, pois isso seria custoso em termos de tempo, utiliza-se a técnica da Renomeação de Registradores. Esta técnica consiste em renomear os registradores, aumentando o paralelismo disponível, ou seja, permitindo que duas instruções que antes deveriam ser executadas serialmente possam agora ser executadas concorrentemente pois estão utilizando registradores diferentes.
Equivale a traduzir: # Instruction 1 R1 = 52 MEM = R13 R1 = 104 MEM = R1 Para: # Instruction 1 R1 = 52 MEM = R13 R9 = 104 MEM = R9
Este método é baseado em uma técnica tradicional de tratamento de conflitos por recursos: a duplicação do recurso. Quando é possível, o compilador promove esta otimização dinamicamente, ou seja, o hardware do processador aloca os registradores dinamicamente. A cada registrador é associado um valor a cada instante de tempo, valor este requerido pelas instruções. Quando um novo valor deverá ser armazenado em um registrador que já está sendo utilizado, um novo registrador é criado para esse valor. O acesso ao valor que deveria estar neste registrador, seguirá um processo de renomeação de registradores: referências à registradores existentes nessas instruções são revisadas, passando a referir-se aos registradores que contêm os valores requeridos.
Entretanto, o número de registradores de uso geral disponíveis para o compilador é limitado e por isso muitos registradores fazem esta renomeação em hardware. No entanto, ainda assim existem limitações: É muito difícil para o compilador evitar a reutilização de registradores sem um grande aumento no tamanho do código. Em laços de repetição, por exemplo, iterações sucessivas teriam que usar diferentes registradores, o que requer a replicação do código. Um grande número de registradores requer lotes de bits para especificação, novamente causando o aumento de tamanho do código. Muitos conjuntos de instrução especificam um número baixo de registradores e isso não pode ser mudado. Aumentos no tamanho do código são críticos porque quanto maior o tamanho do código mais custoso será o processamento em questões de tempo.Smith, J. E.; Pleszkun, A. R. (May 1988). "Implementing precise interrupts in pipelined processors". IEEE Trans. Comput. 37 (5): 562–573. doi:10.1109/12.4607.
Registradores Físicos vs. Registradores de Arquitetura Programas de linguagem de máquina especificam leituras e escritas para um conjunto limitado de registradores especificado pela Arquitetura do Conjunto de Instruções (ISA – Instruction Set Architecture) – os registradores lógicos. Por exemplo, o Alpha ISA especifica 32 registradores inteiros de 64 bits de largura e 32 registradores de ponto flutuante também de 64 bits de largura. Estes são registradores de arquitetura. Portanto, programas escritos para executarem sobre a arquitetura Alpha ISA usarão 64 registradores para leituras e escritas (32 para operações sobre inteiros e 32 para operações sobre ponto flutuante).
Em todos os esquemas de renomeação, a máquina converte os registradores da arquitetura referenciados na instrução em tags (etiquetas). O arquivo de mudança de nome deve ter uma porta de leitura para cada entrada de cada instrução renomeada a cada ciclo, e uma porta de escrita para cada saída de cada instrução renomeado a cada ciclo. Pelo fato de que o tamanho de um banco de registradores geralmente cresce em função do número de portas, ele se torna geralmente grande e consome uma potência significativa.
Renomeação de Registradores Parcial e Renomeação de Registradores Total Segundo Andaló existe uma classificação da técnica de Renomeação de Registradores em Parcial ou Total para definir a extensão da utilização da técnica pelos processadores.
De acordo com essa diferenciação, a Renomeação de Registradores Parcial seria uma renomeação restrita a um ou pouco tipo de instruções, ou seja, ela seria executada apenas com poucas classes de instruções. Já a Renomeação de Registradores Total incluiria todas as instruções que possuem registrador de destino.
Conceitos Importantes Banco de Registradores de Arquitetura: Conjunto de Registradores da Arquitetura. Arquivo Futuro (Future File): Algumas instruções são executadas mesmo sem saber se deveriam ser (na caso de desvios condicionais, por exemplo). Os resultados dessas instruções são guardadas no Future File e se as instruções forem realmente executadas, o conteúdo dos registradores deste arquivo é copiado para os registradores finais. Utilizado na previsão de acerto. Buffer de História (History Buffer): Comumente utilizado junto com o Future File, guarda os valores antigos dos registradores. Buffer de Reordem (Reorder Buffer - ROB): Buffer onde ficam os resultados das instruções executadas fora da ordem para que ao final sejam passadas para os registradores da arquitetura na ordem correta.
Banco de Registradores Indexados por tags e Estação de Reserva Existem duas formas de renomeação de registradores, o Arquivo de Registro Indexado ou Banco de Registradores Indexados por Etiquetas (tags) e a Estação de reserva.
No arquivo de registro de etiquetas indexadas, há um grande arquivo de registros que contém uma etiqueta (tag) para cada registro. Neste modelo, quando uma instrução é emitida para uma unidade de execução, as tags do banco de registradores são enviados para o arquivo de registradores físicos, onde os valores correspondentes a essas tags (etiquetas) são lidas e enviadas para a unidade de execução.
Na estação de reserva, existem pequenos arquivos de registradores associativos, geralmente um em cada entrada da unidade de execução. Cada operando de cada instrução em uma fila tem um lugar para um valor em um desses arquivos de registro. Neste estilo, há uma comparação entre as entradas dos arquivos de registro e as estradas das filas de problemas para que a instrução seja encaminhada para a unidade de execução.Smith, J. E.; Pleszkun, A. R. (1998). "Implementation of precise interrupts in pipelined processors". "25 years of the international symposia on Computer architecture (selected papers) - ISCA '98". pp. 291–299. doi:10.1145/285930.285988. .
Banco de Registradores Indexados por tags Este é o estilo de renomeação usado no MIPS R10000 , o Alpha 21264 , e na seção de ponto flutuante do AMD Athlon.
Na fase de renomeação todos os registros referenciados da arquitetura, seja para escrita ou leitura, são procurados em um arquivo de mapeamento. O resultado desta procura é uma tag (etiqueta) e um bit de controle ligado. Se o bit de controle estiver desligado é porque existe alguma instrução que ainda não foi executada. Para operandos de leitura, esta tag toma o lugar do registro da arquitetura na instrução. Para todos os registros de escrita, uma nova tag é puxada de uma fila de tags livres, e um novo mapeamento é escrito no arquivo de mapeamento, assim as futuras leituras aos registradores da arquitetura vão se referir a essa nova etiqueta (tag).
As instruções são então colocados em várias filas de emissão.
A cada instrução executada, resultados são gerados e as tags desses resultados são comparados com as tags da fila de operandos prontos para retirar (ou não), identificando as dependências. O arquivo de mapeamento também faz essa comparação de tags e então ele pode marcar o registrador físico correspondente como pronto. As instruções com estado de prontas são retirados da fila e enviados para as unidades de execução. Instruções não prontas permanecem na fila. Esta remoção desordenada de instruções das filas é uma das questões que torna o Arquivo de Registro de Etiquetas (tags) Indexadas grande e com demanda energética alta.