Prévia do material em texto
<p>NOTAS de Aula</p><p>SUP – CCO</p><p>Arquitetura de Computadores</p><p>Material referente às arquiteturas RISC e CISC</p><p>Professor: Gerson L Camillo Data: junho 2019</p><p>Arquiteturas RISC (Reduced Instruction Set Computer)1</p><p>Arquitetura RISC (Reduced Instruction Set Computer) representou um avanço na organização da</p><p>arquitetura de computadores.</p><p>Três elementos comuns às arquiteturas RISC:</p><p>- Um grande número de registradores de propósito geral (arquitetônicos) e/ou uso de tecnologia de</p><p>compiladores para otimizar uso de registradores</p><p>- Um conjunto de instruções simples e limitado</p><p>- Uma ênfase na otimização do pipeline de instruções</p><p>Exemplo de execução de uma instrução em RISC e CISC</p><p>Exemplo: multiplicação de dois números em memória.</p><p>CISC: a instrução comporta uma instrução de multiplicação (“MULT”) de valores em memória para uma</p><p>operação equivalente em C: “a=a*b”. A instrução equivalente é:</p><p>MULT a, b # sendo a e b endereços de memória</p><p>Essa instrução de máquina equivale ao seguinte conjunto de tarefas do processador:</p><p>1. Carregar os dois valores a e b da memória para registradores</p><p>2. Multiplicar os operandos</p><p>3. Armazenar o resultado em um registrador</p><p>4. Armazenar o valor do registrador na posição de memória correspondente a a</p><p>RISC: arquitetura que consiste em instruções simples que podem ser executadas em um único ciclo de</p><p>clock. Portanto, a operação de multiplicação é traduzida em um conjunto de instruções RISC mais</p><p>simples:</p><p>LOAD RegA, a</p><p>LOAD RegB, b</p><p>PROD RegA, RegB</p><p>STORE a, RegA</p><p>Um outro exemplo de instrução complexa é a seguinte:</p><p>ADD $4, 14(%eax, %ebx, 8) # x86 – sintaxe AT&T: OP origem, destino</p><p>Soma 4 ao valor constante do endereço calculado, conforme: 14 + %eax + (%ebx * 8). Portanto, a</p><p>arquitetura deve realizar as seguintes microoperações (μop):op):</p><p>ADIÇÃO: 3 μop):op</p><p>1 Observação: o material desta seção está baseada em sua maior parte na livro de Stallings (2017).</p><p>1/11</p><p>NOTAS de Aula</p><p>MULTIPLICAÇÃO: 1 μop):op</p><p>CARREGAMENTO (LOAD): 1 μop):op</p><p>SALVAMENTO (STORE): 1 μop):op</p><p>Características da execução de instruções</p><p>Diferença semântica (gap semântico): diferença entre operações desenvolvidas em linguagens de alto</p><p>níveis e aquelas oferecidas na arquitetura do compudador.</p><p>Origem: desenvolvimento de linguagens de alto nível na década de 60 e início da década de 70. Elas</p><p>permitiam:</p><p>- O programador poderia representar algoritmos de forma mais concisa</p><p>- Possibilitavam que o compilador trabalhasse nos detalhes da tradução</p><p>- O uso de abstrações de alto nível como programação estruturada e orientação a objetos</p><p>Problemas associados ao gap semântico: ineficiências da execução, tamanho excessivo dos programas</p><p>em linguagem de máquina e complexidade dos compiladores.</p><p>Consequências: desenvolvimento de arquiteturas de computadores que incluíam diversos recursos de alto</p><p>nível nos conjuntos de instruções. As máquinas que implementavam esse conjunto de instruções foram</p><p>denominadas de CISC (Complex Instruction Set Computers). O desenvolvimento foi possível pela</p><p>implementação da unidade de controle microprogramada (por Wilkes em 1951), na qual um</p><p>microprograma em hardware é responsável por decodificar as instruções e gerar os diversos sinais de</p><p>controle das unidades funcionais.</p><p>Estudos tentavam sistematizar as principais características de execução das instruções, quanto a:</p><p>- Tipos de operações (funções) executadas pelo processador</p><p>- Tipos e frequência de operandos usados o que determina a organização da memória e modos de</p><p>endereçamento</p><p>- Sequência da execução, que determina a organização e controle do pipeline.</p><p>Operações: a tabela a seguir contém a frequência dinâmica relativa ponderada das instruções de máquina</p><p>relativas à compilação das operações mais comuns de duas linguagem de alto nível. As instruções de</p><p>máquina são relativas à compilação em instruções complexas (CISC). Pela tabela é possível visualizar a</p><p>predominância de instruções de atribuição (movimentação de dados) e de condicionais (if e laços).</p><p>A primeira coluna trata da frequência das operações em linguagem de alto nível. A segunda trata da</p><p>frequência relativa da quantidade de instruções de máquina requeridas para cada operação e a terceira do</p><p>tempo gasto para execução da quantidade total de todas as instruções de máquina.</p><p>Por exemplo, a tabela indica que instruções de chamada/retorno de procedimento são as que consomem</p><p>mais tempo em linguagens de alto niIvel.</p><p>2/11</p><p>NOTAS de Aula</p><p>Operandos: a tabela a seguir contém a frequência de ocorrências de operandos em linguagens de alto</p><p>nível. A predominância é de operandos do tipo escalar simples e as referências são altamente localizadas.</p><p>Além disso, oitenta por cento são variáveis locais.</p><p>Chamadas de procedimentos: a chamada e o retorno de procedimentos são as instruções em alto nível que</p><p>consomem mais tempo. Aspectos a serem distinguidos:</p><p>- Número de parâmetros e variáveis locais; e</p><p>- Profundidade do anhinhamento</p><p>A tabela a seguir apresenta a porcentagem de argumentos de procedimentos e respectivos valores</p><p>percentuais de variáveis escalares locais.</p><p>Os dados de pesquisas indicam que um programa permanece confinado a uma janela relativamente</p><p>estreita de profundidade de chamadas de procedimento. Esse aspecto reforça a conclusão de que as</p><p>referências a operandos altamente localizados.</p><p>Resultados e implicações</p><p>- A estratégia de arquiteturas de conjunto de instruções que estão próximas das linguagens de</p><p>programação não se mostrou eficaz.</p><p>- Elementos da arquitetura RISC que otimizam as referências a operandos: grande número de</p><p>registradores e/ou ajuda do compilador para otimizar o uso de registradores.</p><p>- Instruções que facilitam projeto de pipelines.</p><p>- Conjunto de instruções que consistem em primitivas de alto desempenho.</p><p>3/11</p><p>NOTAS de Aula</p><p>RISC: grande conjunto de registradores</p><p>Os resultados anteriores mostraram a conveniência de um grande banco de registradores. Há duas</p><p>abordagens para tratar registradores em arquiteturas RISC:</p><p>a) O hardware proporcionar um grande conjunto de registradores, como por exemplo, a arquitetura RISC</p><p>Pyramid, com 528 registradores; e/ou</p><p>b) O software (compilador) usar estratégias para alocar da forma mais eficaz possível os registradores</p><p>existentes.</p><p>Mas de qualquer forma, arquiteturas RISC possuem nativamente um conjunto de registradores</p><p>arquitetônicos maior que arquiteturas CISC equivalentes.</p><p>Janelas de registradores: considerando que a maior parte das referências é para escalares locais e que a</p><p>cada chamada de procedimento o escopo dessas variáveis muda. Além disso, considerando que um</p><p>procedimento típico possui um conjunto limitado de parâmetros e de varáveis locais, foi definida uma</p><p>arquitetura de registradores denominada de janela de registradores. Ela consiste em uma organização</p><p>circular com sobreposição de registradores. A sobreposição ocorre nos registradores que tratam dos</p><p>seguintes valores: temporários, parâmetros de função e passagem de valores. Exemplos de uso: SPARC</p><p>da Sun e arquitetura IA-64 (processador Itanium da Intel).</p><p>A sobreposição permite que os parâmetros sejam passados sem o movimento real de dados.</p><p>4/11</p><p>NOTAS de Aula</p><p>A seguinte figura apresenta a organização em buffer circular correspondente a seis janelas de</p><p>registradores.</p><p>Grande</p><p>banco de</p><p>5/11</p><p>NOTAS de Aula</p><p>Registradores versus cache: uma questão que surge é se o armazenamento com latências baixas para</p><p>operandos que grande demanda por acesso podem ser satisfeito por cache ou por um conjunto grande de</p><p>registradores. Os dois métodos possuem característivas, vantagens e desvantagens, conforme explicitado</p><p>na tabela da figura a seguir:</p><p>Mas, caches possuem uma grande desvantagem em relação a registradores quando se trata de</p><p>endereçamento, pois registradores necessitam um esquema muito mais simples e direto do que o de cache.</p><p>A figura a seguir ilustra essa diferença:</p><p>6/11</p><p>NOTAS de</p><p>Aula</p><p>Otimização do uso de registradores baseada em compiladores: quando o conjunto é pequeno, por</p><p>exemplo, 16 a 32 registradores (MIPS possui 32), cabe ao compilador fazer as otimizações. O objetivo do</p><p>compilador é guardar os operandos nos registradores durante o máximo de operações possível, evitando</p><p>acessos à memória para salvamentos e carregamentos (store/load). A abordagem adotada pelos</p><p>compiladores é atribuir registradores virtuais ou simbólicos a todos os dados candidatos a usarem</p><p>registradores. Depois, esse conjunto virtual é mapeado para o conjunto real de registradores da máquina,</p><p>tentando manter os dados que serão mais usados pelo programa.</p><p>Conforme Stallings (2017, p. 468), mesmo com técnicas de otimização de registradores razoalmente</p><p>sofisticadas, há apenas uma melhoria mínima com mais de 32 registradores.</p><p>Características das arquiteturas de instruções CISC (Complex Instruction Set Computer)</p><p>Características</p><p>– Instruções complexas demandando um número grande e variável de ciclos de máquina para sua</p><p>execução.</p><p>– Uso de diversos modos de endereçamento de operandos.</p><p>– Instruções com formato muito variável</p><p>– Diferentes tipos de instruções podem referenciar operandos na memória principal.</p><p>– Cada fase do processamento da instrução pode ter duração variável em função da complexidade.</p><p>- A ênfase é que a CPU execute instruções complexas, com a finalidade de diminuir o gap semântico</p><p>entre linguagens de alto nível e o hardware.</p><p>A figura a seguir apresenta a microarquitetura Core da Intel, com destaque para o controle</p><p>microprogramado da decodificação das instruções e geração dos sinais de controle da CPU.</p><p>7/11</p><p>NOTAS de Aula</p><p>Consequências</p><p>– Conforme algumas pesquisas em RISC (STALLINGS, 2017, p. 469), a tarefa de otimização para</p><p>minimizar o tamanho do código, reduzir o total de instruções e implementar o uso de pipeline é muito</p><p>mais difícil com instruções complexas.</p><p>– A taxa média de execução das instruções por ciclo tende a ser bastante inferior a 1.</p><p>– A unidade de controle é em geral microprogramada, o que torna a unidade de controle mais complexa</p><p>além da necessidade de incluir o controle e o armazenamento do microprograma.</p><p>– Códigos compactos podem ser gerados pelos compiladores, mas essa premissa nem sempre se realiza,</p><p>pois RISC usa muitas referências a registrador, que demandam menos bits de endereçamento. Um</p><p>exemplo é o resultado apresentado na tabela a seguir:</p><p>Características das arquiteturas de instruções RISC</p><p>Características que são comuns a todas as arquiteturas RISC:</p><p>– Instruções mais simples demandando um número fixo de ciclos de máquina para sua execução.</p><p>– Uso de poucos modos simples de endereçamento de operandos.</p><p>– Poucos formatos diferentes de instruções</p><p>– Apenas as instruções de load e store referenciam operandos na memória principal.</p><p>– Operações registrador para registrador.</p><p>– Cada fase de processamento da instrução tem a duração fixa igual a um ciclo de máquina.</p><p>Consequências</p><p>- Implementadas com o uso do pipeline.</p><p>- A taxa média de execução de instruções por ciclo de máquina é alta.</p><p>- A unidade de controle é em geral hardwired.</p><p>- Processo de compilação é complexo e requer cuidados especiais para otimização do desempenho do</p><p>código gerado.</p><p>Uma instrução de máquina por ciclo de clock da máquina: um ciclo de máquina é definido como o tempo</p><p>necessário para obter dois operandos dos registradores, executar uma operação da ALU e armazenar o</p><p>resultado em um registrador. Portanto, essas instruções mais simples podem ser embutidas no hardware.</p><p>As instruções que acessam a memória, como load/store, apesar de necessitarem de mais ciclos de clock,</p><p>podem ser satisfeitas, em média, com um ciclo na presença de memórias cache.</p><p>8/11</p><p>NOTAS de Aula</p><p>Arquiteturas RISC caracterizam-se por realizarem operações registrador a registrador e as únicas</p><p>instruções que acessam a memória são load/store. Por isso, arquiteturas RISC são melhor definidas como</p><p>máquinas de arquitetura load/store.</p><p>Os formatos de instruções mais simples permitem que a decodificação do opcode ocorra ao mesmo tempo</p><p>do acesso aos registradores contendo os operandos.</p><p>A unidade de controle é hardwired, isto é, o código gerado pelo compilador é executado diretamente pelo</p><p>hardware. Nas arquiteturas CISC ele é interpretado por um microprograma, de forma que há mais um</p><p>nível de abstração na arquitetura. Como exemplo de uma arquitetura RISC, segue o esquema da</p><p>arquitetura MIPS:</p><p>Em geral, técnicas de pipeline são melhor aplicadas em arquiteturas de processadores RISC e</p><p>processadors RISC respondem melhor às interrupções, pois geralmente ocorrem entre operações mais</p><p>elementares.</p><p>9/11</p><p>NOTAS de Aula</p><p>Exemplos de processadores com destaque para características RISC vs CISC</p><p>Controvérsia RISC vs CISC</p><p>STALLINGS, 2017, pág. 486</p><p>Problemas em tentar comparar desempenho entre as duas arquiteturas:</p><p>- Não existem pares de máquinas RISC e CISC que sejam comparáveis em custo de ciclo de vida, nível</p><p>de tecnologia, sofisticação do compilador, suporte de sistema operacional, dentre os principais.</p><p>- Dificuldade em diferenciar efeitos de hardware da capacidade dos compiladores.</p><p>- Algumas análises comparativas se basearam em máquinas “brinquedo”.</p><p>RISC: Patterson</p><p>CISC: Colwell</p><p>Atualmente, as duas tecnologias convergiram. Com a melhora dos circuitos, os processadores RISC</p><p>ficaram mais complexos (PowerPC). Por outro lado, x86 usa tradução de instruções para microoperações</p><p>RISC (para tirar proveito do pipeline) e a inclusão de mais registradores.</p><p>Questões de marketing (e não aspectos técnicos) definiram o sucesso da arquitetura CISC (no caso a x86)</p><p>sobre arquiteturas RISC. A arquitetura de instruções x86 da Intel manteve e cresceu no mercado pois</p><p>manteve a compatibilidade entre as gerações de processadores. Com a evolução da arquitetura IA32 na</p><p>x86-64, foi a oportunidade de incluir várias características RISC nos processadors x86.</p><p>Os processadores RISC entraram em alguns nichos de mercado, como processadores embutidos, pois a</p><p>questão desempenho com consumo de energia são muito mais importantes que compatibilidade.</p><p>10/11</p><p>NOTAS de Aula</p><p>BIBLIOGRAFIA E LEITURA COMPLEMENTAR</p><p>PATTERSON, David A.; HENNESSY, John L. Organização e Projeto de Computadores: a interface</p><p>hardware/software. Tradução de Daniel Vieira. 5. ed. Rio de Janeiro: Elsevier, 2017.</p><p>STALLINGS, William. Arquitetura e Organização de Computadores. Tradução de Sérgio</p><p>Nascimento. 10. ed. São Paulo: Pearson Education do Brasil, 2017. 709p.</p><p>TANENBAUM, Andrew S.; AUSTIN, Todd. Organização Estruturada de Computadores. Tradução</p><p>de Daniel Vieira. 6 ed. São Paulo: Pearson Prentice Hall, 2013. 605p.</p><p>WIKIPEDIA. Reduced instruction set computer. Disponível em:</p><p>https://en.wikipedia.org/wiki/Reduced_instruction_set_computer. Acesso em: 20 abr. 2019.</p><p>11/11</p>