Arquiteturas RISC (Reduced Instructions Set Computers) 1
INOVAÇÕES DESDE O SURGIMENTO DO COMPU- TADOR DE PROGRAMA ARMAZENADO (1950)! O conceito de família: desacoplamento da arquitetura de uma máquina da sua implementação. Ex.: IBM System /360 e DEC PDP! Unidade de Controle Microprogramada: Sugerida por Wilkes 1951 -, facilitou a implementação da UC e deu suporte ao conceito de família! Memória Cache: sua inserção melhorou dramaticamente as diferenças de velocidade entre processador e memória principal! Pipelining: Meio através do qual foi introduzido o conceito de paralelismo dentro do modelo naturalmente sequencial de um programa de máquina 2
INOVAÇÕES DESDE O SURGIMENTO DO COMPU- TADOR DE PROGRAMA ARMAZENADO (1950)! Multiprocessadores: Sistemas com modelos variados que fazem uso de diversos processadores para aumentar o desempenho dos sistemas! A esta lista deve ser adicionada uma das mais importantes inovações: Reduced Instruction Set Computers - RISC 3
RISC PRINCIPAIS CARACTERÍSTICAS! Conjunto limitado e simplificado de instruções de máquinas! Grande número de registradores de uso geral e utilização de tecnologia de compiladores para otimizar o uso destes registradores! Ênfase na otimização do pipeline de instruções 4
CARACTERÍSTICAS DA EXECUÇÃO DAS INSTRUÇÕES! Com o uso crescente dos computadores a complexidade do software cresceu e o seu custo também! Em resposta, a industria desenvolveu linguagens de programação de alto nível mais complexas e poderosas (FORTRAN, C, ADA)! Com isto, os programas passaram a ser escritos de forma mais concisa, com ênfase nos detalhes associados ao problema e fazendo uso da programação estruturada! Resultado: Gap Semântico distância entre os recursos de programação que a linguagem de alto nível oferece e os recursos de programação que a máquina dispõe 5
CARACTERÍSTICAS DA EXECUÇÃO DAS INSTRUÇÕES! Sintomas do Gap Semântico: Ø Execução ineficiente Ø Tamanho de programa em linguagem de máquina excessivamente grande Ø Complexidade na construção de compiladores 6
CARACTERÍSTICAS DA EXECUÇÃO DAS INSTRUÇÕES! Na tentativa de diminuir o Gap Semântico, os projetistas passaram a oferecer máquinas que continham: Ø Um grande conjunto de instruções Ø Dezenas de modos de endereçamento Ø Vários comandos de linguagem de alto nível implementados em hardware! No entanto, estudos sobre como se dá o comportamento dinâmico de um programa em execução sugerem uma abordagem em outro sentido 7
INTERAÇÃO CPU/MEMÓRIA! A análise do comportamento de um programa nos seus aspectos estático (código fonte) e dinâmico (em execução) pode dar indicações de como ocorre a interação entre cpu e memória! Diversos estudos feitos em programas escritos em linguagem de alto nível demonstram que Tabela 2: Ø Comandos de atribuição ocorrem com elevada frequência Ø Comandos condicionais (if, loop) também predominam, sugerindo que um mecanismo adequado de controle de sequência deve exitir no nível de máquina 8
9
INTERAÇÃO CPU/MEMÓRIA! Quando se analisou, no entanto, o consumo de tempo de execução dos comandos em um programa, um estudo de Patterson 1982 determinou que Tabela 3: Ø As colunas 2 e 3 da Tabela 3 mostram as medidas ponderadas do tempo real gasto por cada instrução Ø Os resultados sugerem que chamadas e retornos de procedimentos são as operações que consomem mais tempos de execução 10
11
USO DE OPERANDOS! Os tipos dos operandos e a frequência do seu uso determinam a organização da memória para o armazenamento e a organização dos modos de endereçamento para o acesso! Estudos na forma de uso dos operandos em programa sugerem que Tabela 4: Ø A maioria das referências são para variáveis de tipo escalar simples Ø Mais de 80% dessas variáveis escalares são também variáveis locais Ø Nas referências a variáveis do tipo array existe a necessidade de acesso ao seu índice que também é uma variável escalar e local Ø Tais estudos sugerem que o acesso a variáveis escalares deve ser otimizado com o armazenamento em registradores, por exemplo 12
13
CHAMADAS DE PROCEDIMENTOS! Como visto, chamadas a procedimentos estão entre as instruções que mais consomem tempo de execução! Dois aspectos são importantes: o número de parâmetros e variáveis locais, e a profundidade das chamadas aninhadas! Um estudo de Tanenbaum encontrou que 98% das chamadas dinâmicas a procedimentos passavam menos que 6 parâmetros e 92% deles usavam menos de 6 variáveis locais! Estes resultados mostram que o número de palavras requeridas por ativação de procedimentos não é grande! Um outro estudo, realizado em Berkeley, encontrou que é raro ter sequencias longas e ininterruptas de chamadas de procedimentos seguidas de seus respectivos retornos 14
CARACTERÍSTICAS DAS ARQUITETURAS RISC! Com base nos estudos apresentados, três elementos emergem que caracterizam fortemente as arquiteturas RISC: Ø Uso de um grande número de registradores para otimizar a referência a operandos (parâmetros, variáveis locais e variáveis escalares) Ø Projeto otimizado do Pipeline de Instruções para lidar com a alta proporção de desvios condicionais e chamadas a procedimentos Ø Um conjunto reduzido e simplificado de instruções para permitir a implementação em hardware da UC 15
CARACTERÍSTICAS DAS ARQUITETURAS RISC! Outras características igualmente importantes: Ø Execução de uma instrução por ciclo Ø Operações Registrador a Registrador Ø Modos de endereçamento simplificado Ø Formato da instrução simplificado 16
USO DE UM GRANDE NÚMERO DE REGISTRADORES! Como visto, a maior parte das operações em programas típicos correspondem a comandos de atribuição (A=B)! Além disso, chamadas a procedimentos estão entre as instruções que mais consomem tempo de execução! Solução: Ø Utilizar um maior número de registradores para viabilizar estas operações com desempenho máximo COMO??? 17
JANELA DE REGISTROS! O maior custo das chamadas de procedimentos está associado à passagem de parâmetros e a alocação de espaço para variáveis locais! Uma abordagem visando desempenho buscaria alocar parâmetros de procedimentos e variáveis locais em registradores Como??? 1. Resultados anteriores mostraram que procedimentos típicos empregam poucos parâmetros e poucas variáveis locais 2. A profundidade das chamadas aninhadas de procedimentos não é grande (Proc A chama Proc B que chama Proc C...)! Para explorar estas propriedades, múltiplos conjuntos pequenos de registradores podem ser usados 18
JANELA DE REGISTROS Ganho???! Uma chamada de procedimento faz com que a CPU mude para usar um conjunto diferente de registradores em vez de salvar o conteúdo dos registradores atuais na memória! O conjunto de registradores usados por um procedimento para a passagem de parâmetros e alocação de variáveis locais é conhecido como janela de ativação! Em abordagens CISC, com poucos registradores internos, a janela de ativação é implementada na área de pilha do programa que fica na memória 19
JANELA DE REGISTROS! Para tornar o uso dos registradores mais eficiente ainda, janelas de ativação distintas podem ser sobrepostas: 20
ORGANIZAÇÃO DOS REGISTRADORES! Para manipular qualquer padrão possível de chamadas e retornos de procedimentos o número de janelas de ativação não deveria possuir limites! Como isso não é possível (nem necessário) uma organização das janelas sob a forma de buffer circular usando apenas os registradores é sugerida! Caso o número de chamadas de procedimentos aninhadas ultrapasse o número de janelas disponíveis, a memória pode ser usada para armazenar dados de ativações mais antigas! Estudos mostram que, com 8 janelas, o uso da memória ocorre em apenas 1% das chamadas aninhadas de procedimentos 21
No modelo ao lado, até 5 procedimentos aninhados podem ser chamados sem ser feito uso da memória. Por que? 22
VARIÁVEIS GLOBAIS! Variáveis comuns a todos os procedimentos de um programa podem ser armazenadas na memória e acessadas através de instruções que referenciam operandos na memória! Uma abordagem mais eficiente, no entanto, seria manter variáveis globais em um conjunto fixo de registradores! Para manter compatibilidade com o modelo de janelas de ativação, o conjunto de registradores deve ser dividido em dois sub-conjuntos: Registradores para variáveis globais (sem offset) Registradores para janelas de ativação (com offset) 23
CONJUNTO DE REGISTROS VERSUS CACHE! Em vez de usar um conjunto de registradores organizado como janelas de ativação não seria mais simples usar uma memória cache?! A tabela a seguir compara características das duas abordagens: 24
Esquemas de endereçamento: Conjunto de Registradores versus Cache 25
O PAPEL DO COMPILADOR PARA AS ARQUITETURAS RISC! A motivação para a adoção das arquiteturas RISC tem origem no comportamento dos programas! Com isso, o compilador exerce um papel fundamental para o sucesso da abordagem RISC! O compilador deve possuir bibliotecas com funções otimizadas, que executam operações mais complexas que as disponíveis no conjunto básico de instruções (Ex.: movimentação de grandes porções de memória)! Em uma máquina CISC tais funções seriam implementdas dentro do próprio conjunto de instruções! Outra função básica do compilador é manter, o tanto quanto possível, os operandos das instruções em execução em registradores 26
O PAPEL DO COMPILADOR PARA AS ARQUITETURAS RISC Exemplo de algoritmo de otimização do uso de registradores: 27
POR QUE CISC?! Simplificação da construção de compiladores? Na prática é muito difícil para o compilador explorar o conjunto de instruções complexas na geração de código A tarefa de otimização do código gerado visando a sua redução e a melhoria do uso do pipeline são ações muito mais difíceis de se executar com um conjunto complexo de instruções! CISC produz programas menores? O fato dos programas em linguagem simbólica (assembly) serem menores não garante que o código executável em bits também o seja Tomando por base o código gerado na máquina RISC I na tabela a seguir, existe pouca ou nenhuma economia no código gerado nas máquinas CISC 28
RAZÕES???! Como já visto, compiladores CISC tendem a favorecer instruções de máquina simples sistemas de execução simplificados! O número maior de instruções nas máquinas CISC produz códigos de instruções com um número maior de bits! Arquiteturas RISC enfatizam o uso de registradores que requerem poucos bits para serem identificados! A figura a seguir mostra a quantidade de bits que é movimentada entre a cpu e a memória em instruções do tipo memória-memória e registrador-registrador 29
30
CARACTERÍSTICAS RISC versus CISC! Passado o entusiasmo inicial sobre as máquinas RISC, percebese que: 1. Projetos RISC podem se beneficiar da inclusão de algumas idéias do modelo CISC Ex.: Power PC 2. Projetos CISC podem se beneficiar da inclusão de algumas idéias do modelo CISC Ex.: Pentium 31
CARACTERÍSTICAS RISC versus CISC A partir da comparação de diversas soluções RISC comerciais que surgiram recentemente, é consenso que as características a seguir são consideradas típicas de arquiteturas RISC: 1. Um tamanho único de instrução 2. O tamanho de instrução típico adotado é 4 bytes 3. Um número reduzido de modos de endereçamento, tipicamente menos que cinco 4. Inexistência de modo de endereçamento indireto memória a memória 5. Inexistência de operações que combinam load/store com op. aritméticas (ex.: soma com operando na memória) 6. Não mais que um operando na memória por instrução 7. Número de registradores internos entre 32 e 64 32