Baixe o app para aproveitar ainda mais
Prévia do material em texto
Software Básico Micro-arquitetura Tanembaum, capítulo 4 Ciclo de execução de instruções • Busca instrução da memória para o IR • Atualiza o contador de programa (PC) • Determina o tipo da instrução • Se a instrução usa a memória: ° determina a posição do dado ° busca o dado da memória • Executa a instrução • Reinicia o ciclo para a próxima instrução Data path MAR MDR PC IR A B C ULA Elementos de acesso à memória Incrementar ULA Adicionar ULA Data path: executando A=B+C MAR MDR PC IR A B C ULA IR Instrução já está decodificada Pronto para buscar e executar a próxima instrução Busca prox. instrução PC Recebe instrução IR PC Salvar PC atualizado PC IR Decodificando Instrução PC é colocado no barramento da ALU para ser incrementado PC Salvar resultado da soma no registrador A A Registradores B e C são lidos para os dois barramentos da ULA B C Passos da execução • Endereço da próxima instrução é colocado no barramento • Memória fornece a próxima instrução (A = B + C) • Instrução é decodificada • PC é incrementado e guardado de novo • Registradores são habilitados • ULA é programada para executar operação • Resultado é armazenado no destino Sinais de controle • Sinais elétricos precisam ser gerados para: ° Ativar saída dos registradores para um determinado barramento ° Controlar a operação da ULA ° Habilitar a entrada dos registradores para que dados possam ser armazenados ° Controlar a interpretação da instrução Geração dos sinais de controle • Pode ser feita de duas formas: ° Microprograma • Palavras em uma memória ROM indicam os sinais a serem ativados a cada passo • Controle apenas lê memória em uma sequência definida pelo microprograma ° Sequenciador • Circuito temporizado ativa sinais em ordem • Implementa máquina de estados finitos • Sequência de flip-flops e outros circuitos Compromissos velocidade x custo • Soluções simples usualmente são lentas • Formas de acelerar a execução ° Reduzir o # de ciclos para cada instrução ° Melhorar o hardware para que ciclos sejam mais curtos (p.ex.: ripple carry x select carry) ° Sobrepor os passos de execução de várias instruções Redução de ciclos por instrução • Usar hardware especializado para acelerar operações comuns • Módulo de incremento do PC ° Evita uma ativação do data path • Unidade de busca de instruções ° PC não é acessado durante todo o processamento da instrução ° Busca da próxima instrução pode ser feita paralelamente à execução da instrução corrente (prefetching) Prefetching • Ciclo de execução não precisa mais esperar pela memória • Mas e se a instrução atual é um desvio? ° Descarta operação já buscada (Intel) • Stall: interrupção da execução em paralelo • Perde-se sempre um ciclo a cada desvio • Exige hardware mais complexo ° Sempre executa instrução seguinte (SPARC) • Delay slot: instrução seguinte ao desvio • Caso não seja possível usá-lo: NOP Sobreposição de passos • Princípio básico de uma pipeline • Extensão da idéia de prefetching • Elementos do data path são isolados para serem usados em paralelo por instruções diferentes • Registradores de armazenamento temporário (latches) inseridos pelo circuito • Como cada elemento é mais simples que o todo, eles podem ter ciclo menor Data path utilizando latches Busca de instruções Banco de registradores ULA T1 ULA T2 ULA out ULA PC T M P Data path utilizando latches Busca de instruções Banco de registradores ULA T1 ULA T2 ULA out ULA PC T M P Pipeline (exemplo) Busca instrução Decodifica instrução Agrupa operações Obtém operandos Executa tarefas Armazena resultados Acessa memória Problemas em pipelines • Como calcular o próximo endereço se a instrução atual é um desvio condicional? • Como processar uma instrução se outra na pipeline usa os mesmos registradores? • Como continuar se um acesso à memória demora para ser atendido? • Conflitos e dependências causam bloqueios em estágios da pipeline (stalls) Organização de pipelines: scoreboards • “Quadros de reservas” • Cada instrução iniciada marca quais módulos e registradores usará no futuro • Novas instruções só podem ser executadas se os recursos não estiverem reservados • Caso contrário novas instruções são interrompidas até que os recursos sejam liberados Técnicas para melhorar o desempenho • Predição de desvios (branch prediction) • Execução fora de ordem • Re-assinalamento de registradores • Execução especulativa • Utilização de vários níveis de cache Predição de desvios (branch prediction) • Desvios incondicionais podem causar stalls de um ciclo ° Delay slots podem ser utilizados para aproveitar o ciclo com uma instrução • Desvios condicionais causam stalls maiores • Ao identificar um desvio condicional CPUs tentam “adivinhar” se ele será executado Predição de desvios (branch prediction) • Previsão estática: ° desvios para trás são tomados (loops) ° desvios para a frente, não (exceções em ifs) • Previsão dinâmica: ° hardware “lembra” o resultado de saltos no passado - última vez ou várias execuções • Suporte do compilador/programador: ° versões especiais dos desvios com “dica” de qual o resultado esperado para os mesmos Execução fora de ordem • Instruções podem ter diferentes tempos • Conflitos no quadro de reservas podem não se aplicar a outras instruções na fila • Arquiteturas super-escalares tem vários caminhos, então instruções não relacionadas deveriam poder seguir • Problemas: ° determinação do ponto exato de interrupções ° solução de conflitos falsos por registradores Re-assinalamento de registradores write-after-read (WAR) 1: A = 7 2: C = A 3: A = 3 write-after-write (WAW) 1: A = B - C 2: JNZ xxx 3: A = 3 • Em ambos os casos, A=3 fora de ordem poderia afetar as instruções anteriores • Mas se a linha 3 fosse re-escrita “X = 3” e da mesma forma referências posteriores a A, não haveria problemas Re-assinalamento de registradores • Processadores modernos possuem bancos de registradores reserva • Conflitos são resolvidos usando-se re-assinalamento de registradores • Registradores do banco são alocados para solucionar conflitos • Acessos posteriores são mapeados para os novos registradores Execução especulativa • Execução fora de ordem e renomeamento levados ao limite • Instruções condicionais são iniciadas cedo sem que haja certeza de seu uso • Se o desvio for tomado, ganha-se tempo • Se o desvio não for tomado, pode ser necessário desfazer operações • Como tratar “if y≠0 then x=1/y”? ° Interrupções exigem tratamento especial Cache: características de programas usuais • Localidade temporal ° Endereços de memória usados recentemente tendem a ser utilizados novamente em breve • Localidade espacial ° Posições de memória próximas a uma posição acessada tendem a ser acessadas em um futuro próximo Memória cache • Memória pequena, rápida, próxima à CPU • Tabela organizada em linhas (blocos com vários bytes, usualmente entre 4 e 64) • Um acesso à memória leva toda a linha onde aquela posição está para a cache • Cache hit: acesso a posições de memória que já estão em linhas da cache• Cache miss: acesso a posições que não estão na cache Impacto da cache • Exemplo: ° Cache hit: • 90% dos acessos servidos direto da cache ° Acessos encontrados na cache levam 5 ns ° Cache misses exigem outros 50 ns ° Tempo médio de acesso: • Tm = 0,9 x 5 + 0,1 x 55 • Tm = 10 ns Cache: organização • Tabela acessada por endereços • Endereços divididos em três partes: ° Tag: guardada na cache para diferenciar linhas ° Linha: identifica entrada da tabela para o endereço ° Byte/palavra: identifica o byte dentro da linha • Endereços com mesmo valor de linha compartilham mesmas posições da cache Tag Linha Byte/palavra Organização de cache em linhas • Mapeamento direto ° Todas as linhas de mesmo valor compartilham uma única entrada da tabela • Set associative ° Linhas de mesmo valor compartilham um conjunto de entradas comuns • Associatividade completa ° Não há endereço de linha: qualquer endereço pode ocupar qualquer posição da tabela Cache: questões a serem respondidas • Se uma nova linha tem que ser carregada, que linha é retirada? ° Mapeamento direto: não há opção ° Outros: políticas de substituição • LRU: remove a linha usada há mais tempo • Como processar uma escrita na cache? ° write back/write through • Como processar um miss na escrita? ° carrega linha (write allocate)/não carrega Pentium II • Instruções CISC são transformadas em sequências de operações RISC pela unidade de busca e decodificação • Pipeline profunda: 12 estágios • Predição de desvios sofisticada • 40 registradores de “rascunho” Pentium II • Execução fora de ordem ° Até três micro-operações geradas por ciclo ° Até cinco micro-operações disparadas por ciclo • Controle de dependências e conflitos complexo • Instruções são confirmadas em ordem • Execução especulativa com rollback Microarquitetura do Pentium II Unidade de interface com barramentos Cache nível 2 Barramento local para a ponte PCI Cache de dados nível 1 Cache de instruções nível 1 Unidade de busca e decodificação (7 estágios) Unidade de disparo e execução Unidade de retirada (retire unit) pool de micro-instruções ReOrder Buffer (ROB) Unidade de disparo e execução do Pentium II Estação de controle de reservas Porto 0 Porto 1 Porto 2 Porto 3 Porto 4 ULA inteira ULA ponto flutuante Unidade MMX ULA inteira ULA ponto flutuante Unidade MMX Unidade de leitura Unidade de escrita Unidade de escrita Loads Stores Stores ROB UltraSPARC II • RISC tradicional com operações gráficas • Super-escalar de 4 caminhos • Instruções agrupadas por conflitos • Carga especulativa de operandos • Predição de desvios sofisticada e “dicas” • Pipeline de 9 estágios • Instruções executadas e completadas fora de ordem Microarquitetura do UltraSPARC II Unidade de interface de memória Unidade de cache externa Prefetch/disparo I-cache nível 1 Cache nível 2 D-cache nível 1 Leitura/escrita Fila de leitura Fila de escrita Ponto flutuante Registradores PF Unidade gráfica ALU PF ALU PF Unidade inteira Registradores ALU ALU Lógica de agrupamento Memória principal Pipeline do UltraSPARC II Fetch Decode Group Execute Register Cache X1 N1 X2 X3 N2 N3 Write Pipeline para operações com inteiros Pipeline para ponto flutuante/gráficos Micro-arquiteturas: observações finais • Em se tratando de micro-arquiteturas, cada caso é um caso • Pequenas variações nas decisões de projeto podem levar a soluções bem diversas • Compatibilidade com versões anteriores é normalmente um fator limitante • Caches são imprescindíveis e bem variadas
Compartilhar