Anotações Parte 4 OBS: Essas anotações são adaptações do material suplementar (apresentações PPT) ao Livro do Hennessy e Patterson, 2ª e 3ª Ed. e do Livro do 5ª. Ed. Supõe-se que os estudantes tenham noções de lógica digital e linguagem assembly para o entendimento das aulas. 1
Aritmética O que foi visto: Visão geral de Sistemas Computacionais Desempenho (segundos, ciclos, instruções) Abstrações: Arquitetura do Conjunto de Instruções (ISA) Ling. Assembly e Ling. de Máquina Conjunto de Instruções MIPS E agora: Implementação da Arquitetura 2
Onde estamos agora... 3
Construindo um processador Estamos quase prontos para iniciar a construção de um processador MIPS Antes, vamos revisar a lógica booleana e construir a ULA que fará parte da CPU (ver Apêndices) Operação ULA (controle) 4 a b 32 ALU 1 32 1 overflow resultado Zero 32 4
Números Bits são apenas bits (sem significado inerente) convenções definem relações entre bits e números Números Binários (base 2) 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001... decimal: 0...2 n -1 É claro, existem outras complicações: números são finitos (overflow) frações e números reais números negativos (Ex: não há instrução MIPS tipo subi; addi pode somar um número negativo) Como representar números negativos? i.e., qual o padrão de bits representam tais números? 5
Possíveis Representações Sinal de Magnitude Complemento de 1 Complemento de 2 000 = +0 000 = +0 000 = +0 001 = +1 001 = +1 001 = +1 010 = +2 010 = +2 010 = +2 011 = +3 011 = +3 011 = +3 100 = -0 100 = -3 100 = -4 101 = -1 101 = -2 101 = -3 110 = -2 110 = -1 110 = -2 111 = -3 111 = -0 111 = -1 Questões: Balanceamento, número de zeros, facilidade de operação, facilidade de obtenção dos valores Qual delas é a melhor? Por que? 6
Representação geométrica dos inteiros em complemento de 2 [Stallings] 7
MIPS Números de 32 bit com sinal (em complemento de DOIS): 0000 0000 0000 0000 0000 0000 0000 0000 DOIS = 0 DEZ 0000 0000 0000 0000 0000 0000 0000 0001 DOIS = + 1 DEZ 0000 0000 0000 0000 0000 0000 0000 0010 DOIS = + 2 DEZ... 0111 1111 1111 1111 1111 1111 1111 1110 DOIS = + 2,147,483,646 DEZ 0111 1111 1111 1111 1111 1111 1111 1111 DOIS = + 2,147,483,647 DEZ 1000 0000 0000 0000 0000 0000 0000 0000 DOIS = 2,147,483,648 DEZ 1000 0000 0000 0000 0000 0000 0000 0001 DOIS = 2,147,483,647 DEZ 1000 0000 0000 0000 0000 0000 0000 0010 DOIS = 2,147,483,646 DEZ... 1111 1111 1111 1111 1111 1111 1111 1101 DOIS = 3 DEZ 1111 1111 1111 1111 1111 1111 1111 1110 DOIS = 2 DEZ 1111 1111 1111 1111 1111 1111 1111 1111 DOIS = 1 DEZ maxint minint 8
Operações em Complemento de 2 Negar um número em complemento de 2 = inverter todos os bits e somar 1 ao valor Lembre-se: negar e inverter são coisas muito diferentes! Converter números de N bits em números com mais de N bits: Operando imediato MIPS de 16 bits pode ser convertido para 32 bits para operações aritméticas (lembram-se?) copiar o bit mais significante (o de sinal) nos outros bits 0010 -> 0000 0010 1010 -> 1111 1010 4 bits -> 8 bits 9
Adição & Subtração Exatamente como se aprende soma e subtração na escola (vai 1) 0111 0111 0110 + 0110-0110 - 0101 Operações usando complemento de 2 são simples Ex: subtração a partir da adição de número negativo 0111 0111-0101 + 1011 Overflow (resultado grande demais para uma palavra finita ): Ex: somar dois nos. de n-bits nem sempre resulta num no. n-bits 0111 + 0001 Note que o termo overflow pode gerar dúvidas: 1000 Aqui, ele não indica um vai-1, mas um overflow. Monitorar Overflow: monitorar o bit mais significativo nas operações 10
Detecção de Overflow Não há overflow quando se soma um no. positivo com um negativo Não há overflow se os sinais são os mesmos numa subtração Um overflow ocorre quando o valor afeta o sinal do resultado: overflow quando se somam 2 positivos, dá um negativo ou, a soma de 2 negativos, dá um positivo ou, subtraindo um negativo de um positivo e ter um negativo ou, subtraindo um positivo de um negativo e ter um positivo Considere as operações A + B, e A B É possível ocorrer um overflow se B = 0? É possível ocorrer um overflow se A = 0? 11
Efeitos do Overflow Ocorre uma exceção (interrupção) Fluxo de controle salta para um endereço pré-definido para tratamento da exceção O endereço interrompido é armazenado para um possível retormada do processamento Nem sempre se quer detectar overflow Novas Instruções MIPS: addu, addiu, subu OBS: addiu guarda a extensão-de-sinal! OBS: sltu, sltiu comparações sem sinal Em Multimídia, por exemplo, overflow em um vídeo ou áudio significa saturação em um nível (de cor, brilho, intensidade de som, etc) 12
Tratando o Overflow Tratamento de exceções por linguagem / sistema Ex: Controle de vôo x Automação residencial Algumas linguagens (ex. C) ignora overflows No MIPS, isso corresponde a usar as instruções: addu, addiu, subu Outras linguagens (ex. Ada, Fortran) requirem que se escreva um tratamento para a exceção No MIPS, isso corresponde a usar as instruções: add, addi, sub Quando um overflow ocorre, um tratador de exceção (exception handler) PC é salvo num registrador específico (mov) A CPU salta (jump) para um endereço específico onde se encontra o código de tratamento da exceção Após o tratamento, o PC salvo é recuperado para que a execução retorne ao ponto de execução anterior à ocorrência da exceção (mov) 13
Casos especiais[stalllings] Caso especial 1: 0 0 00000000 Negado 11111111 Soma +1 + 1 Resultado 1 00000000 Então: 0 = 0 (Overflow é ignorado) Caso especial 2: 0 128 10000000 Negado 01111111 Soma +1 + 1 Resultado 1 0000000 Então: ( 128) = 128 X (monitorar bit mais significativo bit de sinal) 14
Construindo uma ULA 15
Revisão: Álgebra de Boole & Portas Lógicas Problema: Considere uma função lógica com 3 entradas: A, B e C. Saída D = V (ou 1) se no mínimo uma entrada é V (ou 1) Saída E = V se exatamente 2 entradas são V Saída F = V somente se as 3 entradas são V Construa a tabela verdade para essas 3 funções. Mostre as equações booleanas para essas 3 funções. Mostre a implementação dessas 3 funções usando portas AND e OR. ( JUMP Material Complementar da Elsevier daqui para frente!) 16
O multiplexador (MUX) / Seletor Seleciona uma das entradas (A, B) para ser a saída (C), com base em uma entrada de controle (S) OBS: Esse seletor é chamado de MUX de no máximo duas entradas, apesar dele ter, de fato, três entradas (1 é de seleção)! O MUX seleciona uma (única) operação da ULA a ser executada com os valores das entradas 17
Uma ULA (Unidade Lógica Aritmética) simples ULA para suporte às instruções add, and e or Solução: Construir ULA de 1 bit e juntar 32 dessas ULAs Operação resultado. Várias implementações possíveis... 18
Diferentes implementações possíveis Não é fácil decidir a melhor maneira de se construir algo Não queremos entradas demais em um única porta Não queremos ter que atravessar muitas portas A facilidade de compreensão é importante Considere uma ULA de 1 bit para adição (add): Como construir uma ULA de 1 bit para add, and e or? Como construir uma ULA de 32 bits? OBS: Solução não é única!!! 19
Construindo uma ULA de 32 bits (adição) 20
Construindo uma ULA de 32 bits (adição) 21
E quanto à subtração (a b)? Usar complemento de dois: simplesmente negar b e somar 1. Negar = inverter todos os bits (inversora) Uma solução inteligente : 22
E quanto à subtração (a b)? Usar complemento de dois: simplesmente negar b e somar 1. Negar = inverter todos os bits (inversora) Uma solução inteligente : 23
E quanto à subtração (a b)? Usar complemento de dois: simplesmente negar b e somar 1. Negar = inverter todos os bits (inversora) Uma solução inteligente : 24
Acrescentando uma função NOR Também pode se desejar inverter a. 25
Acrescentando uma função NOR Também pode se desejar inverter a. 26
Acrescentando uma função NOR Também pode se desejar inverter a. 27
Adequando a ULA ao ISA do MIPS Suporte à instrução set-on-less-than (slt) Note que slt é uma instrução aritmética : Gera 1 se rs < rt e 0, caso contrário Usando a subtração: (a b) < 0 a < b Suporte ao teste de igualdade Uso nas instruções beq/bne $t5, $t6, $t7 Usando a subtração: (a b) = 0 a = b 28
Suporte a slt Podemos imaginar a idéia? 29
Suporte a slt 30
Teste de igualdade Observe as linhas de controle: Nota: Saída ZERO é um 1 quando o resultado da ULA for zero! 31
Conclusão Podemos construir uma ULA para aceitar o conj. de instruções MIPS Ideia básica: usar um multiplexador para selecionar a saída que desejamos Realizar subtração eficientemente usando complemento de dois Duplicar uma ULA de 1 bit para produzir uma ULA de 32 bits Pontos importantes sobre hardware Todas as portas estão sempre operando A velocidade de uma porta é influenciada pelo número de entradas da porta A velocidade de um circuito é influenciada pelo número de portas na série (no caminho crítico ou no nível mais profundo da lógica ) Foco principal aqui: compreensão do funcionamento! Entretanto, mudanças inteligentes na organização podem melhorar o desempenho (semelhante a usar melhores algoritmos no software), como no caso da adição 32
Problema: o somador ripple carry é lento Uma ULA de 32 bits é tão rápida quanto uma ULA de 1 bit? Existe mais de uma maneira de fazer adição? Dois extremos: ripple carry (vai-1) e soma-de-produtos Você consegue ver o problema do ripple? Como você se livraria dele? c 1 = b 0 c 0 + a 0 c 0 + a 0 b 0 c 2 = b 1 c 1 + a 1 c 1 + a 1 b 1 c 2 = c 3 = b 2 c 2 + a 2 c 2 + a 2 b 2 c 3 = c 4 = b 3 c 3 + a 3 c 3 + a 3 b 3 c 4 = Inviável! Por que? 33
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 b i Quando propagaríamos o carry? p i = a i + b i Nos livramos do ripple? c 1 = g 0 + p 0 c 0 c 2 = g 1 + p 1 c 1 c 2 = c 3 = g 2 + p 2 c 2 c 3 = c 4 = g 3 + p 3 c 3 c 4 = Viável! Por que? 34
Use princípio para construir somadores maiores Não podemos construir um somador de 16 bits dessa maneira... (grande demais!!!) Poderíamos usar o ripple carry dos somadores CLA (carry look-ahead) de 4 bits Melhor ainda: Poderíamos usar o princípio CLA novamente! 35
Resumo da ALU até agora... Podemos construir uma ULA para aceitar adição MIPS Nosso foco está na compreensão, não do 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! 36
ULA implementada até agora... Esquecer (por enquanto...) a lógica interna implementada sobre portas lógicas, que são, elas mesmas, implementadas por transistores CMOS (lembram-se?) Abstração utilizada daqui para frente: Operação ULA (controle) 4 a 32 ALU resultado 32 b 32 37
Exemplo de Multiplicação 1011 Multiplicando (11 dec) x 1101 Multiplicador (13 dec) 1011 0000 Produtos parciais 1011 1011 10001111 Produto (143 dec) OBS: resultado possui o dobro do tamanho em bits 38
Multiplicação Mais complexa que a adição Realizada através de deslocamentos e adição Leva mais tempo e ocupa mais área de chip Serão implementadas 3 possíveis versões de solução para a multiplicação... 0010 (multiplicando/multiplicand) x_1011 (multiplicador/multiplier) Números Negativos: Converte e multiplica Podem ser implementadas outras técnicas até melhores, mas para nosso curso, essa será a escolhida... Uma técnica é conhecida como Algoritmo de Booth s (ver Stallings, Cap.9) 39
Multiplicação: implementação sequencial Start Multiplier0 = 1 1. Test Multiplier0 Multiplier0 = 0 1a. Add multiplicand to product and place the result in Product register Multiplicand 64 bits Shift left 2. Shift the Multiplicand register left 1 bit 64-bit ALU Multiplier Shift right 32 bits 3. Shift the Multiplier register right 1 bit Product 64 bits Write Control test 32nd repetition? No: < 32 repetitions Yes: 32 repetitions Se cada passo gastar 1 clock, temos 100 clocks para uma multiplicação 32 bits completa! Done 40
Segunda Versão Start Multiplier0 = 1 1. Test Multiplier0 Multiplier0 = 0 Multiplicand 1a. Add multiplicand to the left half of the product and place the result in the left half of the Product register 32 bits 32-bit ALU Multiplier Shift right 32 bits 2. Shift the Product register right 1 bit Product Shift right Write Control test 3. Shift the Multiplier register right 1 bit 64 bits 32nd repetition? No: < 32 repetitions Os registradores MIPS não têm 32 bits? Como faço as operações com 64? Done Yes: 32 repetitions 41
Segunda Versão Pelos bits do multiplicando, sabe-se, antes de se começar a multiplicação, quando haverá deslocamento ou soma para cálculo do produto. 42
Terceira e Última Versão Start Product0 = 1 1. Test Product0 Product0 = 0 Multiplicand 32 bits 1a. Add multiplicand to the left half of the product and place the result in the left half of the Product register 32-bit ALU 2. Shift the Product register right 1 bit Product 64 bits Shift right Write Control test 32nd repetition? No: < 32 repetitions Yes: 32 repetitions Done 43
Divisão Operação recíproca à multiplicação Problemas com negativos Mais complexa, menos frequente e com possibilidade de gerar operação inválida: divisão por ZERO! (dividendo) 1001010 1000 (divisor) -1000 1001 (quociente) 1010-1000 (resto) 10 Assim como na multiplicação, trabalhar com 0 e 1 facilita o processo de deslocamento e subtração a cada passo do algoritmo de divisão 44
Divisão: possível implementação 45
Divisão: possível implementação 46
Implementação Floating Point É necessário representar: Números racionais e irracionais: ex. 3.14159 Números muito pequenos: ex. 0.000000001 Números muito grandes: ex. 3.15576 10 9 Representação: sinal, expoente, parte fracionária: ( 1) sinal frac. 2 expoente Mais bits da parte fracionária = mais precisão Mais bits no expoente = faixa maior de valores Padrão IEEE 754 floating point : Precisão simples: 8 bits de expoente, 23 bits de frac. Precisão dupla: 11 bits de expoente, 52 bits de frac. 47
Formatos IEEE 754 48
Padrão IEEE 754 floating-point 1 bit da representação da mantissa é implícito Expoente: representação biased (deslocada): facilita ordenação Todos 0s = menor expoente possível; todos 1s, maior possível bias of 127 para precisão simples e 1023 para precisão dupla sumário: ( 1) sinal (1+parte_fracionária) 2 expoente bias Note que em notação científica, a representação normalizada é um pouco diferente, com 1 dígito antes do ponto decimal: ex. 3.123 x 10 3 Exemplo: Decimal: 0.75 = 3/4 = 3/2 2 Binário: 0.11 = 1.1 x 2-1 Em floating point: expoente = 126 = 01111110 IEEE precisão simples: 10111111010000000000000000000000 49
Exemplos de representação Floating Point 50
Complexidades Floating Point Operações são mais complicadas... Além do overflow, pode-se ter o underflow Precisão pode se tornar um grande problema IEEE 754 guarda 2 bits extras ( guard e round ) 4 modos de arredondamento Positivo dividido por zero dá infinito zero dividido por zero dá algo não numérico ou indefinido Outras complexidades Implementar o padrão pode ser muito difícil Não usar o padrão pode ser ainda pior! Veja no livro o problema do bug do Pentium (descrição família 80x86)! 51
Exemplo Somador para operações em PF 52
Sumário Aritmética Computacional tem restrições definidas pelos limites de precisão Padrões de bits que, aparentemente, não possuem um significado claro podem estar codificados em padrões precisos: Complemento de dois para subtração Padrão IEEE 754 para operações floating point As instruções do computador (geradas pelos compiladores) determinam o significado desses padrões de bits Hardware para Aritmética PF normalmente faz: Adição, subtração, multiplicação, divisão, raiz quadrada, potência Conversão PF integer Operações normalmente gastam muitos ciclos de clock Podem ser pipelined Desempenho e precisão são importantes e estão diretamente relacionados ao desempenho das máquinas reais (algoritmos e implementações em hardware) 53
Intervalos de Números representáveis 54
Mais informações Operadores PF no MIPS: pág. 206 a 208 (3ª Edição), 226 a 228 (tabelas resumindo todas as operações) Exemplos de uso de instruções MIPS em ponto-flutuante: pág. 209 a 211: Conversor F para C Multiplicação de matrizes Ver Material do Curso Computer Architecture ECE 4713/6713, Prof. Sherif Abdelwahed, Department of Electrical and Computer Engineering, Mississippi State University, USA. Explanação detalhada do formato IEEE 754 Exemplos anteriores de instruções MIPS 55