Notas da terceira edição Nota: essas notas normalmente são complementadas por outros materiais, como problemas do texto que podem ser trabalhados em sala de aula. É provável que você queira personalizar esse material para que se ajuste às necessidades dos seus alunos. Essas notas foram prepararadas com base em uma turma de alunos que já aprendeu sobre desenvolvimento com lógica e freqüentou um laboratório prático de programação de linguagem assembly que não segue um formato de aula comum. 1 Capítulo 1 2 Introdução • O objetivo deste curso é mostrar como os computadores funcionam • Mas o que queremos dizer com a palavra “computador”? • Diferentes tipos: desktop, servidores, dispositivos embutidos – Diferentes usos: automóveis, design gráfico, finanças, genética... – Diferentes fabricantes: Intel, Apple, IBM, Microsoft, Sun... – Diferentes tecnologias subjacentes e diferentes custos! • Analogia: Pense em um curso sobre “veículos automotivos” – Muitas semelhanças de um veículo para outro (por exemplo, volantes) – Grandes diferenças de um veículo para outro (por exemplo, gasolina, álcool) • Melhor maneira de aprender: – Concentrar em um exemplo específico e aprender como ele funciona – Abordar princípios gerais e perspectivas históricas 3 Por que aprender esse assunto? • Você deseja se tornar um “cientista da computação” • Você deseja desenvolver softwares utilizáveis (precisam de desempenho) • Você precisa tomar uma decisão em relação a uma compra ou oferecer conselhos de “especialista” • Tanto o hardware quanto o software afetam o desempenho: – O algoritmo determina o número de instruções na origem – Linguagem/compilador/arquitetura determinam as instruções da máquina (Capítulos 2 e 3) – Processador/memória determinam a velocidade com que as instruções são executadas (Capítulos 5, 6 e 7) • Avaliando e entendendo o desempenho no Capítulo 4 4 O que é um computador? • Componentes: – entrada (mouse, teclado) – saída (monitor, impressora) – memória (unidades de disco, DRAM, SRAM, CD) – rede • Nosso foco principal: o processador (caminho de dados e controle) – Implementado usando milhões de transistores – Impossível de entender olhando para os transistores – Precisamos... 5 Abstração • Uma boa dica para obter mais informações é aprofundar-se nos componentes Programa em linguagem de alto nível (em C) • Uma abstração omite detalhes desnecessários swap (int v[], int k) {int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } e ajuda a entender a complexidade Compilador Programa em linguagem assembly (para MIPS) Quais são alguns dos detalhes que aparecem nestas abstrações familiares? swap: muli add lw lw sw sw jr $2, $5, 4 $2, $4, $2 $15, 0($2) $16, 4($2) $16, 0($2) $15 4($2) $31 Assembler Programa em linguagem de máquina binária (para MIPS) 000000001010000100000000000000011000 000000000001100110000001100000100001 100011000110001000000000000000000000 100011001111001000000000000000000100 101011001111001000000000000000000000 101011000110001000000000000000000100 000000111110000000000000000000000100 6 Como os computadores funcionam? • É preciso entender abstrações como: – – – – – – – – – – – Software de aplicações Software de sistemas Linguagem assembly Linguagem de máquina Aspectos de arquitetura, como caches, memória virtual, canalização Lógica seqüencial, máquinas de estado finito Lógica combinatória, circuitos aritméticos Lógica booleana, 1s e 0s Transistores usados para construir portões lógicos (CMOS) Semicondutores/silício usados para construir transistores Propriedades dos átomos, elétrons e dinâmica quantitativa • Muito o que aprender! 7 Arquitetura do conjunto de instruções • Uma abstração muito importante – interface entre o hardware e o software de baixo nível – padroniza instruções, padrões de bits de linguagem de máquina etc. – vantagem: diferentes implementações da mesma arquitetura – desvantagem: algumas vezes impede o uso de inovações Verdadeiro ou falso: A compatibilidade binária é extremamente importante? • Arquiteturas de conjunto de instruções modernas: – IA-32, PowerPC, MIPS, SPARC, ARM e outras 8 Perspectiva histórica • O ENIAC, construído na Segunda Guerra Mundial, foi o primeiro computador de finalidade geral – Usado para calcular tabelas de disparo de artilharia – 24 metros de comprimento por 2,5 metros de altura e dezenas de centímetros de profundidade – Cada um dos 20 registradores de 10 dígitos tinha 60 centímetros de comprimento – Usava 18.000 válvulas – Efetuava 1.900 adições por segundo – Desde então: Lei de Moore: A capacidade dos transistores dobra a cada 18 a 24 meses 9 Capítulo 2 10 Instruções • Linguagem da máquina • Vamos trabalhar com a arquitetura do conjunto de instruções MIPS – Semelhante a outras arquiteturas desenvolvidas desde a década de 1980 – Quase 100 milhões de processadores MIPS fabricados em 2002 – Usada pela NEC, Nintendo, Cisco, Silicon Graphics, Sony... 1400 1300 1200 Milhões de processadores 1100 1000 Outro SPARC Hitachi SH PowerPC Motorola 68K 900 MIPS IA-32 800 ARM 700 600 500 400 300 200 100 0 1998 1999 2000 2001 2002 11 Aritmética MIPS • Todas as instruções possuem três operandos • A ordem do operando é fixa (destino primeiro) Exemplo: Código C: a = b + c Código MIPS: add a, b, c (falaremos sobre registradores em breve) “O número natural de operandos para uma operação como adição é três... Exigir que cada instrução tenha exatamente três operandos, nem mais nem menos, está de acordo com a filosofia de manter o hardware simples.” 12 Aritmética MIPS • Princípio de projeto: a simplicidade favorece a regularidade. • É claro, isso complica algumas coisas... Código C: a = b + c + d; Código MIPS: add a, b, c add a, a, d • Os operandos precisam ser registradores, apenas 32 registradores fornecidos • Cada registrador contém 32 bits • Princípio de projeto: quanto menor, melhor. Por quê? 13 Registradores versus memória • Os operandos das instruções aritméticas precisam ser registradores – apenas 32 registradores fornecidos • O compilador associa variáveis com registradores • E quanto aos programas com muitas variáveis? Entrada Controle Memória Caminho de dados Processador Saída E/S 14 Organização da memória • Vista como um array grande e unidimensional, com um endereço. • Um endereço de memória é um índice para o array. • “Endereçamento de byte” significa que o índice aponta para um byte da memória. 0 8 bits de dados 1 8 bits de dados 2 8 bits de dados 3 8 bits de dados 4 8 bits de dados 5 8 bits de dados 6 8 bits de dados ... 15 Organização da memória • Os bytes são bons, mas a maioria dos itens de dados usam “words” maiores • Para o MIPS, uma word possui 32 bits ou 4 bytes. 0 4 32 bits de dados 8 12 32 bits de dados 32 bits de dados Os registradores armazenam 32 bits de dados 32 bits de dados • 232 bytes com endereços de byte de 0 a 232–1 • 230 words com endereços de byte 0, 4, 8, ... 232–4 • As words são alinhadas Por exemplo, quais são os 2 bits menos significativos de um endereço de word? 16 Instruções • Instruções load e store • Exemplo: Código C: A[12] = h + A[8]; Código MIPS: lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 48($s3) • Pode se referir aos registradores por nome (por exemplo, $s2, $t2) em vez do número • A instrução store word tem o destino por último • Lembre-se de que os operandos são registradores, não memória! Não podemos escrever: add 48($s3), $s2, 32($s3) 17 Nosso primeiro exemplo • Você pode descobrir o código? swap(int v[ ], int k); { int temp; temp = v[k] v[k] = v[k+1]; v[k+1] = temp; } swap: muli $2, $5, 4 add $2, $4, $2 lw $15, 0($2) lw $16, 4($2) sw $16, 0($2) sw $15, 4($2) jr $31 Æ 18 Até agora, aprendemos: • MIPS – carga de words mas endereçamento de bytes – aritmética apenas em registradores • Instrução add $s1, $s2, $s3 sub $s1, $s2, $s3 lw $s1, 100($s2) sw $s1, 100($s2) Significado $s1 = $s2 + $s3 $s1 = $s2 – $s3 $s1 = Memory[$s2+100] Memory[$s2+100] = $s1 19 Linguagem de máquina • Instruções, como registradores e words de dados, também possuem 32 bits de tamanho – Exemplo: add $t1, $s1, $s2 – Registradores têm números, $t1=9, $s1=17, $s2=18 • Formato da instrução: 000000 10001 10010 01000 00000 100000 op rs rt rd shamt funct • Você sabe o significado dos nomes de campo? 20 Linguagem de máquina • Pense nas instruções load-word e store-word – O que o princípio da regularidade nos levaria a fazer? – Novo princípio: Um bom projeto exige comprometimento • Introduza um novo tipo de formato de instrução – Tipo I para instruções de transferência de dados – Outro formato era o tipo R para o registrador • Exemplo: lw $t0, 32($s2) 35 18 9 op rs rt 32 número de bit 16 • Qual é o compromisso? 21 Conceito do programa armazenado • Instruções são bits • Programas são armazenados na memória – para serem lidos ou escritos exatamente como os dados Memória para dados, programas, compiladores, editores etc. Processador Memória • Ciclo de execução e busca – As instruções são buscadas e colocadas em um registrador especial – Os bits no registrador “controlam” as ações subseqüentes – Busca a próxima instrução e continua 22 Controle • Instruções de tomada de decisão – altera o fluxo de controle – por exemplo, mudar a “próxima” instrução a ser executada • Instruções de desvio condicionais do MIPS: bne $t0, $t1, Label beq $t0, $t1, Label • Exemplo: if (i==j) h = i + j; bne $s0, $s1, Label add $s3, $s0, $s1 Label: .... 23 Controle • Instruções de desvio incondicionais do MIPS: j label • Exemplo: if (i!=j) h=i+j; else h=i-j; beq $s4, $s5, Lab1 add $s3, $s4, $s5 j Lab2 Lab1: sub $s3, $s4, $s5 Lab2: ... • Você pode construir um “loop for” simples? 24 Até agora: • Instrução Significado add $s1,$s2,$s3 sub $s1,$s2,$s3 lw $s1,100($s2) sw $s1,100($s2) bne $s4,$s5,L beq $s4,$s5,L j Label $s1 = $s2 + $s3 $s1 = $s2 – $s3 $s1 = Memory[$s2+100] Memory[$s2+100] = $s1 Next instr. is at Label if $s4 ¹ $s5 Next instr. is at Label if $s4 = $s5 Next instr. is at Label • Formatos: R op rs rt rd I op rs rt endereço de 16 bits J op shamt funct endereço de 26 bits 25 Fluxo de controle • Temos: beq e bne; e branch-if-less-than? • Nova instrução: if slt $t0, $s1, $s2 $s1 < $s2 then $t0 = 1 else $t0 = 0 • Podemos usar essa instrução para construir “blt $s1, $s2, Label” – agora podemos construir estruturas de controle gerais • Note que o assembler precisa de um registrador para fazer isso – existe uma política das convenções de uso para registradores 26 Política das convenções de uso Nome Número do registrador $zero 0 Uso O valor constante 0 $v0-$v1 2-3 Valores para resultados e avaliação de expressões $a0-$a3 4-7 Argumentos $t0-$t7 8-15 Temporários $s0-$s7 16-23 Valores salvos $t8-$t9 24-25 Mais temporários $gp 28 Ponteiro global $sp 29 Pointeiro de pilha $fp 30 Pointeiro de quadro $ra 31 Endereço de retorno Registrador 1 ($at) reservado para o assembler, 26-27 para o sistema operacional 27 Constantes • Constantes pequenas são usadas muito freqüentemente (50% dos operandos) Por exemplo: A = A + 5; B = B + 1; C = C - 18; • Soluções? Por que não? – coloque “constantes típicas” na memória e carregue-as. – crie registradores “hard-wired” (como $zero) para constantes como um. • Instruções MIPS: addi $29, $29, 4 slti $8, $18, 10 andi $29, $29, 6 ori $29, $29, 4 • Princípio de projeto: Torne o caso comum rápido. Que formato? 28 E quanto às constantes maiores? • Gostaríamos de ser capazes de carregar uma constante de 32 bits em um registrador • Precisamos usar duas instruções; nova instrução “load upper immediate”: lui $t0, 1010101010101010 1010101010101010 preenchido com zeros 0000000000000000 • Depois, precisamos acertar os bits de ordem inferior, por exemplo: ori $t0, $t0, 1010101010101010 1010101010101010 0000000000000000 0000000000000000 1010101010101010 1010101010101010 1010101010101010 ori 29 Linguagem assembly versus linguagem de máquina • O assembly fornece uma representação simbólica conveniente – muito mais fácil do que escrever números – por exemplo, destino primeiro • A linguagem de máquina é realidade subjacente – por exemplo, o destino não é mais o primeiro • O assembly pode fornecer “pseudoinstruções” – por exemplo, “move $t0, $t1” existe apenas no assembly – seria mais bem implementada usando “add $t0,$t1,$zero” • Ao considerar o desempenho, você deve contar as instruções reais 30 Outras questões • Abordadas em seu laboratório de programação de linguagem assembly: – suporte para procedimentos – linkers, carregadores, layout da memória – pilhas, quadros, recursão – manipulação de strings e ponteiros – interrupções e exceções – chamadas de sistema e convenções • Veremos alguns desses mais adiante • Estudaremos as otimizações de compilador no Capítulo 4. 31 Visão geral do MIPS • instruções simples, todas com 32 bits • muito estruturado, nenhuma bagagem desnecessária • apenas três formatos de instrução R op rs rt rd I op rs rt endereço de 16 bits J op shamt funct endereço de 26 bits • nos baseamos no compilador para obter desempenho – quais são os objetivos do compilador? • ajudamos o compilador onde podemos 32 Endereços em desvios e jumps • Instruções: bne $t4,$t5,Label A próxima instrução está em Label se $t4 ° $t5 beq $t4,$t5,Label A próxima instrução está em Label se $t4 = $t5 j Label A próxima instrução está em Label • Formatos: I op J op rs rt endereço de 16 bits endereço de 26 bits • Os endereços não são de 32 bits – Como manipular isso com instruções load e store? 33 Endereços em desvios • Instruções: bne $t4,$t5,Label beq $t4,$t5,Label A próxima instrução está em Label se $t4¹$t5 A próxima instrução está em Label se $t4=$t5 • Formatos: I op rs rt endereço de 16 bits • Poderíamos especificar um registrador (como lw e sw) e acrescentá-lo ao endereço – use o registrador de endereço de instrução (PC = contador do programa) – a maioria dos desvios é local (princípio da localidade) • As instruções jump usam apenas bits de ordem superior do PC – limites de endereço de 256 MB 34 Resumindo Operandos MIPS Nome Exemplo Comentários 32 registradores $s0-$s7, $t0-$t9, $zero, $a0-$a3, $v0-$v1, $gp, $fp, $sp, $ra, $at Memória[0], Memória[4]..... Memória[4294967292] Locais rápidos para dados. No MIPS, os dados precisam estar em registradores para a realização de operações aritméticas. O registrador MIPS $zero sempre é igual a 0. O registrador $at é reservado para o assembler tratar de constantes grandes. Acessadas apenas por instruções de transferência de dados. O MIPS utiliza endereços em bytes, de modo que os endereços em words seqüenciais diferem em 4 vezes. A memória contém estruturas de dados, arrays e spilled registers, como aqueles salvos nas chamadas de procedimento. 30 2 words na memória Assembly do MIPS Categoria Instrução Exemplo Significado Comentários Aritmética add subtract add immediate load word [TD]add $s1,$s2,$s3[TN] [TD]sub $s1,$s2,$s3[TN] addi $s1,$s2,100[TN] [TD]lw $s1,100($s2)[TN] [TD]$s1 = $s2 + $s3[TN] [TD]$s1 = $s2- $s3[TN] [TD]$s1=$s2 + 100[TN] $s1 = Memória[$s2 + 100 Três operandos; dados nos registradores Três operandos; dados nos registradores Usada para somar constantes Dados da memória para o registrador store word load byte store byte load upper immed. branch on equal [TD]sw $s1,100($s2)[TN] lb $s1,100($s2)[TN] sb $s1,100($s2)[TN] [TD]lui $s1,100[TN] beq $s1,$s2,25 Dados do registrador para a memória Byte da memória para o registrador Byte de um registrador para a memória Carrega constante nos 16 bits mais altos Testa igualdade; desvio relativo ao PC branch on not equal set on less than bne $s1,$s2,25 slt $s1,$s2,$s3 set less than immediate jump slti $s1,$s2,100 Memória[$s2 + 100] = $s1 $s1 = Memória[$s2 + 100 Memória[$s2+100] = $s1 [TD]$s1 = 100 * 216[TN] if ($s1 == $s2) go to PC + 4 + 100 if ($s1 != $s2) go to PC + 4 + 100 if ($s2 < $s3) $s1 = 1; else $s1 = 0 if ($s2 < 100) $s1 = 1; else $s1 = 0 j 2500 go to 10000 Desvia para endereço de destino jump register jump and link jr $ra jal 2500 go to [TD]$ra[TN] [TD]$ra[TN] = PC + 4. go to 10000 Para switch e retorno de procedimento Para chamada de procedimento Transferência de dados Desvio condicional Desvio incondicional Testa desigualdade; relativo ao PC Compara menor que; usado com beq, bne Compara menor que constante 35 1. Endereçamento imediato op rs rt Imediato 2. Endereçamento em registrador op rs rd rt ... Registradores funct Registrador 3. Endereçamento de base op rs rt Memória Endereço + Registrador Byte Halfword Word 4. Endereçamento relativo ao PC op rs Endereço rt PC Memória Word 5. Endereçamento pseudodireto op Endereço PC Memória Word 36 Arquiteturas alternativas • Alternativa de projeto: – forneça operações mais poderosas – o objetivo é reduzir o número de instruções executadas – o risco é um tempo de ciclo mais lento e/ou uma CPI mais alta — “O caminho em direção à complexidade da operação é, portanto, repleto de perigos. Para evitar esses problemas, os projetistas passaram para instruções mais simples. • Vejamos (brevemente) o IA-32 37 IA-32 • • • • • • • • • • 1978: O Intel 8086 é anunciado (arquitetura de 16 bits) 1980: O coprocessador de ponto flutuante 8087 é acrescentado 1982: O 80286 aumenta o espaço de endereçamento para 24 bits; mais instruções 1985: O 80386 estende para 32 bits; novos modos de endereçamento 1989-1995: O 80486, Pentium e Pentium Pro acrescentam algumas instruções (especialmente projetadas para um maior desempenho) 1997: 57 novas instruções “MMX” são acrescentadas; Pentium II 1999: O Pentium III acrescenta outras 70 instruções (SSE) 2001: Outras 144 instruções (SSE2) 2003: A AMD estende a arquitetura para aumentar o espaço de endereço para 64 bits; estende todos os registradores para 64 bits, além de outras mudanças (AMD64) 2004: A Intel se rende e abraça o AMD64 (o chama EM64T) e inclui mais extensões de mídia • Essa história ilustra o impacto das “algemas douradas” da compatibilidade “adicionando novos recursos da mesma forma que se coloca roupas em uma sacola”, uma arquitetura “difícil de explicar e impossível de amar”. 38 Visão geral do IA-32 • Complexidade: – instruções de 1 a 17 bytes de tamanho – um operando precisa agir como origem e destino – um operando pode vir da memória – modos de endereçamento complexos, por exemplo, “índice base ou escalado com deslocamento de 8 ou 32 bits” • Graça salvadora: – as instruções mais usadas não são difíceis de construir – os compiladores evitam as partes da arquitetura que são lentas “O que o 80x86 perde em estilo é compensado na quantidade, tornando-o belo, do ponto de vista apropriado” 39 Registradores e endereçamento de dados do IA-32 • Registradores no subconjunto de 32 bits que surgiram com o 80386 Nome Uso 31 0 EAX GPR0 ECX GPR1 EDX GPR2 EBX GPR3 ESP GPR4 EBP GPR5 ESI GPR6 EDI GPR7 EIP EFLAGS CS Ponteiro do segmento de código SS Ponteiro do segmento de pilha (topo da pilha) DS Ponteiro do segmento de dados 0 ES Ponteiro do segmento de dados 1 FS Ponteiro do segmento de dados 2 GS Ponteiro do segmento de dados 3 Ponteiro de instrução (PC) Códigos de condição 40 Restrições de registrador do IA-32 • Os registradores não são de “finalidade geral” — observe as restrições abaixo Modo Registrador indireto Descrição Restrições de registrador Equivalente MIPS Endereço está em um registrador. não ESP ou EBP lw $s0,0($s1) Modo base com 8 ou 32 bits de deslocamento Endereço é o conteúdo do registrador base mais deslocamento. não ESP ou EBP lw $s0,100($s1)#deslocamento £ 16 bits Base mais índice escalado x Índice), onde O endereço é Base + (2 Escala tem o valor 0, 1, 2 ou 3. Base: qualquer GPR Índice: não ESP mul $t0,$s2,4 add $t0,$t0,$s1 lw $s0,0($t0) Escala x Índice) + O endereço é Base + (2 deslocamento, onde Escala tem o valor 0, 1, 2 ou 3. Base: qualquer GPR Índice: não ESP mul $t0,$s2,4 add $t0,$t0,$s1 lw $s0,100($t0)#deslocamento £ 16 bits Base mais índice escalado com 8 ou 32 bits de deslocamento Escala FIGURA 2.42 Modos de endereçamento de 32 bits do IA-32 com restrições de registrador e o código MIPS equivalente. O modo de endereçamento Base mais Índice Escalado, que não aparece no MIPS ou no PowerPC, foi incluído para evitar as multiplicações por quatro (fator de escala 2) para transformar um índice de um registrador em um endereço em bytes (ver Figuras 2.34 e 2.36). Um fator de escala 1 é usado para dados de 16 bits, e um fator de escala 3 para dados de 64 bits. O fator de escala 0 significa que o endereço não é escalado. Se o deslocamento for maior do que 16 bits no segundo ou quarto modos, então o modo MIPS equivalente precisaria de mais duas instruções: um lui para ler os 16 bits mais altos do deslocamento e um add para somar a parte alta do endereço ao registrador base $s1 (a Intel oferece dois nomes diferentes para o que é chamado modo de endereçamento com base com base e indexado -, mas eles são basicamente idênticos, e os combinamos aqui). 41 Instruções típicas do IA-32 • Quatro tipos principais de instruções de inteiro: – Movimento de dados, incluindo move, push, pop – Aritmética e lógica (registrador de destino ou memória) – Fluxo de controle (uso de códigos de condição/flags) – Instruções de string, incluindo movimento e comparação de strings Instrução JE nome JMP nome CALL nome MOVW EBX,[EDI+45] PUSH ESI POP EDI ADD EAX,#6765 TEST EDX,#42 MOVSL Função se for igual(códigos de condição) {EIP=nome}; EIP-128 nome < EIP+128 EIP=nome SP=SP-4; M[SP]=EIP+5; EIP=nome; EBX=M[EDI+45] SP=SP-4; M[SP]=ESI EDI=M[SP]; SP=SP+4 EAX= EAX+6765 Define códigos de condição (flags) com EDX e 42 M[EDI]=M[ESI]; EDI=EDI+4; ESI=ESI+4 FIGURA 2.43 Algumas instruções IA-32 típicas e suas funções. Uma lista de operações freqüentes aparece na Figura 2.44. O CALL salva na pilha o EIP da próxima instrução (EIP é o PC da Intel). 42 Formatos de instruções IA-32 • Formatos típicos: (observe os diferentes tamanhos) a. JE EIP + deslocamento 4 4 8 CondiDeslocamento ção JE b. CALL 8 32 Deslocamento (offset) CALL c. MOV EBX, [EDI + 45] 6 1 1 8 8 MOV d w Pós-byte r/m Deslocamento d. PUSH ESI 5 3 PUSH Reg e. ADD EAX, #6765 4 3 1 32 Imediato ADD Reg w f. TEST EDX, #42 7 1 TEST w 8 Pós-byte 32 Imediato 43 Resumo • A complexidade da instrução é apenas uma variável – instrução mais baixa versus CPI mais alta/velocidade de clock mais baixa • Princípios de projeto: – a simplicidade favorece a regularidade – menor é mais rápido – um bom projeto exige comprometimento – torne o caso comum rápido • Arquitetura do conjunto de instruções – uma abstração muito importante! 44 Capítulo 3 45 Números • Bits são apenas bits (nenhum significado inerente) — convenções definem a relação entre bits e números • Números binários (base 2) 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001... decimal: 0...2n–1 • Obviamente, torna-se mais complicado: números são finitos (overflow) frações e números reais números negativos por exemplo, nenhuma instrução subi do MIPS; addi pode somar um número negativo • Como representamos os números negativos? Por exemplo, que padrões de bit representarão esses números? 46 Representações possíveis • Sinal e magnitude: 000 = +0 001 = +1 010 = +2 011 = +3 100 = –0 101 = –1 110 = –2 111 = –3 Complemento a um 000 = +0 001 = +1 010 = +2 011 = +3 100 = –3 101 = –2 110 = –1 111 = –0 Complemento a dois 000 = +0 001 = +1 010 = +2 011 = +3 100 = –4 101 = –3 110 = –2 111 = –1 • Questões: equilíbrio, número de zeros, facilidade de operações • Qual é o melhor? Por quê? 47 MIPS • Números de 32 bits com sinal: 0000 0000 0000 ... 0111 0111 1000 1000 1000 ... 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000bin = 0dec 0001bin = + 1dec 0010bin = + 2dec 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1110bin 1111bin 0000bin 0001bin 0010bin 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 1111 1111 1111 1111 1111 1111 = = = = = + + - 2,147,483,646dec 2,147,483,647dec 2,147,483,648dec 2,147,483,647dec 2,147,483,646dec maxint minint 1111bin = - 3dec 1111bin = - 2dec 1111bin = - 1dec 48 Operações de complemento a dois • Negar um número de complemento a dois: inverta todos os bits e some 1 – lembre-se: “negar” e “inverter” são muito diferentes! • Converter números de n bits em números com mais de n bits: – o campo imediato de 16 bits do MIPS é convertido em 32 bits para aritmética – copie o bit mais significativo (o bit de sinal) para os outros bits 0010 –> 0000 0010 1010 –> 1111 1010 • “extensão de sinal” (lbu versus lb) 49 Adição e subtração • Exatamente como aprendemos na escola (emprestar/subir 1s) 0111 + 0110 0111 – 0110 0110 – 0101 • Facilidade de operações do complemento a dois – subtração usando adição para números negativos 0111 + 1010 • Overflow (resultado muito grande para a word finita do computador): – por exemplo, somar dois números de n bits não produz um número de n bits 0111 + 0001 1000 note que o termo overflow é um pouco confuso; ele não significa que um carry “transbordou” 50 Detectando overflow • Nenhum overflow quando somar um número positivo com um negativo • Nenhum overflow quando sinais são iguais para subtração • O overflow ocorre quando o valor afeta o sinal: – overflow ao somar dois positivos produz um negativo – ou, somar dois negativos produz um positivo – ou, subtraia um negativo de um positivo e obtenha um negativo – ou, subtraia um positivo de um negativo e obtenha um positivo • Considere as operações A + B e A – B – Pode ocorrer overflow se B for 0? – Pode ocorrer overflow se A for 0? 51 Efeitos do overflow • Uma exceção (interrupção) ocorre – O controle salta para um endereço predefinido para exceção – O endereço interrompido é salvo para uma possível retomada • Detalhes baseados na linguagem/sistema de software – exemplo: controle de vôo versus dever de casa • Nem sempre desejamos detectar overflow – novas instruções MIPS: addu, addiu, subu – Nota: addiu – Nota: sltu, sltiu ainda com extensão de sinal para comparações sem sinal 52 Multiplicação • Mais complexa do que a adição – realizada através de deslocamento e adição • Mais tempo e mais área • Vejamos três versões baseadas em um algoritmo da escola 0010 x 1011 (multiplicando) (multiplicador) • Números negativos: converta e multiplique – existem técnicas melhores mas não as veremos 53 Multiplicação: Implementação Início Multiplicador0 = 1 Multiplicando 1. Testar Multiplicador0 Multiplicador0 = 0 1a. Soma multiplicando ao produto e coloca o resultado no registrador Produto Deslocar à esquerda 64 bits Multiplicador Deslocar à direita ALU de 64 bits 2. Deslocar registrador Multiplicando 1 bit à esquerda 32 bits Produto Escrever Teste de controle 3. Deslocar registrador Multiplicador 1 bit à direita 64 bits Não: < 32 repetições 32ª repetição? Caminho de dados Sim: 32 repetições Controle Fim 54 Versão final • O multiplicador inicia na metade direita do produto Início Produto0 = 1 1. Testar Produto0 Produto0 = 0 Multiplicando 32 bits ALU de 32 bits Deslocar à direita Produto Escrever Teste de controle 3. Desloque o registrador Produto 1 bit para a direita 64 bits 32ª repetição? O que entra aqui? Não: < 32 repetições Sim: 32 repetições Fim 55 Ponto flutuante (um breve exame) • Precisamos de uma maneira de representar – números com frações, por exemplo, 3,1416 – números muito pequenos, por exemplo, 0,000000001 – números muito grandes, por exemplo, 3,15576 × 109 • Representação: – sinal, expoente, significando: (–1)sinal × significando × 2expoente – mais bits para o significando fornece mais precisão • mais bits para o expoente aumenta a faixa • Padrão de ponto flutuante IEEE 754: – precisão única: expoente de 8 bits, significando de 23 bits – precisão dupla: expoente de 11 bits, significando de 52 bits 56 Padrão de ponto flutuante IEEE 754 • O bit “1” inicial do significando está implícito • O expoente é “desviado” para facilitar a classificação – todos os 0s são o menor expoente, todos os 1s são o maior – desvio do 127 para precisão única e do 1023 para precisão dupla – resumo: (–1)sinal × (1 + significando) × 2expoente – desvio • Exemplo: – decimal: –0,75 = – ( ½ + ¼ ) – binário: –0,11 = – 1,1 × 2–1 – ponto flutuante: expoente = 126 = 01111110 – precisão única IEEE: 10111111010000000000000000000000 57 Adição de ponto flutuante Expoente Sinal Fração Expoente Sinal Fração 1. Compare os expoentes dos dois números. Desloque o menor número para a direita até que seu expoente combine com o expoente maior. ALU pequena Diferença do expoente 0 Início 2. Some os significandos 0 1 0 1 3. Normalize a soma, deslocando para a direita e incrementando o expoente, ou deslocando para a esquerda e decrementando o expoente. Desloca à direita Controle 1 Overflow ou underflow? ALU grande Sim Não 0 0 1 Exceção 1 4. Arredonde o significando para o número de bits apropriado Incrementa ou decrementa Desloca para esquerda ou direita Não Hardware de arredondamento Ainda normalizado? Sim Sinal Expoente Fração Fim 58 Complexidades do ponto flutuante • As operações são um pouco mais complicadas (veja o texto) • Além do overflow podemos ter o “underflow” • A precisão pode ser um grande problema – O IEEE 754 mantém dois bits extras, guarda e arredondamento – quatro modos de arredondamento – positivo dividido por zero produz “infinidade” – zero dividido por zero não produz um número – outras complexidades • Implementar o padrão pode ser arriscado • Não usar o padrão pode ser ainda pior – veja no texto a descrição do 80x86 e o bug do Pentium! 59 Resumo do Capítulo 3 • A aritmética de computador é restrita por uma precisão limitada • Os padrões de bit não têm um significado inerente mas existem padrões – complemento a dois – ponto flutuante IEEE 754 • As instruções de computador determinam o “significado” dos padrões de bit • O desempenho e a precisão são importantes; portanto, existem muitas complexidades nas máquinas reais • A escolha do algoritmo é importante e pode levar a otimizações de hardware para espaço e tempo (por exemplo, multiplicação) • Você fazer uma revisão pode ser uma boa idéia (a Seção 3.10 é uma ótima leitura!) 60 Capítulo 4 61 Desempenho • Meça, informe e resuma • Faça escolhas inteligentes • Veja através da propaganda de marketing • Vital para entender a motivação organizacional subjacente Por que alguns hardwares são melhores do que outros para diferentes programas? Que fatores do desempenho de sistema são relacionados ao hardware? (por exemplo, precisamos de uma nova máquina ou de um novo sistema operacional?) Como o conjunto de instruções da máquina afeta o desempenho? 62 Qual destes aviões possui o melhor desempenho? Avião Passageiros Autonomia (milhas) Velocidade (milhas por hora) Boeing 737-100 101 630 598 Boeing 747 470 4150 610 BAC/Sud Concorde 132 4000 1350 Douglas DC-8-50 146 8720 544 • O quanto mais rápido é o Concorde comparado com o 747? • O quanto maior é o 747 do que o Douglas DC-8? 63 Desempenho do computador: TEMPO, TEMPO, TEMPO • Tempo de resposta (latência) – Quanto tempo leva para meu trabalho ser realizado? – Quanto tempo leva para realizar um trabalho? – Quanto tempo preciso esperar para a consulta ao banco de dados? • Vazão (throughput) – Quantos trabalhos a máquina pode realizar ao mesmo tempo? – Qual é a velocidade de execução média? – Quanto trabalho está sendo feito? • Se atualizarmos uma máquina com um novo processador, em que melhoramos? • Se acrescentarmos uma máquina ao laboratório, em que melhoramos? 64 Tempo de execução • Tempo decorrido – conta tudo (acessos a disco e a memória, E/S etc.) – um número útil, mas normalmente não é ideal para fins de comparação • Tempo de CPU – não conta E/S ou tempo gasto executando outros programas – pode ser dividido em tempo de sistema e tempo de usuário • Nosso foco: tempo de CPU do usuário – tempo gasto executando as linhas de código que estão “em” nosso programa 65 Definição de desempenho do livro • Para um programa sendo executado na máquina X, DesempenhoX = 1 / Tempo_execuçãoX • “X é n vezes mais rápido do que Y” DesempenhoX / DesempenhoY = n • Problema: – a máquina A executa um programa em 20 segundos – a máquina B executa o mesmo programa em 25 segundos 66 Ciclos de clock • Em vez de informar o tempo de execução em segundos, normalmente usamos ciclos segundos programa = ciclos programa x segundos ciclos • As marcações de clock indicam quando iniciar as atividades (uma abstração): tempo • tempo de ciclo = tempo entre as marcações = segundos por ciclo • velocidade de clock (freqüência) = ciclos por segundo (1 Hz. = 1 ciclo/segundo) Um clock de 4 Ghz possui um tempo de ciclo de 1 x 1012 =250 picosegundos (ps) 9 4 x 10 67 Como melhorar o desempenho segundos programa = ciclos programa x segundos ciclos • Portanto, para melhorar o desempenho (tudo mais sendo igual), você pode (aumentar ou diminuir?) o número de ciclos necessários para um programa, ou o tempo de ciclo de clock ou, dito de outra maneira, a velocidade de clock. 68 Quantos ciclos são necessários para um programa? . . . 6ª instrução 5ª instrução 4ª instrução 3ª instrução 2ª instrução 1ª instrução • Poderíamos considerar que o número de ciclos é igual ao número de instruções Tempo Essa suposição é incorreta; diferentes instruções levam diferentes períodos de tempo em diferentes máquinas. Por quê? Dica: lembre-se de que essas são instruções de máquina, não linhas de código C. 69 Diferentes números de ciclos para diferentes instruções tempo • A multiplicação leva mais tempo do que a adição • As operações de ponto flutuante levam mais tempo do que as operações de inteiros • Acessar a memória leva mais tempo do que acessar os registradores • Importante: Mudar o tempo de ciclo normalmente muda o número de ciclos necessários para várias instruções (veja mais posteriormente) 70 Exemplo • Nosso programa favorito é executado em 10 segundos no computador A, que possui um clock de 4 GHz. Estamos tentando ajudar um projetista de computador a construir uma nova máquina B, que execute esse programa em 6 segundos. O projetista determinou que um aumento substancial na velocidade de clock é possível, mas esse aumento afetará o restante do projeto da CPU, fazendo com que o computador B exija 1,2 vez mais ciclos de clock do que o computador A para esse programa. Que velocidade de clock devemos pedir para que o projetista almeje? • Não entre em pânico! Podemos resolver isso facilmente usando os princípios básicos 71 Agora que entendemos os ciclos • Um determinado programa exigirá – um determinado número de instruções (instruções de máquina) – um determinado número de ciclos – um determinado número de segundos • Temos um vocabulário que relaciona essas quantidades: – tempo de ciclo (segundos por ciclo) – velocidade de clock (ciclos por segundo) – CPI (ciclos por instrução) uma aplicação com excessivo uso de ponto flutuante pode ter uma CPI mais alta – MIPS (milhões de instruções por segundo) isso seria mais alto para um programa usando instruções simples 72 Desempenho • O desempenho é determinado pelo tempo de execução • Qualquer uma das outras variáveis igualam o desempenho? – número de ciclos para executar o programa? – número de instruções no programa? – número de ciclos por segundo? – número médio de ciclos por instrução? – número médio de instruções por segundo? • Armadilha comum: pensar que uma das variáveis é indicadora do desempenho, quando na realidade não é. 73 Exemplo de CPI • Suponha que tenhamos duas implementações da mesma arquitetura do conjunto de instruções (ISA) Para um determinado programa, A máquina A tem um tempo de ciclo de clock de 250 ps e uma CPI de 2,0 A máquina B tem um tempo de ciclo de clock de 500 ps e uma CPI de 1,2 Que máquina é mais rápida para esse programa e quão mais rápida ela é? • Se duas máquinas possuem a mesma ISA, qual de nossas quantidades (por exemplo, velocidade de clock, CPI, tempo de execução, número de instruções, MIPS) será sempre idêntica? 74 Exemplo de número de instruções • Um projetista de compilador está tentando decidir entre duas seqüências de código para um determinada máquina. Com base na implementação de hardware, existem três classes diferentes de instruções: Classe A, Classe B e Classe C, e elas exigem um, dois e três ciclos, respectivamente. A primeira seqüência de código possui 5 instruções: 2 de A, 1 de B e 2 de C. A segunda seqüência possui 6 instruções: 4 de A, 1 de B e 1 de C. Que seqüência será mais rápida? O quanto mais rápida? Qual é a CPI para cada seqüência? 75 Exemplo de MIPS • Dois compiladores diferentes estão sendo testados para uma máquina de 4 GHz com três classes diferentes de instruções: Classe A, Classe B e Classe C, e elas exigem um, dois e três ciclos, respectivamente. Ambos os compiladores são usados para produzir código para um grande software. O código do primeiro compilador usa 5 milhões de instruções da Classe A, 1 milhão de instruções da Classe B e 1 milhão de instruções da Classe C. O código do segundo compilador usa 10 milhões de instruções da Classe A, 1 milhão de instruções da Classe B e 1 milhão de instruções da Classe C. • Que seqüência será mais rápida de acordo com o MIPS? • Que seqüência será mais rápida de acordo com o tempo de execução? 76 Benchmarks • A melhor forma de determinar desempenho é executando uma aplicação real – Usa programas típicos do workload esperado – Ou, típico da classe de aplicações esperada — por exemplo, compiladores/editores, aplicações científicas, design gráfico etc. • Benchmarks pequenos – ótimos para arquitetos e projetistas – fácil de padronizar – pode ser forçado • SPEC (System Performance Evaluation Cooperative) – as empresas concordaram sobre um conjunto de programas e entradas reais – valioso indicador do desempenho (e da tecnologia do compilador) – ainda pode ser forçado 77 Jogos de benchmark • A Intel reconheceu, envergonhada, na sexta-feira que um bug em um programa de software conhecido como um compilador levou a empresa a anunciar uma velocidade 10 por cento maior dos seus chips microprocessadores em um benchmark da área. Entretanto, os analistas do setor disseram que o erro de codificação foi um comentário infeliz sobre uma prática comum de “mentir” nos testes de desempenho padronizados. O erro foi atribuído à Intel dois dias atrás pela concorrente Motorola, em um teste conhecido como SPECint92. A Intel reconheceu que havia “otimizado” seu compilador para melhorar suas pontuações de teste. A empresa também havia dito que não gostava da prática, mas que foi forçada a fazer as otimizações porque seus concorrentes estavam fazendo o mesmo. No coração do problema da Intel está a prática de “ajustar” os programas de compilador para reconhecerem certos problemas de computação no teste e, então, substituir por partes especiais do código escritas a mão. Sábado, 6 de janeiro de 1996 — New York Times 78 SPEC ‘89 • “Melhorias” e desempenho de compilador 800 700 Taxa de desempenho SPEC 600 500 400 300 200 100 0 gcc espresso spice doduc nasa7 li Benchmark eqntott matrix300 fpppp tomcatv Compilador Compilador melhorado 79 SPEC CPU2000 Benchmarks de inteiros Nome gzip vpr gcc mcf crafty parser eon perlbmk gap vortex bzip2 twolf Descrição Compactação Posicionamento e roteamento de circuitos FPGA O compilador C Gnu Otimização combinatória Programa de xadrez Programa de processamento de textos Visualização por computador Aplicação Perl Teoria de grupo, interpretador Banco de dados orientado a objetos Compactação Simulador de posicionamento e roteamento de circuitos Benchmarks de ponto flutuante Nome Wupwise Swim Mgrid Applu Mesa Galgel Art Equake Facerec Ammp Lucas Fma3d Sixtrack Apsi Tipo Cromodinâmica Quântica Modelo de água rasa Solver multigrade no campo 3D potencial Equação diferencial parcial parabólica/elíptica Biblioteca de gráficos tridimensionais Dinâmica computacional de fluidos Reconhecimento de imagem usando redes neurais Simulação de propagação de ondas sísmicas Reconhecimento de imagem de rostos Química computacional Teste de primalidade Simulação de choque usando método de elementos finitos Projeto de acelerador de física nuclear de alta energia Meteorologia: distribuição de poluentes FIGURA 4.5 Os benchmarks SPEC CPU2000. Os 12 benchmarks de inteiros no lado esquerdo da tabela são escritos em C e C++, enquanto os benchmarks de ponto flutuante no lado direito são escritos em Fortran (77 ou 90) e em C. Para obter mais informações sobre o SPEC e os benchmarks SPEC, veja www.spec.org. Os benchmarks SPEC CPU usam o tempo de relógio como métrica, mas, como há pouca E/S, eles medem o desempenho da CPU. 80 SPEC 2000 Dobrar a velocidade de clock dobra o desempenho? Uma máquina com uma velocidade de clock mais lenta pode ter um desempenho melhor? 81 Experiência • Telefone para um grande vendedor de computadores e diga que você está com dificuldade de decidir entre dois computadores diferentes, especificamente, que está confuso quanto aos pontos fortes e fracos dos processadores (Por exemplo, entre Pentium 4 2Ghz e Celeron M 1.4 Ghz) • Que tipo de resposta você provavelmente receberá? • Que tipo de resposta você poderia dar a um amigo com a mesma dúvida? 82 Lei de Amdahl Tempo de execução após melhoria = Tempo de execução não afetado + (Tempo de execução afetado / Quantidade de melhoria) • Exemplo: “Suponha que um programa seja executado em 100 segundos em uma máquina, com multiplicação responsável por 80 segundos desse tempo. O quanto precisamos melhorar a velocidade da multiplicação se queremos que o programa seja executado 4 vezes mais rápido?” Que tal torná-lo 5 vezes mais rápido? • Princípio: torne o caso comum rápido 83 Exemplo • Suponha que melhoramos uma máquina fazendo todas as instruções de ponto flutuante serem executadas cinco vezes mais rápido. Se o tempo de execução de algum benchmark antes da melhoria do ponto flutuante é 10 segundos, qual será o aumento de velocidade se metade dos 10 segundos é gasta executando instruções de ponto flutuante? • Estamos procurando um benchmark para mostrar a nova unidade de ponto flutuante descrita acima e queremos que o benchmark geral mostre um aumento de velocidade de 3 vezes. Um benchmark que estamos considerando é executado durante 100 segundos com o hardware de ponto flutuante antigo. Quanto do tempo de execução as instruções de ponto flutuante teriam que considerar para produzir nosso aumento de velocidade desejado nesse benchmark? 84 Lembre-se • O desempenho é específico a um determinado programa – O tempo de execução total é um resumo consistente do desempenho • Para uma determinada arquitetura, os aumentos de desempenho vêm de: • aumentos na velocidade de clock (sem efeitos de CPI adversos) – melhorias na organização do processador que diminuem a CPI – melhorias no compilador que diminuem a CPI e/ou a contagem de instruções – escolhas de algoritmo/linguagem que afetam a contagem de instruções • Armadilha: esperar que a melhoria em um aspecto do desempenho de uma máquina afete o seu desempenho total 85 Vamos construir um processador • Estamos quase prontos para entrar no Capítulo 5 e iniciar a construção de um processador • Primeiro, vamos revisar a lógica booleana e construir a ALU de que precisaremos (material do Apêndice B) operação a 32 ALU resultado 32 b 32 86 Revisão: Álgebra booleana e portões • Problema: Considere uma função lógica com três entradas: A, B e C. A saída D é verdadeira se pelo menos uma entrada for verdadeira A saída E é verdadeira se exatamente duas entradas forem verdadeiras A saída F é verdadeira apenas se todas as três entradas forem verdadeiras • Mostre a tabela de verdade para essas três funções. • Mostre as equações booleanas para essas três funções. • Mostre a implementação consistindo de portões inversores, AND e OR. 87 Uma ALU (unidade lógica aritmética) • Vamos construir uma ALU para dar suporte às instruções andi e ori – construiremos apenas uma ALU de 1 bit e usaremos 32 deles operação a op a b res resultado b • Implementação possível (soma-dos-produtos): 88 Revisão: o multiplexador • Seleciona uma das entradas para ser a saída, com base em uma entrada de controle S Nota: chamamos isso de um mux de duas entradas, mesmo que ele tenha três entradas! A 0 B 1 C • Vamos construir nossa ALU usando um MUX: 89 Diferentes implementações • Não é fácil decidir a “melhor” maneira de construir algo – não queremos entradas demais em um único portão – não queremos ter que atravessar muitos portões – para nossos objetivos, a facilidade de compreensão é importante • Vejamos uma ALU de 1 bit para adição: CarryIn a Sum cout = a b + a cin + b cin sum = a xor b xor cin b CarryOut • Como poderíamos construir uma ALU de 1 bit para add, and e or? • Como poderíamos construir uma ALU de 32 bits? 90 Construindo uma ALU de 32 bits Operação CarryIn a0 b0 CarryIn ALU0 CarryOut Resultado0 CarryIn ALU1 CarryOut Resultado1 CarryIn ALU2 CarryOut Resultado2 Operação CarryIn a1 a b1 0 1 Resultado a2 b2 b + CarryOut 2 .. . a31 b31 .. . CarryIn ALU31 .. . Resultado31 91 E quanto à subtração (a – b)? • Método do complemento a dois: simplesmente negue b e some. • Como negamos? • Uma solução muito inteligente: Binvert Operação CarryIn a 0 1 b 0 + Resultado 2 1 CarryOut 92 Acrescentando uma função NOR • Também podemos escolher inverter a. Como obtemos um “a NOR b”? Operação Ainvert Binvert a CarryIn 0 0 1 1 b 0 + Resultado 2 1 CarryOut 93 Adequando a ALU ao MIPS • Precisamos oferecer suporte à instrução set-on-less-than (slt) • lembre-se: slt é uma instrução aritmética – produz um 1 se rs < rt e produz um 0 em caso contrário – use subtração: (a–b) < 0 implica a < b • Precisamos aceitar teste de igualdade (beq $t5, $t6, $t7) • use subtração: (a–b) = 0 implica a = b 94 Suporte a slt • Podemos imaginar a idéia? Binvert Binvert CarryIn CarryIn a a Operação Ainvert Operação Ainvert 0 0 0 0 1 1 1 1 Resultado Resultado b 0 + b 0 + 2 2 1 1 Less Less 3 3 Set CarryOut Detecção de overflow Overflow Todos os outros bits Use esta ALU para o bit mais significativo 95 Suporte a slt Operação Binvert Ainvert CarryIn a0 b0 CarryIn ALU0 Less CarryOut Resultado0 a1 b1 0 CarryIn ALU1 Less CarryOut Resultado1 a2 b2 0 CarryIn ALU2 Less CarryOut Resultado2 .. . . .. . . .. .. a31 b31 0 .. . CarryIn CarryIn ALU31 Less .. . Resultado31 Set Overflow 96 Teste de igualdade • Observe as linhas de controle: Operação Bnegate Ainvert 0000 0001 0010 0110 0111 1100 = = = = = = and or add subtract slt NOR a0 b0 CarryIn ALU0 Less CarryOut a1 b1 0 CarryIn ALU1 Less CarryOut CarryIn ALU2 Less CarryOut a2 b2 0 • Nota: zero é um 1 quando o resultado é zero! .. . . .. . .. .. . a31 b31 0 Result0 Result1 .. . Result2 .. . CarryIn CarryIn ALU31 Less Zero .. . .. . Result31 Set Overflow 97 Conclusão • Podemos construir uma ALU para aceitar o conjunto de instruções MIPS – idéia básica: usar um multiplexador para selecionar a saída que desejamos – podemos realizar subtração eficientemente usando o complemento a dois – podemos duplicar uma ALU de 1 bit para produzir uma ALU de 32 bits • Pontos importantes sobre hardware – todos os portões estão sempre operando – a velocidade de um portão é influenciada pelo número de entradas do portão – a velocidade de um circuito é influenciada pelo número de portões na série (no “caminho crítico” ou no “nível mais profundo da lógica”) • Nosso foco principal: compreensão; entretanto, – Mudanças inteligentes na organização podem melhorar o desempenho (semelhante a usar melhores algoritmos no software) – Vimos isso na multiplicação; agora vejamos na adição 98 Problema: o somador com carry ripple é lento • Uma ALU de 32 bits é tão rápida quanto uma ALU de 1 bit? • Existe mais de uma maneira de fazer adição? – dois extremos: carry ripple e soma-de-produtos Você consegue ver o ripple? Como você se livraria dele? c1 c2 c3 c4 = = = = b 0 c0 b 1 c1 b 2 c2 b 3 c3 + + + + a 0 c0 a 1 c1 a 2 c2 a 3 c3 + + + + a0b0 a1b1c2 = a2b2 c3 = a3b3 c4 = Inviável! Por quê? 99 Somador com carry look-ahead • Um método intermediário entre nossos dois extremos • Motivação: – Se não soubéssemos o valor do carry-in, o que poderíamos fazer? – Quando sempre geraríamos um carry? g i = a i bi – Quando propagaríamos o carry? p i = ai + bi • Nos livramos do ripple? c1 c2 c3 c4 = = = = g0 g1 g2 g3 + + + + p 0 c0 p 1 c1 p 2 c2 p 3 c3 c2 = c3 = c4 = Viável! Por quê? 100 Use princípio para construir somadores maiores CarryIn a0 b0 a1 b1 a2 b2 a3 b3 a4 b4 a5 b5 a6 b6 a7 b7 a8 b8 a9 b9 a10 b10 a11 b11 a12 b12 a13 b13 a14 b14 a15 b15 CarryIn Resultado0–3 ALU0 P0 G0 pi gi C1 ci + 1 CarryIn Unidade de carry lookahead Resultado4–7 • Não podemos construir um somador de 16 bits dessa maneira... (grande demais) ALU1 P1 G1 pi + 1 gi + 1 C2 • Poderíamos usar o carry ripple dos ci + 2 CarryIn somadores CLA de 4 bits Resultado8–11 • Melhor ainda: use o princípio CLA novamente! ALU2 P2 G2 pi + 2 gi + 2 C3 ci + 3 CarryIn Resultado12–15 ALU3 P3 G3 pi + 3 gi + 3 C4 CarryOut ci + 4 101 Resumo da ALU • • • • Podemos construir uma ALU para aceitar adição MIPS Nosso foco está na compreensão, não no desempenho Processadores reais usam técnicas mais sofisticadas para aritmética Onde o desempenho não é vital, as linguagens de descrição de hardware permitem que os projetistas automatizem completamente a criação do hardware! module MIPSALU (ALUctl, A, B, ALUOut, Zero); input [3:0] ALUctl; input [31:0] A,B; output reg [31:0] ALUOut; output Zero; assign Zero = (ALUOut==0); // Zero é verdadeiro se ALUOut é 0; vai para algum lugar always @(ALUctl, A, B) // reavalia se estes mudarem case (ALUctl) 0: ALUOut <= A & B; 1: ALUOut <= A | B; 2: ALUOut <= A + B; 6: ALUOut <= A - B; 7: ALUOut <= A < B ? 1:0; 12: ALUOut <= ~(A | B); // resultado é nor default: ALUOut <= 0; // default é 0, não deverá acontecer; endcase endmodule FIGURA B4.3 Uma definição comportamental em Verilog de uma ALU MIPS. Isso poderia ser sintetizado por meio de uma biblioteca de módulos contendo operações aritméticas e lógicas básicas. 102 Capítulo 5 103 O processador: caminho de dados e controle • Estamos prontos para ver uma implementação do MIPS • Simplificada para conter apenas: – instruções de referência à memória: lw, sw – instruções lógicas e aritméticas: add, sub, and, or, slt – instruções de fluxo de controle: beq, j • Implementação genérica: – use o contador de programa (PC) para fornecer endereço de instrução – obtenha a instrução da memória – leia os registradores – use a instrução para decidir exatamente o que fazer • Todas as instruções usam a ALU após lerem os registradores Por quê? Referência à memória? Aritmética? Fluxo de controle? 104 Mais detalhes de implementação • Visão abstrata/simplificada: 4 Add Add Dados PC Endereço Instrução Memória de instruções Nº do Registrador Registradores Nº do Registrador Nº do Registrador ALU Endereço Memória de dados Dados Dois tipos de unidades funcionais: – elementos que operam nos valores de dados (combinacionais) – elementos que contêm estado (seqüenciais) 105 Elementos de estado • Sem clock versus com clock • Clocks usados na lógica síncrona – quando um elemento que contém estado deve ser atualizado? Transição de descida Período de clock Transição de subida tempo de ciclo 106 Um elemento de estado sem clock • O trinco set-reset – a saída depende das entradas presentes e também das entradas passadas R Q Q S 107 Trincos e flip-flops • A saída é igual ao valor armazenado dentro do elemento (não é necessário pedir permissão para olhar o valor) • A mudança do estado (valor) é baseada no clock • Trincos: sempre que as entradas mudarem e o clock for afirmado • Flip-flop: o estado muda apenas em uma transição de clock (metodologia de acionamento por transição) “Logicamente verdadeiro” — poderia significar eletricamente baixo Uma metodologia de clocking define quando os sinais podem ser lidos e quando podem ser escritos — não desejaríamos ler um sinal ao mesmo tempo em que ele estivesse sendo escrito 108 Trinco D • Duas entradas: – o valor de dados a ser armazenado (D) – o sinal de clock (C) indicando quando ler e armazenar D • Duas saídas: – o valor do estado interno (Q) e seu complemento C Q D C Q Q D 109 Flip-flop D • A saída muda apenas na transição do clock D Q D C Q D D latch D latch C Q Q Q C D C Q 110 Nossa implementação • Uma metodologia de acionamento por transição • Execução típica: – ler conteúdo de alguns elementos de estado, – enviar valores através de alguma lógica combinacional – escrever os resultados em um ou mais elementos de estado Elemento de estado 1 Lógica combinacional Elemento de estado 2 Ciclo de clock 111 Arquivo de registrador • Construído usando flip-flops D Registrador de leitura número 1 Registrador 0 Registrador 1 ... Registrador de leitura número 1 Registrador de leitura número 2 Banco de registradores Registrador para escrita Dados para escrita Registrador n – 2 Dados da leitura 1 Dados da leitura 2 M u x Dados da leitura 1 M u x Dados da leitura 2 Registrador n – 1 Registrador de leitura número 2 Write Você entende? Qual é o “Mux” acima? 112 Abstração • Certifique-se de ter entendido as abstrações! • Algumas vezes é fácil achar que entendeu, quando não entendeu Select A31 Select B31 A B M u x C31 32 32 M u x 32 C A30 B30 M u x C30 .. . .. . A0 B0 M u x C0 113 Arquivo de registrador • Nota: ainda usamos o clock real para determinar quando escrever Escrita C 0 1 Número do registrador Decodificador n-para-2n Registrador 0 .. . D C Registrador 1 n –1 n D .. . C Registrador n – 2 D C Registrador n – 1 Dados para o registrador D 114 Implementação simples • Inclui as unidades funcionais de que precisamos para cada instrução Endereço de instrução EscreveMem Instrução Add Soma PC Memória de instruções a. Memória de instruções b. Contador de programa c. Somador Endereço Dados para escrita Dados da leitura Memória de dados 16 Extensão de sinal 32 LeMem a. Unidade de memória de dados b. Unidade de extensão de sinal 5 Números dos registradores 5 5 Dados Registrador de leitura 1 4 Dados da leitura 1 Registrador de leitura 2 Registradores Registrador para escrita Dados da leitura 2 Dados para escrita Dados Operação da ALU Zero ALU Resultado da ALU Por que precisamos disso? EscreveReg a. Registradores b. ALU 115 Construindo o caminho de dados • Use multiplexadores para uni-los OrigPC M u x Add Add 4 Deslocamento de 2 à esquerda PC Endereço de Leitura Instrução Memória de instruções Registrador de leitura 1 OrigALU Dados da leitura 1 Operação da ALU EscreveMem Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita M u x Dados para escrita Zero ALU Resultado da ALU MemparaReg Endereço Dados da leitura M u x Memória Dados de dados para escrita EscreveReg 16 4 Resultado da ALU Extensão de sinal 32 LeMem 116 Controle • Selecionar as operações a serem realizadas (ALU, leitura/escrita etc.) • Controlar o fluxo de dados (entradas do multiplexador) • Informações vêm dos 32 bits da instrução • Exemplo: add $8, $17, $18 Formato de instrução: 000000 10001 10010 01000 00000 100000 op rs rt rd shamt funct • Operação da ALU com base no tipo de instrução e código de função 117 Controle • Por exemplo, o que a ALU deve fazer com essa instrução • Exemplo: lw $1, 100($2) 35 2 1 op rs rt 100 offset de 16 bits • Entrada do controle da ALU 0000 0001 0010 0110 0111 1100 AND OR add subtract set-on-less-than NOR • Por que o código para subtrair é 0110 e não 0011? 118 Controle • Precisa descrever hardware para calcular entrada de controle da ALU de 4 bits – tipo de instrução dada 00 = lw, sw 01 = beq, OpALU calculado do tipo de instrução 10 = aritmética – código de função para aritmética • Descreva-o usando uma tabela verdade (pode se tornar portões): OpALU Campo func. OpALU1 OpALU 0 F5 F4 F3 F2 F1 F0 Operação 0 X 1 1 1 1 1 0 1 X X X X X X X X X X X X X X X X X X X X X 0 0 0 0 1 X X 0 0 1 1 0 X X 0 1 0 0 1 X X 0 0 0 1 0 0010 0110 0010 0110 0000 0001 0111 FIGURA 5.13 A tabela verdade para os três bits de controle da ALU (chamados Operação). As entradas são OpALU e o campo de código func. Apenas as entradas para as quais o controle da ALU é ativado são mostradas. Algumas entradas “don’t care” foram incluídas. Por exemplo, como OpALU não usa a codificação 11, a tabela verdade pode conter entradas 1X e X1, em vez de 10 e 01. Além disso, quando o campo func é usado, os dois primeiros bits (F5 e F4) dessas instruções são sempre 10; portanto, eles são termos don’t care e são substituídos por XX na tabela verdade. 119 Add 4 Instrução [31:26] PC Endereço de Leitura RegDst Branch LeMem MemparaReg OpALU EscreveMem OrigALU EscreveReg Instrução [25:21] Registrador de leitura 1 Instrução [20:16] Registrador de leitura 2 Instrução [31:0] Memória de instruções Controle Instrução [15:11] Instrução [15:0] 0 M u x 1 Registrador para escrita Dados da leitura 1 Dados da leitura 2 1 M u x 0 Dados para escrita Registradores 16 Extensão de sinal Resultado Add da ALU Deslocamento de 2 à esquerda Zero ALU Resultado da ALU 0 M u x 1 Endereço Dados da leitura 1 M u x 0 Dados Memória para de dados escrita 32 Controle da ALU Instrução [5:0] Instrução formato R lw sw beq RegDst 1 0 X X OrigALU 0 1 1 0 Mempara Reg 0 1 X X Escreve Reg 1 1 0 0 Le Mem 0 1 0 0 Escreve Mem 0 0 1 0 Branch 0 0 0 1 ALUOpl 1 0 0 0 ALUOp0 0 0 0 1 120 Controle • Lógica combinacional simples (tabelas verdade) Entradas Op5 Op4 Op3 Op2 OpALU Op1 Bloco de controle da ALU Op0 OpALU0 OpALU1 Saídas F3 F2 F (5–0) Operação 1 Operation Iw sw beq RegDst OrigALU MemparaReg F1 Operação 0 F0 Formato R Operação 2 EscreveReg LeMem EscreveMem Branch OpALU1 OpALU0 121 Nossa estrutura de controle simples • Toda a lógica é combinacional • Esperamos que tudo se acalme e a coisa certa seja feita – a ALU pode não produzir a “resposta certa” imediatamente – usamos sinais de escrita junto com o clock para determinar quando escrever • Tempo de ciclo determinado pela duração do caminho mais longo Elemento de estado 1 Lógica combinacional Elemento de estado 2 Ciclo de clock Estamos ignorando alguns detalhes como tempos de setup e hold 122 Implementação de ciclo único • Calcule o tempo de ciclo considerando os retardos insignificantes, exceto: – memória (200ps), ALU e somadores (100ps) acesso ao arquivo de registrador (50ps) OrigPC M u x Add Add 4 Deslocamento de 2 à esquerda PC Endereço de Leitura Instrução Memória de instruções Registrador de leitura 1 OrigALU Dados da leitura 1 Operação da ALU EscreveMem Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita M u x Dados para escrita Zero ALU Resultado da ALU MemparaReg Endereço Dados da leitura M u x Memória Dados de dados para escrita EscreveReg 16 4 Resultado da ALU Extensão de sinal 32 LeMem 123 Nosso direcionamento • Problemas de ciclo único: – e se tivéssemos uma instrução mais complicada, como ponto flutuante? – desperdício de área • Uma solução: – usar um tempo de ciclo “menor” – fazer com que diferentes instruções usem diferentes números de ciclos – um caminho de dados “multiciclo”: PC Endereço Registrador de instrução A Nº do Registrador Registradores Nº do Registrador Instrução Memória ou dados Dados Dados Registrador de dados da memória ALU SaídaALU B Nº do Registrador 124 Método multiciclo • Vamos reutilizar unidades funcionais – ALU usada para calcular endereço e incrementar o PC – Memória usada para instrução e dados • Nossos sinais de controle não serão determinados diretamente pela instrução – por exemplo, o que a ALU deve fazer para uma instrução “subtração”? • Usaremos uma máquina de estado finito para controle 125 Método multiciclo • Divida as instruções em etapas, cada uma durando um ciclo – equilibre a quantidade de trabalho a ser feito – restrinja cada ciclo para usar apenas uma unidade funcional • No final de um ciclo – armazene os valores para uso em ciclos posteriores (a coisa mais fácil a fazer) – introduza registradores “internos” adicionais PC 0 M u x 1 Endereço Memória DadosMem Dados para escrita Instrução [25:21] Instrução [20:16] Instrução [15:0] Registrador de instrução Instrução [15:0] Registrador de dados da memória 0 M u x 1 Registrador de leitura 1 Instrução [15:11] 0 M u x 1 0 M u x 1 16 Dados da Registrador leitura 1 de leitura 2 Registradores Registrador Dados da para escrita leitura 2 Dados para escrita Extensão 32 de sinal A B 4 Zero ALU Resultado da ALU SaídaALU 0 1 M u 2 x 3 Deslocamento de 2 à esquerda 126 Instruções da perspectiva da ISA • Considere cada instrução da perspectiva da ISA. • Exemplo: – A instrução add muda um registrador. – Registrador especificado pelos bits 15:11 da instrução. – Instrução especificada pelo PC. – Novo valor é a soma (“op”) dos dois registradores. – Registradores especificados pelos bits 25:21 e 20:16 da instrução Reg[Memory[PC][15:11]] <= Reg[Memory[PC][25:21]] op Reg[Memory[PC][20:16]] – Para conseguir isso, precisamos desmembrar a instrução (um tanto como introduzir variáveis ao programar). 127 Desmembrando uma instrução • Definição ISA da aritmética: Reg[Memory[PC][15:11]] <= Reg[Memory[PC][25:21]] op Reg[Memory[PC][20:16]] • Poderia ser dividida em: – IR <= Memory[PC] – A <= Reg[IR[25:21]] – B <= Reg[IR[20:16]] – ALUOut <= A op B – Reg[IR[20:16]] <= ALUOut • Esquecemos uma parte importante da definição da aritmética! – PC <= PC + 4 128 Conceito subjacente do método multiciclo • Definimos cada instrução da perspectiva ISA (faça isso!) • Divida-a em etapas seguindo nossa regra de que os dados fluem através de, no máximo, uma grande unidade funcional (por exemplo, distribua o trabalho entre as etapas) • Introduza novos registradores conforme necessário (por exemplo, A, B, ALUOut, MDR, etc.) • Finalmente, experimente concentrar o máximo em cada etapa (evite ciclos desnecessários), enquanto também tenta compartilhar etapas quando possível (minimiza o controle e ajuda a simplificar a solução) • Resultado: a implementação multiciclo do nosso livro! 129 Cinco etapas de execução • Busca da instrução • Decodificação da instrução e busca dos registradores • Execução, cálculo do endereço de memória ou conclusão do desvio • Acesso à memória ou conclusão da instrução tipo R • Etapa de escrita adiada (write-back) AS INSTRUÇÕES LEVAM DE 3 A 5 CICLOS! 130 Etapa 1: Busca da instrução • Use o PC para obter a instrução e colocá-la no registrador Instrução. • Incremente o PC em 4 e coloque o resultado novamente no PC. • Pode ser descrita brevemente usando a RTL (Register-Transfer Language — linguagem de transferência de registrador) IR <= Memory[PC]; PC <= PC + 4; Podemos descobrir os valores dos sinais de controle? Qual é a vantagem de atualizar o PC agora? 131 Etapa 2: Decodificação da instrução e busca dos registradores • Leia os registradores rs e rt no caso de precisarmos deles • Calcule o endereço de desvio no caso de a instrução ser um branch • RTL: A <= Reg[IR[25:21]]; B <= Reg[IR[20:16]]; ALUOut <= PC + (sign-extend(IR[15:0]) < 2); • Não estamos definindo quaisquer linhas de controle com base no tipo de instrução (estamos ocupados “decodificando-a” em nossa lógica de controle) 132 Etapa 3 (dependente da instrução) • ALU está desempenhando uma de três funções, com base no tipo de instrução – Referência à memória: ALUOut <= A + sign-extend(IR[15:0]); – Tipo R: ALUOut <= A op B; – Branch: if (A==B) PC <= ALUOut; 133 Etapa 4: (Tipo R ou acesso à memória) • Loads e stores acessam a memória MDR <= Memory[ALUOut]; ou Memory[ALUOut] <= B; • Instruções Tipo R terminam Reg[IR[15:11]] <= ALUOut; A escrita na verdade ocorre no final do ciclo na transição 134 Etapa 5: Escrita adiada • Reg[IR[20:16]] <= MDR; Que instrução precisa disso? 135 Resumo Etapa Ação para instruções tipo R Ação para instruções de acesso à memória Busca da instrução Ação para jumps IR <= Memória[PC] PC <= PC + 4 Decodificação da instrução e busca dos registradores A <= Reg[IR[25:21]] B <= Reg[IR[20:16]] SaídaALU <= PC + (estende-sinal (IR[15:0]) << 2) Execução, cálculo do endereço, conclusão do desvio/jump SaídaALU <= A op B SaídaALU <= A + estende-sinal (IR[15:0]) Acesso à memória ou conclusão de instrução tipo R Reg[IR[15:11]]<= SaídaALU Load: MDR <= Memória[SaídaALU] ou Store: Memória [SaídaALU] <= B Conclusão da leitura da memória Ação para desvios if (A == B) PC <= SaídaALU PC <= {PC [31:28], (IR[25:0]],2’b00)} Load: Reg[IR[20:16]] <= MDR FIGURA 5.30 Resumo das etapas realizadas para executar qualquer classe de instrução. As instruções levam de três a cinco etapas de execução. As duas primeiras etapas são independentes da classe de instrução. Após essas etapas, uma instrução leva ainda de um a três ciclos para ser concluída, dependendo da classe de instrução. As entradas vazias da etapa de acesso à memória ou a etapa de conclusão da leitura da memória indicam que a classe de instrução específica leva menos ciclos. Em uma implementação multiciclo, uma nova instrução será iniciada tão logo a instrução atual seja concluída; portanto, esses ciclos não são ociosos ou desperdiçados. Na verdade, como mencionado anteriormente, o banco de registradores lê todos os ciclos, mas, como o IR não muda, os valores lidos do banco de registradores são idênticos. Em especial, o valor lido para o registrador B durante a etapa de decodificação da instrução, para uma instrução de desvio ou tipo R, é o mesmo valor armazenado em B durante a etapa de execução e, depois, usado na etapa de acesso à memória para uma instrução store word. 136 Perguntas simples • Quantos ciclos serão necessários para executar este código? lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label add $t5, $t2, $t3 sw $t5, 8($t3) Label: ... #considere not • O que está ocorrendo durante o 8º ciclo da execução? • Em que ciclo ocorre a adição real de $t2 e $t3? 137 OrigPC EscrevePCCond EscrevePC Saídas IouD LeMem Controle EscreveIR OrigBALU OrigAALU EscreveMem MemparaReg OpALU EscreveReg Op [5:0] RegDst 26 Instrução [25:0] PC 0 M u x 1 Instrução [31:26] Endereço Memória DadosMem Dados para escrita Instrução [25:21] Instrução [20:16] Instrução [15:0] Registrador de instrução Instrução [15:0] Registrador de dados da memória Instrução [15:11] 0 M u x 1 0 M u x 1 16 Registrador de leitura 1 Dados da Registrador leitura 1 de leitura 2 Registradores Registrador Dados para escrita da Dados para leitura 2 A 28 B Deslocamento de 2 à esquerda 4 Endereço do jump [31:0] 0 M 1 u x 2 PC [31:28] ALU Zero Resultado da ALU escrita Extensão 32 de sinal 0 M u x 1 Deslocamento de 2 à esquerda SaídaALU 0 1 M u 2 x 3 Controle da ALU Instrução [5:0] 138 Revisão: Máquinas de estado finito • Máquinas de estado finito: – um conjunto de estados e – próxima função de estado (determinada pelo estado atual e pela entrada) – função de saída (determinada pelo estado atual e possivelmente pela entrada) Próximo estado Estado atual Função de próximo estado Clock Entradas Função de saída Saídas – Usaremos uma máquina de Moore (saída com base apenas no estado atual) 139 Revisão: Máquinas de estado finito • Exemplo: B.37 Um amigo gostaria que você construísse um “olho eletrônico” para ser usado como um dispositivo de segurança falso. O dispositivo consiste em três luzes alinhadas, controladas pelas saídas Esquerda, Centro e Direita, que, se afirmadas, indicam que uma luz deve ser ligada. Apenas uma luz é acesa de cada vez, e a luz “move-se” da esquerda para a direita e, depois, da direita para a esquerda, afugentando, assim, os ladrões, que acreditam que o dispositivo está monitorando suas ações. Desenhe uma representação gráfica para a máquina de estado finito usada para especificar o olho eletrônico. Note que a velocidade do movimento do olho será controlada pela velocidade do clock (que não deve ser muito alta) e que basicamente não existem entradas. 140 Implementando o controle • O valor dos sinais de controle depende de: – que instrução está sendo executada – que etapa está sendo realizada • Use as informações que acumulamos para especificar uma máquina de estado finito – especifique a máquina de estado finito graficamente ou – use microprogramação • A implementação pode ser derivada da especificação 141 Busca da instrução Busca dos registradores/ LeMem decodificação da instrução OrigAALU = 0 1 IouD = 0 OrigAALU = 0 EscreveIR OrigBALU = 11 OrigBALU = 01 OpALU = 00 OpALU = 00 EscrevePC OrigPC = 00 Especificação gráfica da FSM 0 Início • Nota: – não se preocupe se não for mencionada necessários? Cálculo do endereço de memória 2 (Op 8 OrigAALU = 1 OrigBALU = 00 OpALU = 10 OrigAALU = 1 OrigBALU = 00 OpALU = 01 EscrevePCCond OrigPC = 01 Conclusão do jump 9 EscrevePC OrigPC = 10 p = W 'S ') Acesso à memória Acesso à memória 5 LeMem IouD = 1 4 6 (O 3 Conclusão do branch Execução OrigAALU = 1 OrigBALU = 10 OpALU = 00 = 'B EQ ') R) o tip = p (O (Op = 'LW') • Quantos bits de estado serão p= (O – caso contrário, valor exato 'SW u( )o ' 'LW = Op (Op = 'J') ') – afirmada se apenas nome EscreveMem IouD = 1 Conclusão de tipo R 7 RegDst = 1 EscreveReg MemparaReg = 0 Etapa de conclusão da leitura de memória RegDst = 1 EscreveReg MemparaReg = 0 142 Máquina de estado finito para controle • Implementação: EscrevePC EscrevePCCond IouD LeMem EscreveMem EscreveIR MemparaReg Lógica de controle OrigPC Saídas OpALU OrigBALU OrigAALU EscreveReg RegDst NS3 NS2 NS1 NS0 Registrador de instrução Campo opcode S0 S1 S2 S3 Op0 Op1 Op2 Op3 Op4 Op5 Entradas Registrador de estado 143 Implementação PLA • Se seu selecionasse uma linha horizontal ou vertical, você poderia explicá-la? 144 Implementação da ROM • ROM = “Read Only Memory” – os valores dos locais de memória são fixados antecipadamente • Uma ROM pode ser usada para implementar uma tabela verdade – se o endereço for m bits, podemos endereçar 2m entradas na ROM. – nossas saídas são os bits de dados para os quais o endereço aponta. m n 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 m é a “altura” e n é a “largura” 145 Implementação da ROM • Quantas entradas existem? 6 bits para opcode, 4 bits para estado = 10 linhas de endereço (por exemplo, 210 = 1024 endereços diferentes) • Quantas saídas existem? 16 saídas do controle do caminho de dados, 4 bits de estado = 20 saídas • A ROM possui 210 x 20 = 20K bits (e um tamanho bastante incomum) • Muito ineficiente, já que, para muitas das entradas, as saídas são iguais – por exemplo, opcode freqüentemente é ignorado 146 ROM versus PLA • Divida a tabela em duas partes – 4 bits de estado indicam as 16 saídas, 24 × 16 bits de ROM – 10 bits informam os próximos 4 bits de estado, 210 × 4 bits of ROM – Total: 4,3 Kbits de ROM • A PLA é muito menor – pode compartilhar termos de produto – precisa apenas entradas que produzem uma saída ativa – pode levar em conta don’t cares • O tamanho é (no. de entradas × no. de termos-produto) + (no. de saídas × no. de termos-produto) Para este exemplo = (10x17)+(20x17) = 510 células de PLA • As células de PLA normalmente possuem o tamanho aproximado de uma célula de ROM (ligeiramente maior) 147 Outro estilo de implementação • Instruções complexas: o “próximo estado” normalmente é o estado atual + 1 EscrevePC EscrevePCCond IouD Unidade de controle LeMem EscreveMem PLA ou ROM Saídas EscreveIR EscreveB MemparaReg OrigPC OpALU OrigBALU OrigAALU EscreveReg RegDst Entrada CtlEnd 1 Estado Somador Op[5–0] Lógica se seleção de endereço Campo opcode do registrador Instruction 148 Detalhes Op 000000 000010 000100 100011 101011 ROM de despacho 1 Nome do opcode formato R jmp beq lw sw Valor 0110 1001 1000 0010 0010 ROM de despacho 2 Nome do opcode lw sw Op 100011 101011 Valor 0011 0101 PLA ou ROM 1 Estado Somador Mux 3 2 1 CtlEnd 0 0 ROM de despacho 2 Ação do controle de endereço Usa o estado incrementado Usa a ROM de despacho 1 Usa a ROM de despacho 2 Usa o estado incrementado Substitui o número do estado por 0 Substitui o número do estado por 0 Usa o estado incrementado Substitui o número do estado por 0 Substitui o número do estado por 0 Substitui o número do estado por 0 Valor de CtlEnd 3 1 2 3 0 0 3 0 0 0 ROM de despacho 1 Lógica de seleção de endereço Op Número do estado 0 1 2 3 4 5 6 7 8 9 Campo opcode do registrador Instruction 149 Microprogramação Unidade de controle Memória de microcódigo Saídas Entrada EscrevePC EscrevePCCond IouD LeMem EscreveMem EscreveIR EscreveB MemparaReg OrigPC OpALU OrigBALU OrigAALU EscreveReg RegDst CtlEnd Caminho de dados 1 Contador de microprograma Somador Op[5–0] Lógica de seleção de endereço Campo opcode do registrador Instruction • Quais são as microinstruções? 150 Microprogramação • Uma metodologia de especificação – apropriada se houver centenas de opcodes, modos, ciclos etc. – sinais especificados simbolicamente usando microinstruções Rótulo Fetch Mem 1 LW2 Controle da ALU Add Add Add SRC1 SRC2 PC PC A 4 Extshft Extend Controle do registrador Memória Lê PC Controle EscrevePC ALU Lê Lê ALU Escreve MDR SW2 Rformat1 Escreve ALU Código Func A B Escreve ALU BEQ1 Subt A JUMP1 B ALU Out-cond Endereço de jump Seqüenciação Seq Dispatch 1 Dispstch 2 Seq Fetch Fetch Seq Fetch Fetch Fetch • Duas implementações da mesma arquitetura possuem o mesmo microcódigo? • O que um microassembler faria? 151 Formato da microinstrução Nome do campo Controle da ALU SRC1 SRC2 Controle dos Registradores Valor Add Subt Func code PC A B 4 Extend Extshft Read Sinais ativos OpALU = 00 OpALU = 01 OpALU = 10 OrigAALU = 0 OrigAALU = 1 OrigBALU = 00 OrigBALU = 01 OrigBALU = 10 OrigBALU = 11 Write ALU EscreveReg, RegDst = 1, MemparaReg = 0 EscreveReg, RegDst = 0, MemparaReg = 1 LeMem, IouD = 0, LeMem, IouD = 1 EscreveMem, IouD = 1 OrigPC = 00, EscrevePC OrigPC = 01, EscrevePCCond OrigPC = 10, EscrevePC CtlEnd = 11 CtlEnd = 00 CtlEnd = 01 CtlEnd = 10 Write MDR Memória Read PC Read ALU Write ALU Controle de escrita no PC ALU ALUOut-cond jump address Seqüenciamento Seq Fetch Dispatch 1 Dispatch 2 Comentário Faz com que a ALU realize uma soma. Faz com que a ALU realize uma subtração; isso implementa a comparação para desvios. Usa o código de função da instrução para determinar o controle da ALU. Usa o PC como a primeira entrada da ALU. O registrador A é a primeira entrada da ALU. O registrador B é a segunda entrada da ALU. Usa 4 como a segunda entrada da ALU. Usa a saída da unidade de extensão de sinal como a segunda entrada da ALU. Usa a saída da unidade de deslocamento em dois bits como a segunda entrada da ALU. Lê dois registradores usando os campos rs e rt do IR como os números de registrador e colocando os dados nos registradores A e B. Escreve num registrador usando o campo rd do IR como o número de registrador e o conteúdo de SaídaALU como os dados. Escreve num registrador usando o campo rt do IR como o número de registrador e o conteúdo de MDR como os dados. Lê a memória usando o PC como o endereço; escreve o resultado no IR (e no MDR). Lê a memória usando SaídaALU como o endereço; escreve o resultado no MDR. Escreve na memória usando SaídaALU como o endereço e o conteúdo de B como os dados. Escreve a saída da ALU no PC. Se a saída Zero da ALU estiver ativa, escreve o PC com o conteúdo do registrador SaídaALU. Escreve o PC com o endereço de jump da instrução. Escolhe a próxima microinstrução seqüencialmente. Vai para a primeira microinstrução para iniciar uma nova instrução. Despacha usando a ROM 1. Despacha usando a ROM 2. 152 Maximamente versus minimamente codificado • Nenhuma codificação: – 1 bit para cada operação de caminho de dados – mais rápido, exige mais memória (lógica) – usada para Vax 780 — incrível memória de 400K! • Muita codificação: – envia as microinstruções através da lógica para obter sinais de controle – usa menos memória, mais lento • Contexto histórico do CISC: – Muita lógica para colocar em um único chip com tudo mais – Use uma ROM (ou mesmo RAM) para armazenar o microcódigo – É fácil acrescentar novas instruções 153 Microcódigo: negociações • A distinção entre especificação e implementação às vezes é vaga • Vantagens da especificação: – Fácil de projetar e escrever – Projeto da arquitetura e do microcódigo em paralelo • Vantagens da implementação (ROM fora do chip) – Fácil de mudar, já que os valores estão na memória – Pode emular outras arquiteturas – Pode fazer uso dos registradores internos • Desvantagens da implementação, MAIS LENTA, agora que: – O conteúdo é implementado no mesmo chip do processador – Agora a ROM não é mais rápida do que a RAM – Não há necessidade de voltar e fazer mudanças 154 Perspectiva histórica • Nas décadas de 1960 e 1970, a microprogramação era muito importante para implementar máquinas • Isso levou a ISAs mais sofisticadas e ao VAX • Na década de 1980, os processadores RISC com base em pipelining se tornaram populares • Também é possível canalizar as microinstruções! • As implementações dos processadores de arquitetura IA-32 desde o 486 usam: – “controle hardwired” para implementações mais simples (menos ciclos, controle FSM implementado usando PLA ou lógica aleatória) – “controle microcodificado” para instruções mais complexas (grande número de ciclos, loja de controle central) • A arquitetura IA-64 usa a ISA no estilo RISC e pode ser implementada sem uma grande loja de controle central 155 Pentium 4 • O pipelining é importante (o último IA-32 sem ela foi o 80386 em 1985) Controle Controle Interface de E/S Capítulo 7 Cache de instrução Cache de dados Ponto flutuante e multimídia aperfeiçoados Caminho de dados de inteiro Controle Suporte a hyperthreading de pipelining avançado Cache secundário e interface de memória Capítulo 6 Controle • O pipelining é usado para as instruções simples beneficiadas pelos compiladores “Explicado de forma simples, uma implementação de alto desempenho precisa garantir que as instruções simples sejam executadas rapidamente e que o peso das complexidades do conjunto de instruções penalize as instruções complexas, usadas com menos freqüência.” 156 Pentium 4 • Em algum lugar em todo esse controle, precisamos manipular instruções complexas Controle Controle Interface de E/S Cache de instrução Cache de dados Ponto flutuante e multimídia aperfeiçoados Caminho de dados de inteiro Cache secundário e interface de memória Controle Suporte a hyperthreading de pipelining avançado Controle • O processador executa microinstruções simples, de 70 bits de largura (hardwired) • 120 linhas de controle para o caminho de dados de inteiro (400 para ponto flutuante) • Se uma instrução exigir mais de 4 microinstruções para ser implementada, controle da ROM de microcódigo (8000 microinstruções) • Isso é complicado! 157 Resumo do Capítulo 5 • Se entendermos as instruções... Podemos construir um processador simples! • Se as instruções duram diferentes períodos de tempo, o multiciclo é melhor • O caminho de dados é implementado usando: – Lógica combinacional para aritmética – Elementos de preservação de estado para se lembrar dos bits • Controle implementado usando: – Lógica combinacional para implementação de ciclo único – Máquina de estado finito para implementação de multicilo 158 Capítulo 6 159 Pipelining • Melhore o desempenho aumentando a vazão da instrução A aceleração ideal é o número de estágios no pipeline. Conseguimos isso? 160 Pipelining • O que o facilita – todas as instruções possuem o mesmo tamanho – apenas alguns formatos de instrução – operandos de memória aparecem apenas em loads e stores • O que o dificulta? – riscos estruturais: suponha que tivéssemos apenas uma memória – riscos de controle: necessidade de se preocupar com instruções ramificadas – riscos de dados: uma instrução depende de uma instrução anterior • Construiremos um pipeline simples e veremos esses problemas • Falaremos sobre os processadores modernos e o que realmente o torna difícil – tratamento de exceções – tentar melhorar o desempenho com execução fora de ordem etc. 161 Conceito básico IF: Busca de instruções ID: Decodificação de EX: Execução/cálculo de endereço instruções/leitura do banco de registradores MEM: Acesso à memória WB: Escrita adiada Add Resultado ADD do Somador 4 Desloc. 2 esq. 0 M u x 1 PC Endereço Instrução Memória de instruções Registrador de leitura 1 Dados da leitura 1 Registrador de leitura 2 Registradores Registrador Dados da para escrita leitura 2 Dados para escrita 16 Extensão de sinal Zero 0 M u x 1 ALU Resultado da ALU Endereço Dados da leitura Memória de dados Dados para escrita 1 M u x 0 32 • O que precisamos acrescentar para realmente dividir os caminhos de dados em estágios? 162 Caminho de dados em pipeline IF/ID ID/EX EX/MEM MEM/WB Add Resul- Add tado do 4 Somador Desloc. 2 esq. PC Endereço Memória de instruções Instrução 0 M u x 1 Registrador Dados de leitura 1 da leitura 1 Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita Dados para escrita Resul- ALU tado da 0 M u x 1 ALU Endereço Memória de dados Dados da leitura 0 M u x 1 Dados para escrita 16 Extensão de sinal 32 Você consegue encontrar um problema mesmo se não houver dependências? Que instruções podemos executar para manifestar o problema? 163 Caminho de dados corrigido IF/ID ID/EX MEM/WB EX/MEM Add Resultado Add do Somador 4 Desloc. 2 esq. PC Endereço Memória de instruções Instrução 0 M u x 1 Registrador de leitura 1 Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita 0 M u x 1 Dados para escrita Zero ALU Resultado da ALU Dados da leitura Endereço Memória de dados 0 M u x 1 Dados para escrita 16 Extensão de sinal 32 164 Representando pipelines graficamente Ordem de execução do programa (em instruções) lw $1, 100($0) lw $2, 200($0) lw $3, 300($0) Tempo (em ciclos de clock) CC 1 CC 2 IM Reg IM CC 3 ALU Reg IM CC 4 CC 5 DM Reg ALU DM Reg ALU DM Reg CC 6 CC7 Reg • Pode ajudar a responder questões como estas: – quantos ciclos leva para executar esse código? – qual é a ALU sendo executada durante o ciclo 4? – use essa representação para ajudar a entender os caminhos de dados 165 Controle do pipeline OrigPC ID/EX IF/ID MEM/WB EX/MEM Add Resultado Add do Somador 4 Desloc. 2 esq. EscreveReg PC Endereço Instrução 0 M u x 1 Branch Memória de instruções Registrador de leitura 1 Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita EscreveMem OrigALU 0 M u x 1 Dados da leitura Zero ALU Resultado da ALU MemparaReg Dados da leitura Endereço Memória de dados 1 M u x 0 Dados para escrita Instrução (15-0) Instrução (20-16) Instrução (15-11) 16 Extensão 32 de sinal 6 0 M u x 1 Controle da ALU LeMem OpALU RegDst 166 Controle de pipeline • Temos 5 estágios. O que precisa ser controlado em cada estágio? – Busca da instrução e incremento do PC – Decodificação da instrução / Busca do registrador – Execução – Estágio de memória – Escrita adiada • Como o controle seria manipulado em uma fábrica de automóveis? – um espetacular centro de controle dizendo a todo mundo o que fazer? – deveríamos usar uma máquina de estado finito? 167 Controle do pipeline • Transfira os sinais de componente exatamente como os dados Linhas de controle do estágio de cálculo de endereço/execução Linhas de controle do estágio de acesso à memória Linhas de controle do estágio de escrita do resultado Instrução RegDst OpALU1 OpALU0 OrigALU Branch LeMem Escreve Mem Escreve Reg Mem para Reg Formato R 1 1 0 0 0 0 0 1 0 lw 0 0 0 1 0 1 0 1 1 sw X 0 0 1 0 0 1 0 X beq X 0 1 0 1 0 0 0 X 168 Caminho de dados com controle OrigPC ID/EX Controle IF/ID WB EX/MEM M WB EX M MEM/WB WB Add Resultado Add do Somador 4 Memória de instruções Registrador de leitura 1 Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita Zero ALU Resultado da ALU 0 M u x 1 Dados da leitura MemparaReg Endereço Branch OrigALU EscreveMem EscreveReg PC Instrução 0 M u x 1 Desloc. 2 esq. Dados da leitura Endereço Memória de dados 0 M u x 1 Dados para escrita Instrução (15-0) 16 Extensão de sinal 32 6 Controle ALU Instrução (20-16) Instrução (15-11) LeMem OpALU 0 M u x 1 RegDst 169 Dependências • Problemas com o início da próxima instrução antes do término da primeira – dependências que “voltam no tempo” são hazards de dados Tempo (em ciclos de clock) CC 1 CC 2 Valor do registrador $2: 10 10 CC 3 CC 4 CC 5 10 10 10/–20 DM Reg CC 6 –20 CC 7 CC 8 –20 –20 CC 9 –20 Ordem de execução do programa (em instruções) sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14, $2, $2 sw $15, 100($2) IM Reg IM Reg IM DM Reg IM Reg DM Reg IM Reg DM Reg Reg DM Reg 170 Solução de software • Faça o compilador garantir a inexistência de hazards • Onde inserimos os “nops”? sub and or add sw $2, $1, $3 $12, $2, $5 $13, $6, $2 $14, $2, $2 $15, 100($2) • Problema: isso realmente nos torna lentos! 171 Forwarding • Use resultados temporários, não espere que eles sejam escritos – forwarding do arquivo de registrador para manipular read/write para o mesmo registrador – forwarding da ALU Tempo (em ciclos de clock) CC 1 CC 2 CC 3 Valor do registrador $2: 10 10 10 Valor de EX/MEM: X X X Valor de MEM/WB: X X X CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 10 –20 X 10/–20 X –20 –20 X X –20 X X –20 X X –20 X X DM Reg Ordem de execução do programa (em instruções) sub $2 $1, $3 and $12, $2 $5 or $13, $6, $2 add $14, $2 $2 sw $15, 100($2) E se este $2 fosse $13? IM Reg IM Reg IM DM Reg IM Reg DM Reg IM Reg DM Reg Reg DM Reg 172 Forwarding • A idéia principal (alguns detalhes não mostrados) ID/EX EX/MEM MEM/WB M u x ForwardA Registradores ALU M u x Memória de dados M u x ForwardB Rs Rt Rt Rd EX/MEM.RegistradorRd M u x Unidade de forwarding MEM/WB.RegistradorRd 173 Forwarding nem sempre é possível • Load word ainda pode causar um hazard: – uma instrução tenta ler um registrador seguindo uma instrução load que escreve no mesmo registrador. Tempo (em ciclos de clock) CC 1 CC 2 CC 3 CC 4 CC 5 DM Reg CC 6 CC 7 CC 8 CC 9 Ordem de execução do programa (em instruções) lw $2, 20($1) and $4, $2, $5 or $8, $2, $6 add $9, $4, $2 slt $1, $6, $7 IM Reg IM Reg IM DM Reg IM Reg DM Reg IM Reg DM Reg Reg DM Reg Portanto, precisamos de uma unidade de detecção de hazard para “deter” (stall) a instrução load 174 Stalls • Podemos ocasionar um stall no pipeline mantendo uma instrução no mesmo estágio Tempo (em ciclos de clock) CC 1 CC 2 CC 3 CC 4 CC 5 DM Reg CC 6 CC 7 CC 8 CC 9 CC 10 Ordem de execução do programa (em instruções) lw $2, 20($1) IM Reg bolha and torna-se nop add $4, $2, $5 or $8, $2, $6 add $9, $4, $2 IM Reg IM DM Reg IM Reg DM DM Reg IM Reg Reg Reg DM Reg 175 Unidade de detecção de hazard • Ocasione um stall deixando que uma instrução que não escreverá nada prossiga Unidade de detecção de hazards EscreveIF/ID ID/EX.MemRead ID/EX M u x EscrevePC Controle IF/ID 0 WB EX/MEM M WB MEM/WB EX M WB PC Memória de instruções Instrução M u x Registradores ALU M u x Memória de dados M u x IF/ID.RegistradorRs IF/ID.RegistradorRt IF/ID.RegistradorRt Rt IF/ID.RegistradorRd Rd M u x ID/EX.RegistradorRt Rs Rt Unidade de forwarding 176 Hazards de desvio • Quando decidimos desviar, outras instruções estão no pipeline! Tempo (em ciclos de clock) CC 1 CC 2 CC 3 CC 4 CC 5 DM Reg CC 6 CC 7 CC 8 CC 9 Ordem de execução do programa (em instruções) 40 beq $1, $3, 28 44 and $12, $2, $5 48 or $13, $6, $2 IM Reg IM Reg IM DM Reg 52 add $14, $2, $2 72 lw $4, 50($7) IM Reg DM Reg IM Reg DM Reg Reg DM Reg • Estamos prevendo “desvio não tomado” – precisamos acrescentar hardware para descartar instruções se estivermos errados 177 Descartando instruções IF.Flush Unidade de detecção de hazards ID/EX WB Controle 0 IF/ID M u x + EX/MEM M WB EX/MEM EX M WB + 4 M u x Desloc. 2 esq. Registradores PC = M u x Memória de instruções ALU Memória de dados M u x M u x Extensão de sinal M u x Unidade de forwarding Nota: também movemos a decisão de desvio para o estágio ID 178 Desvios • Se o desvio for tomado, temos uma penalidade de um ciclo • Para nosso projeto simples, isso é razoável • Com pipelines mais profundos, a penalidade aumenta e a previsão de desvio estático diminui drasticamente o desempenho • Solução: previsão de desvio dinâmico Tomado Não tomado Previsão tomada Previsão tomada Tomado Tomado Não tomado Não tomado Previsão não tomada Previsão não tomada Tomado Não tomada Um esquema de previsão de dois bits 179 Previsão de desvio • Técnicas sofisticadas: – Um “buffer de destino de desvio” nos ajuda a consultar o destino. – Correlacionar previsores que baseiem a previsão no comportamento global e nos desvios recentemente executados (por exemplo, previsão para uma instrução de desvio específica com base no que ocorreu nos desvios anteriores). – Previsores de competição que usam diferentes tipos de estratégias de previsão e controlam qual delas está sendo melhor executada. – Um “espaço de retardo de desvio” que o compilador tenta preencher com uma instrução útil (forma a parte do retardo de um ciclo da ISA). • Previsão de desvio é especialmente importante porque permite que outras técnicas de pipelining mais avançadas sejam eficazes! • Os processadores modernos prevêem corretamente 95% das vezes! 180 Melhorando o desempenho • Tente evitar stalls! Por exemplo, reordene estas instruções: lw lw sw sw $t0, $t2, $t2, $t0, 0($t1) 4($t1) 0($t1) 4($t1) • Programação de pipeline dinâmica – O hardware escolhe que instruções executar em seguida – Executará instruções fora de ordem (por exemplo, não espera que uma dependência seja resolvida, e sim continua executando!) – Especula sobre desvios e mantém o pipeline cheio (pode precisar reverter se a previsão for incorreta) • Tentando explorar o paralelismo em nível de instrução 181 Pipelining avançado • Aumenta a profundidade do pipeline • Inicia mais de uma instrução em cada ciclo (despacho múltiplo) • Desdobramento de loop para expor mais ILP (melhor programação) • Processadores “superescalares” – DEC Alpha 21264: pipeline de 9 estágios, despacho de 6 instruções • Todos os processadores modernos são superescalares e despacham instruções múltiplas normalmente com algumas limitações (por exemplo, diferentes “pipes”) • VLIW: Very Long Instruction Word (palavra de instrução muito longa) – despacho múltiplo estático (se baseia mais na tecnologia do compilador) • Essa aula forneceu o conhecimento de que você precisa para aprender mais! 182 Resumo do Capítulo 6 • O pipelining não melhora a latência, mas melhora a vazão Despacho múltiplo com pipeline (Seção 6.9) Menor Ciclo único (Seção 5.4) Menos Instruções por clock (IPC = 1/CPI) Mais Despacho múltiplo com pipeline profundo (Seção 6.10) Especializado Pipeline Hardware Multiciclo (Seção 5.5) Despacho múltiplo com pipeline profundo (Seção 6.10) Compartilhado Velocidade de clock Maior Pipeline profundo Despacho múltiplo com pipeline (Seção 6.9) Ciclo único (Seção 5.4) Pipeline Pipeline profundo Multiciclo (Seção 5.5) 1 Várias Latência no uso das instruções 183 Capítulo 7 184 Memórias: Revisão • SRAM: – o valor é armazenado em um par de portões invertidos – muito rápida, mas ocupa mais espaço do que a DRAM (4 a 6 transistores) • DRAM: – o valor é armazenado como uma carga no capacitor (precisa ser atualizada) – muito pequena, porém, mais lenta do que a SRAM (fator de 5 a 10) Linha de word A B A B Transistor de passagem Capacitor Linha de bit 185 Explorando a hierarquia da memória • Os usuários querem memórias grandes e rápidas! Os tempos de acesso da SRAM são 0,5 a 5 ns ao custo de US$ 4000 a US$ 10000 por GB. Os tempos de acesso são 50 a 70 ns ao custo de US$ 100 a US$ 200 por GB. Os tempos de acesso a disco são 5 a 20 milhões de ns ao custo de US$ 0,50 a US$ 2 por GB. 2004 • Tente oferecer isso a eles – Construa uma hierarquia de memória CPU Nível 1 Níveis na hierarquia de memória Aumentando a distância da CPU no tempo de acesso Nível 2 … Nível n Tamanho da memória em cada nível 186 Localidade • Um princípio que faz da hierarquia de memória uma boa idéia • Se um item for referenciado, localidade temporal: tenderá a ser referenciada novamente em breve localidade espacial: itens próximos tenderão a ser referenciados em breve Por que o código possui localidade? • Nosso foco inicial: dois níveis (superior, inferior) – bloco: unidade mínima de dados – acerto: os dados solicitados estão no nível superior – falha: os dados solicitados não estão no nível superior 187 Cache • Dois problemas: – Como sabemos se um item de dados está no cache? – Se estiver, como encontrá-lo? • Nosso primeiro exemplo: – O tamanho do bloco é uma word de dados – “diretamente mapeado” Para cada item de dados no nível inferior, existe exatamente um local no caminho onde ele pode estar. Por exemplo, muitos itens no nível inferior compartilham locais no nível superior 188 Cache diretamente mapeado • Mapeamento: O endereço é o módulo do número de blocos no cache 000 001 010 011 100 101 110 111 Cache 00001 00101 01001 01101 10001 10101 11001 11101 Memória 189 Cache diretamente mapeado • Para MIPS: Endereço (mostrando as posições dos bits) 31 30 13 12 11 2 10 Offset do byte Acerto 20 10 Tag Dados Índice x Índice x 0 1 2 Validade alid Tag Dados 1021 1022 1023 20 32 = De que tipo de localidade estamos nos valendo? 190 Cache diretamente mapeado • Tirando vantagem da localidade espacial: Endereço (mostrando as posições dos bits) 31 14 13 65 210 18 Acerto 8 4 Tag Offset do byte Dados Offset do bloco Índice 18 bits V 512 bits Tag Dados 256 Entradas 16 32 32 32 = Mux 32 191 Acertos versus falhas • Acertos de leitura – é isso o que queremos! • Falhas de leitura – ocasione um stall na CPU, busque o bloco da memória, distribua para o cache, reinicie • Acertos de escrita: – podem substituir os dados no cache e na memória (escrita direta) – escrevem os dados apenas no cache (escrita adiada no cache posteriormente) • Falhas de escrita: – lêem o bloco inteiro para o cache, depois escrevem a word 192 Problemas de hardware • Facilite a leitura de múltiplas words usando bancos de memória CPU CPU CPU Multiplexador Cache Cache Cache Barramento Barramento Barramento Memória Banco de Banco de Banco de Banco de memória 0 memória 1 memória 2 memória 3 b. Organização de memória larga c. Organização de memória intercalada Memória a. Organização de memória com uma word de largura • Isso pode ficar muito mais complicado... 193 Desempenho • Aumentar os tamanhos de bloco tende a reduzir a taxa de falhas: 40% 35% Taxa de falhas 30% 25% 20% 15% 10% 5% 0% 4 16 64 Tamanho de bloco (bytes) 256 1 KB 8 KB 16 KB 64 KB 256 KB • Use caches divididos porque existe mais localidade espacial no código: Programa gcc spice Tamanho de bloco em words Taxa de falhas de instrução Taxa de falha de dados Taxa de falhas combinadas efetiva 1 6,1% 2,1% 5,4% 4 2,0% 1,7% 1,9% 1 1,2 1,3 1,2% 4 0,3 0,6 0,4% 194 Desempenho • Modelo simplificado: Tempo de execução = (ciclos de execução + ciclos de stall) × tempo de ciclo Ciclos de stall = número de instruções × taxa de falhas × penalidade de falha • Duas maneiras de melhorar o desempenho: – reduzir a taxa de falhas – reduzir a penalidade de falhas O que acontece se aumentarmos o tamanho de bloco? 195 Reduzindo a taxa de falhas com associatividade Associativa por conjunto de uma via (diretamente mapeada) Bloco 0 Tag Dados Associativa por conjunto de duas vias 1 2 3 4 5 6 Conjunto Tag Dados Tag Dados 0 1 2 3 7 Associativa por conjunto de quatro vias Conjunto Tag Dados Tag Dados Tag Dados Tag Dados 0 1 Associativa por conjunto de oito vias (totalmente associativa) Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Comparado com o mapeamento direto, forneça uma série de referências que: – resulte em uma taxa de falhas usando um cache associativo de duas vias – resulte em uma taxa de falhas maior usando um cache associativo de duas vias considerando que usamos a estratégia de substituição “usada menos recentemente” 196 Uma implementação 31 30 12 11 10 9 8 22 Índice 0 1 2 V Tag Dados 3210 8 V Tag Dados V Tag Dados V Tag Dados 253 254 255 22 = = = 32 = Multiplexador 4 para 1 Acerto Dados 197 Desempenho 15% 1 KB Taxa de falhas 12% 2 KB 9% 4 KB 6% 8 KB 16 KB 32 KB 3% 64 KB 128 KB 0 Uma via Duas vias Quatro vias Oito vias Associatividade 198 Reduzindo a penalidade de falhas com caches multinível • Acrescente um segundo cache de nível: – normalmente o cache primário está no mesmo chip do processador – use SRAMs para acrescentar outro cache acima da memória principal (DRAM) – a penalidade de falhas diminui se os dados estiverem no cache de segundo nível • Exemplo: – CPI de 1,0 em uma máquina de 5 GHz com uma taxa de falhas de 5%, acesso a DRAM de 100 ns – Acrescentar cache de segundo nível com tempo de acesso de 5 ns diminui a taxa de falhas para 0,5% • Usando caches multinível: – tente otimizar o tempo de acerto no cache de primeiro nível – tente otimizar a taxa de falhas no cache de segundo nível 199 Complexidades de cache – Nem sempre é fácil entender as implicações dos caches: 1200 2000 1600 Ciclos de clock/item Instruções/item Radix Sort Radix Sort 1000 800 600 400 200 Quicksort 0 1200 800 400 Quicksort 0 4 8 16 32 64 128 256 512 1024 2048 4096 4 8 16 32 64 128 256 512 1024 2048 4096 Tamanho (K itens a ordenar) Tamanho (K itens a ordenar) Comportamento teórico de Radix Sort versus Quicksort Comportamento observado de Radix Sort versus Quicksort 200 Complexidades de cache • Veja o porquê: 5 Radix Sort Falhas de cache/item 4 3 2 1 Quicksort 0 4 8 16 32 64 128 256 512 1024 2048 4096 Tamanho (K itens a ordenar) • O desempenho do sistema de memória normalmente é um fator crítico – caches multinível, processadores em pipeline, dificultam a previsão de resultados – otimizações de compilador para aumentar a localidade algumas vezes prejudicam o ILP • Difícil prever o melhor algoritmo: é preciso dados experimentais 201 Memória virtual • A memória principal pode atuar como um cache para o armazenamento secundário (disco) Endereços físicos Endereços virtuais Tradução de endereço Endereços do disco • Vantagens: – ilusão de ter mais memória física – remanejamento do programa – proteção 202 Páginas: blocos de memória virtual • Falhas de página: Os dados não estão na memória; recupere-os do disco – enorme penalidade de falha; portanto, as páginas devem ser bastante grandes (por exemplo, 4KB) – é importante reduzir as falhas de página (LRU vale a pena) – pode manipular as falhas no software em vez de no hardware – como a escrita direta é muito onerosa, usamos escrita adiada Endereço virtual 31 30 29 28 27 15 14 13 12 11 10 9 8 Número de página virtual 3210 Offset de página Tradução 29 28 27 15 14 13 12 11 10 9 8 Número de página física 3210 Offset de página Endereço físico 203 Tabelas de página Número de página virtual Tabela de páginas Validade 1 1 1 1 0 1 1 0 1 1 0 1 Página física ou endereço de disco Memória física Armazenamento em disco 204 Tabelas de página Registrador de tabela de páginas Endereço virtual 31 30 29 28 27 15 14 13 12 11 10 9 8 Número de página virtual Offset de página 12 20 Validade 3 2 1 0 Número de página física Tabela de páginas 18 Se for 0, então a página não está presente na memória 29 28 27 15 14 13 12 11 10 9 8 Número de página física 3 2 1 0 Offset de página Endereço físico 205 Tornando a tradução de endereço rápida • Um cache para traduções de endereço: translation-lookaside buffer (TLB) Número de página virtual o çã cia de ifica rên a e lid od ef Va M R 1 1 1 1 0 1 TLB Tag Endereço de página física 0 1 1 1 1 1 0 1 0 0 0 1 Memória física Tabela de páginas ão ia e icaç ênc d f r Endereços de página a i lid od efe física ou de disco Va M R 1 1 1 1 0 1 1 0 1 1 0 1 Valores típicos: 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 Armazenamento em disco 16-512 entradas, taxa de falhas: 0,01% – 1% penalidade de falhas: 10-100 ciclos 206 TLBs e caches Endereço virtual Acesso à TLB Exceção de falha de TLB Não Sim Acerto de TLB? Endereço físico Não Sim Escrita? Tente ler os dados da cache Stall de falha de cache durante leitura do bloco Não Sim Não Bit de acesso de escrita ligado? Exceção de proteção de escrita Sim Tente escrever os dados na cache Acerto de cache? Envie os dados para a CPU Stall de falha de cache durante leitura do bloco Não Sim Acerto de cache? Escreva os dados na cache, atualize o bit de modificação e coloque os dados e o endereço no buffer de escrita 207 TLBs e caches Endereço virtual 31 30 29 14 13 12 11 10 9 Número de página virtual o çã TLB hit Offset de página 12 20 e a ad ific id od l Va M TLB 3 2 1 0 Número de página física Tag = = = = = = 20 Offset de página Número de página física Endereço físico Offset Tag de endereço físico Índice de cache de bloco 18 8 4 Offset de byte 2 8 12 Validade Dados Tag Cache = Acerto de cache 32 Dados 208 Sistemas modernos Característica Intel Pentium P4 Endereço virtual Endereço físico Tamanho de página Organização de TLB 32 bits 36 bits 4KB, 2/4MB 1 TLB para instruções e 1 TLB para dados Ambas são associativas por conjunto de quatro vias Ambas usam substituição pseudo-LRU Ambas têm 128 entradas Falhas de TLB tratadas por hardware AMD Opteron 48 bits 40 bits 4KB, 2/4MB 2 TLBs para instruções e 2 TLBs para dados Ambas as TLBs L1 são totalmente associativas, substituição LRU Ambas as TLBs L2 são associativas por conjunto de quatro vias, LRU com round-robin Ambas as TLBs L1 têm 40 entradas Ambas as TLBs L2 têm 512 entradas Falhas de TLB tratadas por hardware FIGURA 7.34 Tradução de endereços e hardware TLB para o Intel Pentium P4 e o AMD Opteron. O tamanho de word define o tamanho máximo do endereço virtual, mas um processador não precisa usar todos esses bits. O tamanho de endereço físico é independente do tamanho de word. O P4 tem uma TLB para instruções e uma TLB idêntica separada para dados, enquanto o Opteron possui uma TLB L1 e uma TLB L2 para instruções e TLBs L1 e L2 idênticas para dados. Os dois processadores fornecem suporte para páginas grandes, que são usadas para coisas como o sistema operacional ou para mapear um buffer de quadro. O esquema de página grande evita o uso de um grande número de entradas para mapear um único objeto que está sempre presente. Característica Organização de cache L1 Tamanho de cache L1 Associatividade de cache L1 Substituição L1 Tamanho de bloco L1 Política de escrita L1 Organização de cache L2 Tamanho de cache L2 Associatividade de cache L2 Substituição L2 Tamanho de bloco L2 Política de escrita L2 Intel Pentium P4 Caches de instruções e de dados divididos 8KB para dados, cache de trace de 96KB para instruções RISC (operações RISC de 12K) Associativa por conjunto de 4 vias Substituição LRU aproximada 64 bytes Escrita direta Unificada (instruções e dados) 512KB Associativa por conjunto de 8 vias Substituição LRU aproximada 128 bytes Escrita direta AMD Opteron Caches de instruções e de dados divididos 64KB cada para instruções/dados Associativa por conjunto de 2 vias Substituição LRU 64 bytes Escrita adiada Unificada (instruções e dados) 1024KB (1MB) Associativa por conjunto de 16 vias Substituição LRU aproximada 64 bytes Escrita adiada FIGURA 7.35 Caches de primeiro nível e segundo nível do Intel Pentium P4 e do AMD Opteron. As caches primárias do P4 são fisicamente indexadas e rotuladas; para uma descrição das alternativas, veja o Detalhe na página 527. 209 Sistemas modernos • As coisas estão ficando complicadas! MPU AMD Opteron Conjunto de instruções Aplicação pretendida 2 Tamanho do die (mm ) (2004) Instruções despachadas por clock Velocidade de clock (2004) Cache de instruções Latência (clocks) Cache de dados Latência (clocks) Entradas de TLB (TLB I/D/L2) Tamanho de página mínimo Cache L2 on-chip Cache L2 off-chip Tamanho de bloco (L1/L2, bytes) Intrinsity FastMATH Intel Pentium 4 Intel PXA250 ARM Embutido de baixo consumo Sun UltraSPARC IV IA-32, AMD64 Servidor MIPS32 Embutido IA-32 Desktop SPARC v9 Servidor 193 122 217 3 2 3 operações RISC 1 4×2 2,0GHz 64KB, associativa por conjunto de 2 vias 3 64KB, associativa por conjunto de 2 vias 3 40/40/512/512 2,0GHz 16KB, diretamente mapeada 4 16KB, associativa por conjunto de 1 via 3 16 3,2GHz cache de trace com 12000 operações RISC (~96 KB) 4 8KB, associativa por conjunto de 4 vias 2 128/128 0,4GHz 32KB, associativa por conjunto de 32 vias 1 32KB, associativa por conjunto de 32 vias 1 32/32 1,2GHz 32KB, associativa por conjunto de 4 vias 2 64KB, associativa por conjunto de 4 vias 2 128/512 4KB 4KB 4KB 1KB 8KB 1024KB, associativa por conjunto de 16 vias — 1024KB, associativa por conjunto de 4 vias — 512KB, associativa por conjunto de 8 vias — — — — 64 64 64/128 32 16MB, associativa por conjunto de 2 vias 32 356 FIGURA 7.36 Microprocessadores para desktops, embutidos e para servidores em 2004. De uma perspectiva da hierarquia de memória, a principal diferença entre as categorias é a cache L2. Não há uma cache L2 para o embutido de baixo consumo, uma grande L2 on-chip para o embutido e para o desktop e uma off-chip de 16 MB para o servidor. As velocidades de clock de processador também variam: 0,4 GHz para embutido de baixo consumo, 1 GHz ou mais alta para o restante. Observe que o UltraSPARC IV possui dois processadores no chip. 210 Alguns problemas • As velocidades do processador continuam a aumentar muito rápido – muito mais rápido do que os tempos de acesso à DRAM ou ao disco 100.000 10.000 1.000 Desempenho CPU 100 10 Memória 19 80 19 81 19 82 19 83 19 84 19 85 19 86 19 87 19 88 19 89 19 90 19 91 19 92 19 93 19 94 19 95 19 96 19 97 19 98 19 99 20 00 20 01 20 02 20 03 20 04 20 05 1 Ano • Desafio de projeto: lidar com essa crescente disparidade – Prefetching? Caches de terceiro nível e mais? Projeto de memória? 211 Capítulos 8 e 9 (abordagem parcial) 212 Interface entre processadores e periféricos • O projeto de E/S é afetado por muitos fatores (expansibilidade, resiliência) • Desempenho: – latência de acesso – vazão – conexão entre os dispositivos e o sistema – a hierarquia de memória – o sistema operacional • Uma variedade de usuários diferentes (por exemplo, bancos, supercomputadores, engenheiros) Interrupções Processador Cache Barramento de E/S de memória Memória principal Controlador de E/S Disco Disco Controlador de E/S Controlador de E/S Saída gráfica Rede 213 E/S • Importante, mas negligenciada “As dificuldades em avaliar e projetar sistemas de E/S freqüentemente têm relegado a E/S à condição de segunda classe” “os cursos em todos os aspectos da computação, da programação à arquitetura de computador, normalmente ignoram a E/S ou a abordam superficialmente” “os livros-texto deixam o assunto para o final, o que pode fazer com que alunos e instrutores o pulem” • CULPADOS! – não veremos a E/S em muito detalhe aqui. – não deixe de ler o Capítulo 8 inteiro. – você provavelmente assistirá a uma aula de rede! 214 Dispositivos de E/S • Dispositivos muito diversos – comportamento (por exemplo, entrada versus saída) – parceiro (quem está no outro lado?) – velocidade de dados Interrupções Processador Cache Barramento de E/S de memória Memória principal Controlador de E/S Disco Disco Controlador de E/S Controlador de E/S Saída gráfica Rede FIGURA 8.2 Uma coleção típica de dispositivos de E/S. As conexões entre os dispositivos de E/S, processador e memória normalmente são chamadas de barramentos. A comunicação entre os dispositivos e o processador utiliza interrupções e protocolos no barramento, conforme veremos neste capítulo. A Figura 8.11, na página 585, mostra a organização para um PC desktop. 215 Exemplo de E/S: Unidades de disco Pratos Trilhas Prato Setores Trilha • Para acessar dados: – busca: posiciona a cabeça sobre a trilha correta (3 a 14 ms em média) – latência rotacional: espera pelo setor desejado (0,5 rpm) – transferência: recupera os dados (um ou mais setores; 30 a 80 MB/seg) 216 Exemplo de E/S: Barramentos • Link de comunicação compartilhado (um ou mais fios) • Projeto difícil: – pode ser gargalo – extensão do barramento – número de dispositivos – negociações (buffers para largura de banda maior aumenta a latência) – suporte para muitos dispositivos diferentes – custo • Tipos de barramento: – processador-memória (curto, projeto personalizado e de alta velocidade) – backplane (alta velocidade, freqüentemente padronizado; por exemplo, PCI) – E/S (longo, diferentes dispositivos; por exemplo, USB, Firewire) • Síncrono versus assíncrono – usam um clock e um protocolo síncronos, rápidos e pequenos, mas cada dispositivo precisa operar na mesma velocidade e a variação de clock exige que o barramento seja curto – não usam um clock, mas usam hanshaking 217 Padrões de barramento de E/S • Hoje temos dois padrões de barramento dominantes: Características Tipo de barramento Largura básica do barramento de dados (sinais) Clock Largura de banda máxima teórica Facilidade de conexão Número máximo de dispositivos Tamanho máximo do barramento (fio de cobre) Nome do padrão Firewire (1394) E/S 4 assíncrono 50MB/seg (Firewire 400) ou 100MB/seg (Firewire 800) sim 63 4,5 metros IEEE 1394, 1394b USB 2.0 E/S 2 assíncrono 0,2MB/seg (baixa velocidade), 1,5MB/seg (velocidade plena) ou 60MB/seg (velocidade alta) sim 127 5 metros USB Implementors Forum FIGURA 8.9 Principais características dos dois padrões de barramento de E/S dominantes. 218 Outros aspectos importantes • Arbitração de barramento: – arbitração de margarida (não muito justa) – arbitração centralizada (exige um árbitro), por exemplo, PCI – detecção de colisão, por exemplo, Ethernet • Sistema operacional: – polling – interrupções – acesso direto à memória (DMA) • Técnicas de análise de desempenho: – teoria do enfileiramento – simulação – análise; por exemplo, encontrar o link mais fraco (veja “Projeto de sistema de E/S”) • Muitos desenvolvimentos recentes 219 Pentium 4 • Opções de E/S Chip set 875P Segmento de destino PC de desempenho Barramento do sistema (64 bits) 800/533MHz Hub controlador de memória (“bridge norte”) DDR 400 (3,2GB/seg) DIMMs da memória principal DDR 400 (3,2GB/seg) 42,5 x 42,5mm, 1005 37,5 x 37,5mm, 760 Processador Pentium 4 Velocidade da memória DDR 400/ 333/266 SDRAM DDR 266/200, PC133 SDRAM Barramento do sistema (800MHz, 604GB/seg) AGP 8X Hub Saída (2,1GB/seg) controlador gráfica de memória CSA (bridge norte) (0,266GB/seg) Ethernet 1 Gbit 82875P Barramentos de memória, larguras Número de DIMMs, suporte a Mbit da DRAM Capacidade máxima da memória Correção de erro da memória disponível? Barramento gráfico AGP, velocidade Controlador gráfico 2x72 4, 128/256/ 512Mbits 4GB sim sim, 8X ou 4X Externo 1x64 2, 128/256/ 512Mbits 2GB não não Interno (Extreme Graphics) não 266MHz (266MB/seg) ATA paralelo (100MB/seg) ATA serial (150MB/seg) ATA paralelo (100MB/seg) Disco Estéreo (som surround) AC/97 (1MB/seg) USB 2.0 (60MB/seg) ... PC de menor custo 400MHz Tamanho do pacote, pinos ATA serial (150MB/seg) Disco Chip set 845GL Hub controlador de E/S (bridge sul) 82801EB CD/DVD Fita (20 MB/seg) Ethernet 10/100 Mbit Barramento PC (132MB/seg) Interface CSA Gigabit Ethernet sim Velocidade de interface da bridge sul (8 bits) 266MHz Hub controlador de E/S (“bridge sul”) Tamanho do pacote, pinos Barramento PCI: largura, velocidade, masters Controlador MAC Ethernet, interface Portas USB 2.0, controladoras Portas ATA 100 Controlador ATA serial 150, portas Controlador RAID 0 Controlador de áudio AC-97, interface Gerenciamento de E/S 31 x 31mm, 460 32 bits, 33MHz, 6 masters 100/10Mbits 8, 4 2 sim, 2 sim sim SMbus 2.0, GPIO 31 x 31mm, 421 32 bits, 33MHz, 6 masters 100/10Mbits 6, 3 2 não não sim SMbus 2.0, GPIO FIGURA 8.12 Dois chip sets de E/S Pentium 4 da Intel. A bridge norte 845GL utiliza muito menos pinos do que o 875, com apenas um barramento de memória e omitindo o barramento AGP e a interface Gigabit Ethernet. Observe que a natureza serial do USB e da ATA serial significa que mais duas portas USB e mais duas portas ATA serial precisam de apenas mais 39 pinos na bridge sul do chip set 875 versus o chip set 845GL. 220 Falácias e armadilhas • Falácia: O tempo médio para falha (MTTF) indicado para discos é 1.200.000 horas ou quase 140 anos, de modo que os discos praticamente nunca falham. • Falácia: O armazenamento de disco magnético está com seus dias contados; será substituído. • Falácia: Um barramento de 100 MB/seg pode transferir 100 MB por segundo. • Armadilha: Mover funções da CPU para o processador de E/S, esperando melhorar o desempenho sem análise. 221 Multiprocessadores • Idéia: criar computadores poderosos conectando muitos computadores menores boa notícia: funciona para compartilhamento de tempo (melhor do que um supercomputador) má notícia: é muito difícil escrever bons programas concorrentes, muitas falhas comerciais Processador Processador Processador Processador Processador ... Processador Cache Cache Cache Cache Cache ... Cache Memória Memória ... Memória Barramento único Memória E/S Rede 222 Perguntas • Como os processadores paralelos compartilham dados? – espaço de endereço único (SMP versus NUMA) – transferência de mensagens • Como os processadores paralelos são coordenados? – sincronização (bloqueios, semáforos) – primitivas send/receive embutidas – protocolos de sistema operacional • Como eles são implementados? – conectados por um único barramento – conectados por uma rede 223 Supercomputadores Representação dos 500 maiores sites de supercomputador durante uma década: SIMD (Single Instruction Multiple Data) 500 Cluster (rede de estações de trabalho) Cluster (rede de SMPs) 400 300 MPPs (Massively Parallel Processors) 200 100 SMPs (Shared Memory Multiprocessors) 0 93 93 94 94 95 95 96 96 97 97 98 98 99 99 00 Uniprocessadores 224 Usar múltiplos processadores – uma idéia antiga • Alguns projetos SIMD: Instituição Universidade de Illinois ICL Goodyear Thinking Machines Maspar Nome Número máximo de processadores Bits/proc. Velocidade de clock do proc. (MHz) Tamanho/sistema de memória máximo (MB) Número de FPUs BW/sistema de comunicações (MB/s) Ano Illiac IV 64 64 13 64 1 2.560 1972 DAP MPP CM-2 MP-1216 4.096 16.384 65.536 16.384 1 1 1 4 5 10 7 25 0 0 2048 (opcional) 0 2 2 512 256 ou 1024 2.560 20.480 16.384 23.000 1980 1982 1987 1989 FIGURA 9.11.1 Características de cinco computadores SIMD. Número de FPUs significa o número de unidades de ponto flutuante. • Os custos para o Illiac IV aumentaram de US$ 8 milhões em 1966 para US$ 32 milhões em 1972 apesar da conclusão de apenas ¼ da máquina. Levou três outros anos para que ele estivesse operacional! “Por sorte ou por azar, os arquitetos de computador não são facilmente desencorajados” Muitos projetos e idéias interessantes, muitas falhas, poucos sucessos 225 Topologias 226 Clusters • Construídos a partir de computadores inteiros • Redes independentes e escaláveis • Vantagens: – Muitas aplicações receptivas a máquinas frouxamente agrupadas – Exploram redes locais – Econômicos / fáceis de expandir • Desvantagens: – Custos de administração não necessariamente baixos – Conectados usando barramento de E/S • Altamente disponíveis devido à separação das memórias • Em teoria, devemos ser capazes de fazer melhor 227 Google • Serve uma média de 1.000 consultas por segundo • Usa 6.000 processadores e 12.000 discos • Dois locais físicos no Vale do Silício e dois na Virgínia • Cada local está conectado à Internet usando OC48 (2488 Mbit/seg) • Confiabilidade: – Em um dia típico, 20 máquinas precisam ser reiniciadas (erros de software) – Menos de 2% das máquinas são substituídas a cada ano Em certo sentido, são idéias simples bem executadas. Melhores (e mais baratas) do que outros métodos envolvendo maior complexidade. 228 Comentários finais • Evolução versus revolução “Na maioria das vezes, o custo da inovação é devido a ser muito problemático para os usuários de computador.” Microprocessador de processamento paralelo Uso especial SIMD massivo Multiprocessador CC-NUMA (Reprogramar) Clusters Multiprocessador CC-UMA (Recompilar) RISC Instruções vetoriais Instruções de multimídia (Novas bibliotecas) Memória virtual Superescalar Multiprocessador com time sharing Pipelining Evolucionário Cache Microprogramação (Compatível a nível binário) Revolucionário “A aceitação de idéias de hardware exige aceitação pelas pessoas de software; portanto, as pessoas de hardware precisam aprender mais sobre software. Além disso, se as pessoas de software quiserem boas máquinas, elas precisam aprender mais sobre hardware para serem capazes de se comunicar com — e, portanto, influenciar — os projetistas de hardware.” 229