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 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 Complementa e adiciona 1 0 0 = 0 1 1 = 0 1 0 = 1 0 1 toma emprestado 10 1=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 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
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) 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 w w l ( r ( r mod 2 ) 2 unsigned _ overflow
Multiplicação Começe com a abordagem de multiplicação longa multiplicando multiplicador produto 1000 1001 1000 0000 0000 1000 1001000 Copia multiplicando se o dígito for 1 Comprimento do produto é a soma dos comprimentos do operando O comprimento da multiplicação de um multiplicando n e um multiplicador m é um produto n + m
Hardware de Multiplicação O LSB do multiplicador determina se o multipicando é adicionado ao registrador do produto Inicialmente 0 Estes três passos são repetidos 32 vezes para obter o produto
Exemplo Usando números de 4 bits para salvar espaço, multiplique 2 10 3 10 ou 0010 2 0011 2 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 O multiplicador é colocado no MSB do registrador de produto Um ciclo por soma do produto parcial
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 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
Exercício 1 Efetue as seguintes operações a) 101 2 + 11 2 b) 1011011 2 + 1011010 2 c) 1001 2 101 2 d) 11010 2 10011 2
Exercício 2 Efetue as seguintes multiplicações: a) 1101 2 1010 2 b) 10101 2 110 2 c) 10011010110 2 1111 2
Exercício 3 Usando números de 4 bits para salvar espaço, multiplique 3 10 4 10 ou 0011 2 0100 2 usando o algoritmo de multiplicação
Divisão divisor quociente dividendo resto 1001 1000 1001010-1000 10 101 1010-1000 10 operandos de n-bit produz quociente e resto de n-bit dividendo 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 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 Dividendo=Quociente Divisor+Resto Dividendo=9 8+2=74
Exercício Realize a divisão de 0111 2 por 0010 2 111 10-10 11 11-10 1 Realize a divisão de 110100 2 por 100 2 110100 100-100 1101 101-100 10 100-100 0
Hardware da Divisão Inicialmente divisor na metade esquerda Inicialmente dividendo
Exemplo Usando uma versão de 4 bits do algoritmo, tente dividir 7 10 por 2 10 ou 0111 2 por 0010 2
Exercício Usando uma versão de 4 bits do algoritmo, tente dividir 6 10 por 2 10 ou 0000 0110 2 por 0010 2
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 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 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 10 56 +0.002 10 4 +987.02 10 9 Em binário ±1.xxxxxxx 2 2 yyyy 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 Duas representações Precisão simples (32-bit) Precisão dupla (64-bit)
Formato de Ponto Flutuante IEEE r. simples: 8 bits r. dupla: 11 bits S Expoente x = ( 1) S r. simples: 23 bits r. dupla: 52 bits Fração (1+ Fração) 2 (Expoente Viés) 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ão simples: o número é 24 bits (implica 1+uma fração de 23 bits) Precisão dupla: o número é 53 bits (implica 1+uma fração de 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 é S ( ) ( ( 1) ( 2 ) ( 3 ) ) E V 1 1+ s1 2 + s2 2 + s3 2 + K 2 A notação desejável deve representar o expoente mais negativo como 00..00 2 e o mais positivo como 11..11 2 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 log 10 2 23 0.3 6 dígitos decimais de precisão Duplo: aproximadamente 2 52 Equivalente a 52 log 10 2 52 0.3 16 dígitos decimais de precisão
Exemplo de Ponto Flutuante (1) Representar 0.75 O número -0.75 10 é também -3/4 10 ou -3/2 2 10 Representado pela fração binária -11 2 /2 2 10 ou -1.1 2 2-1 0.75 = ( 1) 1 1.1 2 2 1, onde S = 1 1 + Fração =.1000 00 2 Expoente Real (i.e., ER = E - V) deve ser igual a 1 Simples: E = 1 + 127 = 126 = 01111110 2 Duplo: E = 1 + 1023 = 1022 = 01111111110 2 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 00 2 = 1 2-2 = 0.25 Expoente = 10000001 2 = 129 x = ( 1) 1 (1 + 0.25) 2 (129 127) = ( 1) 1.25 2 2 = 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 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 10 1 + 1.610 10 1 1. Alinhas os pontos decimais Deslocar número com expoente menor 9.999 10 1 + 0.016 10 1 2. Adicionar significante 9.999 10 1 + 0.016 10 1 = 10.015 10 1 3. Normalizar o resultado & checar estouro positivo/negativo 1.0015 10 2 4. Arredondar e normalizar, se necessário 1.002 10 2 127 2-126
Adição de Ponto Flutuante Agora consideremos um exemplo binário de 4 digitos 1.000 2 2 1 + 1.110 2 2 2 (0.5 + 0.4375) 1. Alinhar pontos binários Deslocar número com expoente menor 1.000 2 2 1 + 0.111 2 2 1 2. Adicionar significante 1.000 2 2 1 + 0.111 2 2 1 = 0.001 2 2 1 3. Normalizar resultado & checar estouro positivo/negativo 1.000 2 2 4, sem estouro positivo/negativo 4. Arredondar e renormalizar, se necessário 127-4 -126 1.000 2 2 4 (sem mudança) 0.0001000 = 8 / 2 7 = 0.0625
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 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 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 subtrai expoentes multiplexador Passo 1 Passo 2 multiplexador Passo 3 Passo 4
Exercício Tente somar os números 0.25 10 e 0.125 10 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 10 10 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 10 5 3. Normalizar o resultado & checar estouro 1.0212 10 6 4. Arredondar e renomalizar, se necessário 1.021 10 6 5. Determinar o sinal do resultado apartir dos sinais dos operandos +1.021 10 6
Multiplicação de Ponto Flutuante Agora consideremos um exemplo binário de 4 bits 1.000 2 2 1 1.110 2 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 2 1.110 2 = 1.1102 1.110 2 2 3 3. Normalizar o resultado & checar estouro 1.110 2 2 3 sem estouro positivo/negativo 4. Arredondar e renormalizar, se necessário 1.110 2 2 3 (nenhuma mudança) 5. Determinar o sinal: +ve ve ve 1.110 2 2 3 0.001110 = 14 / 2 6 = 0.21875 ER = E - V
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 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 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 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, $f6 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
Exemplo de 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: 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 The BIG Picture Bits não têm significado inerente Eles podem representar inteiros com/sem sinal, números de ponto flutuante e instruções 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 -1.50E+38 y 1.50E+38 0.00E+00 z 1.0 1.0 1.00E+00 x+(y+z) -1.50E+38 1.50E+38 0.00E+00 O número 1.50 10 x10 38 é muito maior do que 1 Precisa validar programas paralelos sob diferentes níveis de paralelismo
Divisão e Deslocamento para Direita Deslocamento para esquerda por i multiplica um inteiro por 2 i Deslocamento para direita divide por 2 i? Somente para inteiros sem sinal Para inteiros com sinal Deslocamento à direita aritmético: replica o bit de sinal e.g., 5 / 4 11111011 2 >> 2 = 11111110 2 = 2 O resultado é -2 10 em vez de -1 10 ; próximo, mas não exato c.f. 11111011 2 >>> 2 = 00111110 2 = +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.25 10 e 0.125 10 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 Para uma entrada de 40 farenheit, o resultado é 0x408e38e4 ou 4.4444447 Para checar os resultados, use o conversor disponível no site http://www.h-schmidt.net/floatconverter/
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) π r 3 e que a área da superfície é dada por 4 π r 2. Assuma π=3.14 Dica: transforme o valor de π em uma fração