0. Introdução
Programa Aspectos quantitativos no desenho de sistemas Pipelining Avançado Caches e hierarquia de memória Arquitectura de alguns processadores modernos Sistema de Entrada/Saída Multiprocessadores e Clusters
Modelo de Funcionamento Aulas Teóricas Conceitos teóricos sobre arquitectura de computadores Discussão de artigos que serão fornecidos Aulas práticas Apoio à realização dos mini-projectos (grupos de 2) Realização de dois mini-testes (devidamente anunciados) Avaliação Exame / Exame de Recurso: 12 valores (min=5) 2 Mini-testes: 2 valores (min=0) 4 Mini-projectos: 6 valores (min=2) Casos especiais Trab. Estudantes: Mini-testes no gabinete (caso necessário) Época Especial: Exame para 20 valores
Bibliografia Computer Architecture: A Quantitative Approach, 3rd Ed. J. Hennessy & D. Patterson Morgan Kaufmann, ISBN 1-55860-724-2 May 2002 Computer Organization and Design, 3rd Ed. D. Patterson & J. Hennessy Morgan Kaufmann, ISBN 1-55860-604-1 August 2004 Apenas para revisão de aspectos básicos Serão fornecidos alguns artigos
Professores Paulo Marques Marco Vieira pmarques@dei.uc.pt Gabinete D2.5 / Laboratório E5.4 Horário de Atendimento: Seg. 11h-12h / Qui. 10h-12h Marco Vieira mvieira@dei.uc.pt Laboratório E6.2 Horário de Atendimento: Sex. 14h-18h
Revisão de alguns conceitos básicos
Processadores RISC RISC = Reduced Instruction Set Computer ISA (Instruction Set Architecture) simples e uniforme Arquitectura LOAD/STORE Todas as operações são sobre dados em registos Existem operações de LOAD/STORE com a memória Instruções uniformes e de tamanho igual Register file grande e de registos genéricos Comparação com CISC Operações complexas são difíceis de implementar em hardware Operações complexas tornam os sistemas lentos É difícil antever quais as operações que irão ser necessárias Registos com propósitos especiais O compilador pode eficientemente traduzir operações de alto nível
Instruções do MIPS Características Tipos de instruções Operações de cálculo (ALU) são sempre apenas entre registos Apenas existem duas instruções que mexem com memória (load/store) Todas as instruções têm o mesmo tamanho (32 bits) O número de formatos de instruções é reduzido (3) Tipos de instruções ALU (e.g. ADD R1,R2,R3 / ADDI R1,R2,5) Dois registos de origem e um de destino Um registo de origem, um valor imediato e um registo de destino LOAD/STORE (e.g. SD 8(R2),R1) Um registo base, um deslocamento e um registo de origem BRANCH/JUMP Dois registos a comparar e um valor imediato (offset) Um valor imediato (offset)
Instruções do MIPS (exemplos) LD R1,(8)R2 ADDI R1, 10 JR (R1) ADD R1,R2,R3 J 4000
Execução de uma instrução IF – Instruction Fetch Envia para a memória o endereço de PC e obtém a instrução corrente Incrementa o PC ID – Instruction Decode Descodifica a instrução Lê os registos [Calcula o possível end. de destino, num salto, e caso o seja, realiza-o] EXE – Execution / Address Calculation Instruções ALU: Realiza o cálculo Instruções LOAD/STORE: Calcula o endereço a utilizar MEM – Memory Access Instruções LOAD/STORE: Lê ou escreve na memória WB – Write Back Instruções ALU: Escreve o resultado no registo destino Instrução LOAD: Escreve o resultado no registo destino
MIPS Datapath (Implementação Multi-ciclo) Nota: Esta implementação não corresponde directamente às fases atrás mencionadas!
Implementação Multi-ciclo Cada instrução demora um número variado de ciclos de relógio No entanto, em cada momento, só existe uma instrução em execução CPI = Clocks per Instruction Tempo Execução = Instruções x CPImédio x Trelógio IF ID EXE MEM WB Saltos: 2 ciclos Store: 4 ciclos Outros: 5 ciclos
Máquina de Estados do MIPS (simplificada)
Como aumentar a performance? Iniciar uma instrução em cada ciclo de relógio! Adicionar registos entre os diversos “estados” do processador Speedup máximo = Número de fases do pipeline Throughput: Número de instruções completadas por unidade de tempo Aumenta Latência: Tempo que cada instrução demora a executar Aumenta
MIPS Datapath (Implementação Pipelined)
Pipeline ao longo do tempo...
Pipeline vs. Multi-ciclo
Aspectos importantes dos pipelines CPI >= Número de fases do pipeline O CPI não é igual ao número de fases do pipeline devido aos conflitos que surgem! A performance do pipeline está limitada pela fase mais comprida As diversas fases do pipeline têm de realizar aproximadamente o mesmo trabalho O tamanho de cada fase também está limitado pelo clock skew e latch overhead Se TClock Clock_Skew + Latch_Overhead, então não vale a pena aumentar o número de fases do pipeline
Conflitos Estruturais De dados De controlo Um certo elemento do processador não pode ser utilizado por duas fases diferentes do pipeline ao mesmo tempo (e.g. memória: IF Vai à memória buscar uma instrução; MEMAcede à memória; resolvido utilizando duas caches) Resolúveis duplicando o hardware ou com interlocks (bolhas) De dados Quando uma operação depende de resultados que ainda estão a ser calculados (ou carregados) De controlo Saltos (alteram o PC) Tudo isto leva à introdução de “bolhas” no pipeline!
Dependências de Dados
Forwarding
Há dependências de dados não resolúveis...
Dependências de Controlo (saltos) Problema dos saltos O salto é detectado no final do ID, no entanto já foi feito o fetch de uma nova instrução Abordagem simples (Predict Not Taken) Continua o fetch como se nada fosse Se a instrução da qual é feito o fetch é incorrecta, transforma-a num NOP (funciona porque só existem alterações reais nas fases MEM e WB; o salto é descoberto no fim de ID) Perca de performance demasiado elevada IF ID EXE MEM WB J IF ID EXE MEM WB IF -- -- -- -- IF ID EXE MEM WB IF ID EXE MEM WB IF ID EXE MEM WB Taken Not taken
Delay Slot e Nullifying Branch A instrução a seguir ao Branch é sempre executada O compilador tem de lá colocar uma instrução adequada ou um NOP No caso do “Nullifying Branch”, o compilador inclui na própria instrução o que ele previu que iria acontecer Não funciona para pipeline agressivos
Unidades funcionais não completamente pipelined Floating-point unit Pode considerar-se que a fase EXE pode demorar vários ciclos Ocorrem bolhas se existem conflitos estruturais ou dependências de dados (incluindo WAW!)
Excepções: O grande problema dos pipelines Dois tipos fundamentais de excepções: Verdadeiras EXCEPÇÕES (e.g. divisão por zero, overflow, page fault) Interrupções (de hardware ou traps) No caso das excepções é necessário a meio de uma instrução anulá-la, assim como todas as outras que estão a decorrer no pipeline e invocar o Sistema Operativo RESTARTABLE (e.g. Page Fault) vs. TERMINATE (e.g. Illegal Instruction) Grande problema: Processadores “out-of-order” e unidades não fully-pipelined (e.g. FP unit)
Material para ler Computer Architecture: A Quantitative Approach Appendix A A1, A2, A3, A4 (menor profundidade) A5 (menor profundidade)
Algumas questões de revisão... Porque é que o registo R0 do MIPS é sempre 0? Porque é que a maioria dos processadores RISC tem caches de instruções e de dados separadas? Sendo possível colocar tantos transístores dentro de um integrado, porque é que não se aumenta muito mais o número de registos dos processadores (e.g. 128)? Sendo possível colocar tantos transístores dentro de um integrado, porque é que não se aumenta muito mais o número de unidades funcionais existentes? Se o throughput do processador (e velocidade de relógio) tende a aumentar com o tamanho do pipeline, porque é que não se aumenta muito mais o número de fases dos mesmos? Como é que é possível haver funções recursivas se a instrução JAL (Jump-And-Link) guarda sempre o endereço de retorno no registo R31 (i.e. $RA)? Porque é que é necessário haver uma instrução especial RFE (Return-from-exception)?