Baixe o app para aproveitar ainda mais
Prévia do material em texto
Capítulo 3 Aritmética de Computadores Aritmética para Computadores � Operações com inteiros � Adição e subtração � Multiplicação e divisão � Lidado com estouro aritmético � Números reais em ponto flutuante � Representação e operações Adição de Inteiros � Exemplo: 7 + 6 � Estouro se o resultado estiver fora do intervalo � Somando operandos +ve e –ve, não existe estouro � Somando dois operandos +ve � Estouro se o resultado do bit de sinal é 1 � Somando dois operandos –ve � Estouro se o resultado do bit de sinal é 0 0 + 0 = 0 1 + 0 = 1 1 + 1 = 10 = 0 + carry de 1 p/ próxima posição Subtração de Inteiros � Adiciona negação do segundo operando � Exemplo: 27 – 13 = 27 – (13) = 14 27: 11011 13: - 01101 14: 01110 Estouro se o resultado estiver fora do intervalo 0 – 0 = 0 1 – 1 = 0 1 – 0 = 1 0 – 1 → toma emprestado → 10–1=1 � Estouro se o resultado estiver fora do intervalo � Subtraindo dois operandos +ve ou dois operandos – ve, não existe estouro (lembrete: x – y = x + (-y)) � Subtraindo operando +ve de –ve � Estouro se o resultado do bit de sinal for 0 � Subtraindo operando –ve de +ve � Estouro se o resultado do bit de sinal for 1 Condições de Estouro � Combinação de operações, operandos e resultados que indicam estouro Lidando com Estouro � Algumas linguagens (e.g., C) ignoram estouro � Use as instruções do MIPS addu, addui, subu para ignorar o estouro � Outras linguagens (e.g., Ada, Fortran) exigem lançar uma exceção Use as instruções do MIPS , , para� Use as instruções do MIPS add, addi, sub para considerar estouro � No estouro, invocar o manipulador de exceção � Salvar PC no registrador do contador de programa da exceção (EPC) � Salta para o endereço do tratador pré-definido � Instrução mfc0 (move do coprocessador reg) pode acessar o valor do EPC, para retornar depois da ação corretiva Exercício � Efetue as seguintes operações a) 1012 + 112 b) 10110112 + 10110102 c) 10012 – 1012 d) 110102 – 100112 Aritmética para Multimedia � Processamento gráfico e de mídia opera em vetores de dados de 8 e 16 bits � Use somador de 64 bits, com cadeia de carry particionado � Opera em vetores de 8×8-bit, 4×16-bit, ou 2×32-bit SIMD (single-instruction, multiple-data)� SIMD (single-instruction, multiple-data) � Saturando operações � Para overflow, o resultado é o maior valor representável � c.f. módulo aritmético de complemento de 2 � E.g., botão com saturação pararia no volume mais alto Multiplicação � Começe com a abordagem de multiplicação longa 1000 × 1001 1000 0000 multiplicando multiplicador Copia multiplicando se o dígito for 1 0000 0000 1000 1001000 Comprimento do produto é a soma dos comprimentos do operando produto O comprimento da multiplicação de um multiplicando n e um multiplicador m é um produto n + m Exercício � Efetue as seguintes multiplicações: a) 11012 × 10102 b) 101012 × 1102 c) 100110101102 × 11112 Hardware de Multiplicação O LSB do multiplicador determina se o multipicando é adicionado ao registrador do produto Inicialmente 0 Se cada passo consome 1 ciclo de relógio, este algoritmo levaria 100 ciclos para multiplicar dois números de 32 bits Exemplo � Usando números de 4 bits para salvar espaço, multiplique 210 × 310 ou 00102 × 00112 usando o algoritmo de multiplicação Exercício � Usando números de 4 bits para salvar espaço, multiplique 310 × 410 ou 00112 × 01002 usando o algoritmo de multiplicação Multiplicador Otimizado � Executa os passos em paralelo: soma/desloca � O multiplicador e o multiplicando são deslocados enquanto o multiplicando é adicionado ao produto � Caso o bit do multiplicador seja um O produto é deslocado para direita M: 1000 P: 1000 M: 10000 para direita Testa o bit direito do multiplicador e obtém a versão pré-deslocada do multiplicando O multiplicador é colocado no MSB do registrador de produto Um ciclo por soma do produto parcial M: 10000 M: 100000 M: 1000000 P: 1001000 Multiplicador Mais Rápido � Usa somadores múltiplos � Balanceamento de custo/desempenho � Este hardware “desenrola o laço” para usar 31 somadores � Várias multiplicação executadas em paralelo para minimizar tempo Multiplicação do MIPS � Dois registradores de 32 bits para o produto � HI: 32 bits mais significante � LO: 32 bits menos significante � Instruções � mult rs, rt / multu rs, rt� mult rs, rt / multu rs, rt � Produto de 64 bits em HI/LO � mfhi rd / mflo rd � Move de HI/LO para rd � Pode tesar o valor de HI para checar se o produto estourou os 32 bits � mul rd, rs, rt � 32 bits menos significante do produto –> rd Divisão � Checa por divisor 0 � Abordagem da divisão longa � Se os bits do divisor ≤ dividendo � 1 bit no quociente, subtrai � Caso contrário � 0 bit no quociente, abaixa próximo bit de dividendo 1001 1000 1001010 -1000 quociente dividendo divisor divid e nd o de dividendo � Restaurando a divisão � Faz a substração, e se o resto for < 0, adiciona o divisor de volta � Divisão com sinal � Divide usando valores absoluto � Ajusta o sinal do quociente e resto quando necessário -1000 10 101 1010 -1000 10 operandos de n-bit produz quociente e resto de n-bit resto divisor Dividendo=Quociente×Divisor+Resto ∴Dividendo=9×8+2=74 divid e nd o Exercício � Realize a divisão de 01112 por 00102 111 10 -10 11 11 -10 1 � Realize a divisão de 1101002 por 1002 110100 100 -100 1101 101 -100 10 100 -100 0 1 Hardware da Divisão Inicialmente divisor na metade esquerda Inicialmente dividendo Exemplo � Usando uma versão de 4 bits do algoritmo, tente dividir 710 por 210 ou 01112 por 00102 Exercício � Usando uma versão de 4 bits do algoritmo, tente dividir 610 por 210 ou 0000 01102 por 00102 Divisor Otimizado Combina o registrador do quociente com a metade direita do registrador do resto � Um ciclo por subtração do resto parcial � Parece bastante como um multiplicador! � Mesmo hardware pode ser usado para ambos Divisão Mais Rápida � Não pode usar hardware paralelo como no multiplicador � Subtração está condicionada no sinal do resto � Divisores mais rápidos geram mútiplos bits do quociente por passoquociente por passo � Ainda exige múltiplos passos Divisão do MIPS � Usa registradores HI/LO para resultado � HI: resto de 32 bits � LO: quociente de 32 bits � Instruções � div rs, rt / divu rs, rt� div rs, rt / divu rs, rt � Sem estouro ou checagem de divisão por 0 � Software deve executar checagens se necessário � Usa mfhi, mflo para acessar resultado Ponto Flutuante � Representação de números não-inteiros � Incluindo números muito pequenos e muito grandes � Como notação científica (um dígito à esquerda do ponto decial) � –2.34 × 1056 normalizado� –2.34 × 10 � +0.002 × 10–4 � +987.02 × 109 � Em binário � ±1.xxxxxxx2 × 2yyyy � Tipos float e double em C normalizado não normalizado Normalizado: um número em notação de ponto flutuante que não tem líder 0s Padrão de Ponto Flutuante � Definido pela IEEE Std 754-1985 � Desenvolvido em resposta a divergência de representações � Problemas de portabilidade de código científico � Agora, quase universalmente adotado� Agora, quase universalmente adotado � Duas representações � Precisão simples (32-bit) � Precisão dupla (64-bit) Formato de Ponto Flutuante IEEE S Expoente Fração r. simples: 8 bits r. dupla: 11 bits r. simples: 23 bits r. dupla: 52 bits Viés)(ExpoenteS 2Fração)(11)(x −×+×−= O significante representa o número de 24- ou 53-bits que é 1 mais a fração; e a fração quando referimos o número de 23- e 52-bits � S: bit de sinal (0 ⇒ positivo, 1 ⇒ negativo) � Para suportar ainda mais bits, IEEE 754 faz o uso implícito do líder 1-bit dos números binários normalizados � precisãosimples: o númeroé 24 bits (implica 1+uma fraçãode 23 bits) � Precisãodupla: o númeroé 53 bits (implica 1+uma fraçãode 52 bits) � Expoente: excesso de representação: expoente real+viés � Assegure que o expoente é não sinalizado� Simples: Viés = 127; Duplo: Viés = 1023 Formato de Ponto Flutuante IEEE � Os bits da fração representam um número entre 0 e 1 e E representa o valor no campo do expoente � Se numerarmos os bits da fração da esquerda para direita s1, s2, s3,…, então o valor é ( ) ( ) ( ) ( )( ) VES sss −−−− ×+×+×+×+×− 223222111 321 K � A notação desejável deve representar o expoente mais negativo como 00..002 e o mais positivo como 11..112 � Esta convenção é chamda notação de viés � Expoente sendo subtraído do viés para representar o maior e menor valor do expoente real � Se usarmos o bit de sinal em E, diminuiríamos o intervalo de número que podem ser representados ( ) ( ) ( ) ( )( ) Intervalo da Precisão Simples � Expoentes 00000000 e 11111111 reservado � Menor valor � Expoente: 00000001 ⇒ expoente real = 1 – 127 = –126 � Fração: 000…00⇒ significante = 1.0 � ±1.0 × 2–126 ≈ ±1.2 × 10–38 � Maior valor � Expoente: 11111110 ⇒ expoente real = 254 – 127 = +127 � Fração: 111…11⇒ significante ≈ 2.0 � ±2.0 × 2+127 ≈ ±3.4 × 10+38 Intervalo da Precisão Dupla � Expoentes 0000…00 e 1111…11 reservado � Menor valor � Expoente: 00000000001 ⇒ expoente real = 1 – 1023 = –1022 � Fração: 000…00⇒ significante = 1.0 � ±1.0 × 2–1022 ≈ ±2.2 × 10–308 � Maior valor � Expoente: 11111111110 ⇒ expoente real = 2046 – 1023 = +1023 � Fração: 111…11⇒ significante ≈ 2.0 � ±2.0 × 2+1023 ≈ ±1.8 × 10+308 Precisão do Ponto Flutuante � Precisão relativa � Todos os bits de fração são significativos � Simples: aproximadamente 2–23 � Equivalente a 23 × log102 ≈ 23 × 0.3 ≈ 6 dígitos decimais de precisão Duplo: aproximadamente 2–52� Duplo: aproximadamente 2–52 � Equivalente a 52 × log102 ≈ 52 × 0.3 ≈ 16 dígitos decimais de precisão Exemplo de Ponto Flutuante (1) � Representar –0.75 � O número -0.7510 é também -3/410 ou -3/2210 � Representado pela fração binária -112/2210 ou -1.12×2-1 � –0.75 = (–1)1 × 1.12 × 2–1, onde S = 1 � 1 + Fração = .1000…002 � Expoente Real (i.e., ER = E - V) deve ser igual a –1 � Simples: E = –1 + 127 = 126 = 011111102 � Duplo: E = –1 + 1023 = 1022 = 011111111102 � Simples: 1011111101000…00 � Duplo: 1011111111101000…00 sinal expoente fração Exemplo de Ponto Flutuante (2) � Qual número é representado pelo seguinte flutuante de precisão simples 11000000101000…00 � S = 1 (representa número negativo) � Fração = 01000…002 = 1×2-2 = 0.25 Expoente = 10000001 = 129� Expoente = 100000012 = 129 � x = (–1)1 × (1 + 0.25) × 2(129 – 127) = (–1) × 1.25 × 22 = –5.0 Exercício (1) � Representar -0.5 em ponto flutuante com precisao simples e dupla � Representar 0.25 em ponto flutuante com precisao simples e dupla � Representar -0.4375 em ponto flutuante com � Representar -0.4375 em ponto flutuante com precisao simples e dupla Exercício (2) � Qual número é representado pelo seguinte flutuante de precisão simples 11111111100000…00 10000000100000…00 Adição de Ponto Flutuante � Consideremos um exemplo decimal de 4 dígitos � 9.999 × 101 + 1.610 × 10–1 � 1. Alinhas os pontos decimais � Deslocar número com expoente menor � 9.999 × 101 + 0.016 × 101 2. Adicionar significante� 2. Adicionar significante � 9.999 × 101 + 0.016 × 101 = 10.015 × 101 � 3. Normalizar o resultado & checar estouro positivo/negativo � 1.0015 × 102 � 4. Arredondar e normalizar, se necessário � 1.002 × 102 127 ≥ 2 ≥ -126 Adição de Ponto Flutuante � Agora consideremos um exemplo binário de 4 digitos � 1.0002 × 2–1 + –1.1102 × 2–2 (0.5 + –0.4375) � 1. Alinhar pontos binários � Deslocar número com expoente menor � 1.0002 × 2–1 + –0.1112 × 2–1 � 2. Adicionar significante� 2. Adicionar significante � 1.0002 × 2–1 + –0.1112 × 2–1 = 0.0012 × 2–1 � 3. Normalizar resultado & checar estouro positivo/negativo � 1.0002 × 2–4, sem estouro positivo/negativo � 4. Arredondar e renormalizar, se necessário � 1.0002 × 2–4 (sem mudança) � 0.0001000 = 8 / 27 = 0.0625 127 ≥ -4 ≥ -126 Hardware para Adicionar PF � Muito mais complexo do que o somador de inteiros � Fazê-lo em um ciclo de relógio levaria muito tempo � Muito mais longo do que operações com números � Muito mais longo do que operações com números inteiros � Relógio mais lento penaliza todas as instruções � Somador de ponto flutuante geralmente leva mais ciclos de relógio � Pode ser pipelined Algoritmo do Somador de PF � Passo 1 e 2 similar ao exemplo do slide anterior � Adicionar o significante do número com o menor expoente e então somar os dois significantes � Passo 3 normaliza os � Passo 3 normaliza os resultados, forçando a verificação do estouro � Precisão simples: o máximo exp. é 127 e o mínimo é -126 � Precisão dupla: o máximo exp. é 1023 e o mínimo é -1022 Hardware para Somador de PF Passo 1 ⇒ subtrai expoentes ⇒ multiplexador Passo 2 Passo 3 Passo 4 ⇒ multiplexador Exercício � Tente somar os números 0.2510 e 0.12510 em binário usando o algoritmo do somador em ponto flutuante Multiplicação de Ponto Flutuante � Consideremos um exemplo decimal de 4 dígitos � 1.110 × 1010 × 9.200 × 10–5 � 1. Adicionar expoentes � Para expoentes negativos, subtrair viés de soma � Novo expoente = 10 + (–5) = 5 � 2. Multiplicar significantes 1.110 × 9.200 = 10.212 ⇒ 10.212 × 105� 1.110 × 9.200 = 10.212 ⇒ 10.212 × 105 � 3. Normalizar o resultado & checar estouro � 1.0212 × 106 � 4. Arredondar e renomalizar, se necessário � 1.021 × 106 � 5. Determinar o sinal do resultado apartir dos sinais dos operandos � +1.021 × 106 Multiplicação de Ponto Flutuante � Agora consideremos um exemplo binário de 4 bits � 1.0002 × 2–1 × –1.1102 × 2–2 (0.5 × –0.4375) � 1. Adicionar expoentes � Novo expoente: –1 + (–2) = –3 � Viés: (–1 + 127) + (–2 + 127) = –3 + 254 – 127 = –3 + 127 � 2. Multiplicar significantes 1.000 × 1.110 = 1.1102 ⇒ 1.110 × 2–3 ER = E - V � 1.0002 × 1.1102 = 1.1102 ⇒ 1.1102 × 2–3 � 3. Normalizar o resultado & checar estouro � 1.1102 × 2–3 sem estouro positivo/negativo � 4. Arredondar e renormalizar, se necessário � 1.1102 × 2–3 (nenhuma mudança) � 5. Determinar o sinal: +ve × –ve ⇒ –ve � –1.1102 × 2–3 � 0.001110 = 14 / 26 = –0.21875 Algoritmo do Multiplicador de PF � Inicia com o cálculo do novo do produto, seguido da multiplicação dos significantes e por uma normalização � Checa se houve estouro no tamanho do expoente, e então tamanho do expoente, e então o produto é arredondado � Se o arredondamento levar a normalização, checa-se novamente o tamanho dos expoentes Hardware para Aritmética de PF � Multiplicador de ponto flutuante é de complexidade similar ao somador � Mas usa um multiplicador para o significante em vez de um somador � Hardware de ponto flutuante geralmente realiza � Adição, subtração, multiplicação, divisão, raiz � Adição, subtração, multiplicação, divisão, raiz quadrada � Conversão entre ponto flutuante ↔ inteiro � Operações geralmente levam vários ciclos de relógio � Pode ser pipelined Instruções de PF no MIPS � Hardware de PF é o coprocessador 1 � Processador adjunto que estende o ISA � Registradores de PF são separados � Precisão simples de 32: $f0, $f1, … $f31 � Pareado para decisão dupla: $f0/$f1, $f2/$f3, … � Versão 2 do MIPs ISA suporta reg’s de PF de 32 × 64-bit Instruções de PF operam somente em � Instruções de PF operam somente em registradoresde PF � Programas geralmente não realizam operações de inteiro em PF, ou vice-versa � Mais registradores com impacto mínimo no tamanho do código � Instruções de load e store de PF � lwc1, ldc1, swc1, sdc1 w ⇒ word d ⇒ double word Instruções de PF no MIPS � Aritmética de precisão simples � add.s, sub.s, mul.s, div.s � e.g., add.s $f0, $f1, $f6 � Aritmética de precisão dupla � add.d, sub.d, mul.d, div.d � e.g., mul.d $f4, $f4, $f6e.g., � Comparação de precisão simples e dupla � c.xx.s, c.xx.d (xx representa eq, lt, le, …) � Seta ou limpa bit do código de condição do PF � e.g. c.lt.s $f3, $f4 � Desvia num código de condição de PF (true ou false) � bc1t, bc1f � e.g., bc1t TargetLabel Exemplode PF: °F para °C � Código C : float f2c (float fahr) { return ((5.0/9.0)*(fahr - 32.0)); } � fahr em $f12, resultado em $f0, literais no espaço de memória global Código MIPS compilado:� Código MIPS compilado: f2c: lwc1 $f16, const5($gp) lwc1 $f18, const9($gp) div.s $f16, $f16, $f18 lwc1 $f18, const32($gp) sub.s $f18, $f12, $f18 mul.s $f0, $f16, $f18 jr $ra 0($gp) 4($gp) 8($gp) Interpretação de Dados � Bits não têm significado inerente � Eles podem representar inteiros com/sem sinal, números de ponto flutuante e instruções The BIG Picture � Interpretação depende das instruções aplicadas � Representações computacionais de números � Intervalo e precisão finita � Necessário levar em conta o tamanho finito das palavras nos programas Associatividade � Programas paralelos podem intercalar operações em ordens inesperadas � Suposição da associatividade pode falhar devido as aproximações e a precisão limitada (x+y)+z x+(y+z) O número(x+y)+z x+(y+z) x -1.50E+38 -1.50E+38 y 1.50E+38 z 1.0 1.0 1.00E+00 0.00E+00 0.00E+00 1.50E+38 � Precisa validar programas paralelos sob diferentes níveis de paralelismo O número 1.5010x1038 é muito maior do que 1 Divisão e Deslocamento para Direita � Deslocamento para esquerda por i multiplica um inteiro por 2i � Deslocamento para direita divide por 2i? � Somente para inteiros sem sinal � Para inteiros com sinal � Deslocamento à direita aritmético: replica o bit de sinal � e.g., –5 / 4 � 111110112 >> 2 = 111111102 = –2 � O resultado é -210 em vez de -110; próximo, mas não exato � c.f. 111110112 >>> 2 = 001111102 = +62 Observações Finais (1) � Aritmética de suporte dos ISAs � Inteiros com sinal e sem sinal � Aproximação de ponto flutuante para números reais � Intervalo e precisão limitada � Operações podem causar estouro positivo e negativo � ISA do MIPS � Instruções do núcleo: 54 mais frequentemente usadas (próximo slide) � 100% do SPECINT, 97% do SPECFP � Outras instruções: menos frequente Observações Finais (2) Exercício 1 � Tente multiplicar os números 0.2510 e 0.12510 em binário usando o algoritmo do multiplicador em ponto flutuante Exercício 2 � Emule o código assembly da conversão de Farenheit para Celsius usando o emulador Mars � Dica: converta os números para ponto flutuante, antes de inserir nos registradores $f0, $f1, etc Exercício 3 � Escreva um programa em assembly do MIPS que capture o valor do raio de uma esfera e exiba o valor do volume e da área da superfície da esfera. Sabe-se que o volume da esfera é dado por (4/3) ×pi×r3 e que a área da superfície é dada por 4×pi ×r2. Assuma pi=3.14dada por 4×pi ×r2. Assuma pi=3.14 � Dica: transforme o valor de pi em uma fração
Compartilhar