Aula 03 Aritmética Computador de von Neumann Unidade lógica e aritmética Diz respeito a: Desempenho (segundos, ciclos, instruções) Abstrações: Arquitetura do Conjunto de Instruções Linguagem Assembly e Linguagem de Máquina Para que serve: Implementar a Arquitetura operation a 32 ALU result 32 b 32 Aritmética MIPS • • Todas as instruções usa 3 registradores A ordem dos registradores é fixa (primeiro o registrador destino) Exemplo: C code: A = B + C MIPS code: add $s0, $s1, $s2 (associado às variáveis pelo compilador) Fluxo de Controle • Instrução slt – set on less than if slt $t0, $s1, $s2 $s1 < $s2 then $t0 = 1 else $t0 = 0 Números Bits são apenas bits (sem 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 Naturalmente resultam em algumas sofisticações: números são finitos (overflow) números fracionários e reais números negativos p.ex., no MIPS não existe instrução de subtração imediata - addi pode adicionar um número negativo) Como representamos números negativos? i.e., que padrões de bits representam os números? Possíveis Representações Sinal e 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 Comparações: balanceamento, número de zeros, facilidade de operações Qual é o melhor? Por que? MIPS Números sinalizados de 32 bits: 0000 0000 0000 ... 0111 0111 1000 1000 1000 ... 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000two = 0ten 0000 0000 0000 0000 0000 0000 0001two = + 1ten 0000 0000 0000 0000 0000 0000 0010two = + 2ten 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1111 1111 0000 0000 0000 1110two 1111two 0000two 0001two 0010two = = = = = + + – – – 2,147,483,646ten 2,147,483,647ten 2,147,483,648ten 2,147,483,647ten 2,147,483,646ten 1111 1111 1111 1111 1111 1111 1101two = – 3ten 1111 1111 1111 1111 1111 1111 1110two = – 2ten 1111 1111 1111 1111 1111 1111 1111two = – 1ten maxint minint Operações em Complemento de 2 Negar um número em complemento de 2: inverter todos os bits e somar 1 lembrança: “negar” e “inverter” são diferentes! Convertendo um número de n bits em números com mais de n bits: Um dado imediato de 16 bits do MIPS é convertido para 32 bits em aritmética Copiar o bit mais significativo (o bit de sinal) para outros bits 0010 -> 0000 0010 1010 -> 1111 1010 "sign extension" Adição & Subtração Como no curso primário (carry/borrow) 0111 + 0110 0111 - 0110 0110 - 0101 Operações em complemento de 2 subtração usando soma de números negativos 0111 + 1010 Overflow (resultado muito grande para um computador de tamanho de palavra finito): P.ex., somando dois números de n-bits não resulta em n-bits 0111 + 0001 1000 note que o bit de overflow é enganoso, ele não significa um carry de transbordo Detectando Overflow Não ocorre overflow quando se soma um número positivo e um negativo quando os sinais são os mesmos para a subtração Overflow ocorre quando o valor afeta o sinal: quando somando dois positivos resulta num negativo ou, somando dois negativos resulta num positivo ou, subtraindo um negativo de um positivo e dá um negativo ou, subtraindo um positivo de um negativo e dá um positivo Considerar as operações A + B, e A – B Pode ocorrer overflow se B é 0 ? Pode ocorrer overflow se A é 0 ? Efeitos do Overflow Uma exceção (interrupt) ocorre A instrução salta para endereço predefinido para a rotina de exceção O endereço da instrução interrompida é salvo para possível retorno Nem sempre se requer a detecção do overflow — novas instruções MIPS: addu, addiu, subu nota: addiu still sign-extends! nota: sltu, sltiu for unsigned comparisons Revisão: Álgebra Booleana & Portas Problema: Considerar uma função lógica com 3 entradas: A, B, e C. A saída D é “true” se pelo menos uma entrada é “true” A saída E é “true” se exatamente duas entradas são “true” A saída F é “true” somente se todas as três entradas são “true” Mostrar a tabela verdade para essas três funções. Mostrar as equações Booleanas para as três funções. Mostrar uma implementação consistindo de portas inversoras, AND, e OR. Uma ALU (arithmetic logic unit) Seja uma ALU para suportar as instruções andi e ori Projetar uma ALU de 1 bit, e replicá-la 32 vezes operation a op a b result b Possível implementação (soma-de-produtos): res Revisão: Multiplexador Seleciona uma das entradas para a saída, baseado numa entrada de controle S A 0 B 1 C nota: mux de 2-entradas embora tenha 3 entradas! Seja construir a nossa ALU usando um MUX: Implementação de ALU de um bit Não é fácil decidir a “melhor” forma para construir algo Não queremos muitas entradas para uma única porta (fan-in) Não queremos distribuir para muitas portas (fan-out) Para o nosso propósito, facilidade de compreensão é importante Seja a ALU de 1-bit para soma: CarryIn a Sum cout = a b + a cin + b cin sum = a xor b xor cin b CarryOut Como construir uma ALU de 1-bit para soma, AND e OR? Como construir uma ALU de 32-bits? Construindo uma ALU de 32 bits CarryIn a0 Operation b0 CarryIn ALU0 Result0 CarryOut CarryIn a Operation a1 0 b1 CarryIn ALU1 Result1 CarryOut 1 Result a2 2 b2 b CarryIn ALU2 Result2 CarryOut CarryOut a31 b31 CarryIn ALU31 Result31 E sobre subtração (a – b) ? Técnica do complemento de 2: apenas negar b e somar. Como negar? Solução: Operation Binvert CarryIn a 0 1 b 0 2 1 CarryOut Result Outras operações da ALU do MIPS Deve suportar a instrução set-on-less-than (slt) lembrar: slt é uma instrução aritmética produz um 1 se rs < rt, e 0 caso contrário usar subtração: (a - b) < 0 implica a < b Deve suportar o teste para igualdade (beq $t5, $t6, $t7) usar subtração: (a - b) = 0 implica a = b Suportando slt Binvert Operation CarryIn a 0 1 Result b 0 2 1 Less 3 a. CarryOut Desenhando a idéia? Binvert Operation CarryIn a 0 1 Result b 0 2 1 Less 3 Set Overflow detection b. Overflow Binvert CarryIn a0 b0 CarryIn ALU0 Less CarryOut a1 b1 0 CarryIn ALU1 Less CarryOut a2 b2 0 CarryIn ALU2 Less CarryOut Operation Result0 Result1 Result2 CarryIn a31 b31 0 CarryIn ALU31 Less Result31 Set Overflow Teste de igualdade Bnegate •Nota: zero é 1 quando o resultado é zero! Operation a0 b0 CarryIn ALU0 Less CarryOut Result0 a1 b1 0 CarryIn ALU1 Less CarryOut Result1 a2 b2 0 CarryIn ALU2 Less CarryOut Result2 a31 b31 0 CarryIn ALU31 Less Zero Result31 Set Overflow Linhas de controle Operation Binvert 000 001 010 110 111 = = = = = and or add subtract slt Conclusão Podemos construir uma ALU para suportar o conjunto de instruções MIPS -- usando multiplexador para selecionar a saída desejada realizando uma subtração usando o complemento de 2 replicando uma ALU de 1-bit para produzir uma ALU de 32-bits Pontos importantes sobre o hardware Todas as portas estão sempre trabalhando A velocidade de uma porta é afetada pelo número de entradas da porta A velocidade de um circuito é afetado pelo número de portas em série (no caminho crítico ou nivel mais profundo da lógica) Mudanças inteligentes na organização pode melhorar o desempenho Problema: somador ripple carry (vai-um propagado) é lento Uma ALU de 32-bits é tão rápida quanto uma ALU de 1-bit? Existem mais de uma forma de somar? dois extremos: ripple carry e soma-de-produtos Voce pode ver a propagação do vai-um? Como resolvê-lo? c1 c2 c3 c4 = = = = a0c0 a1c1 a2c2 a3c3 + + + + b0c0 b1c1 b2c2 b3c3 + + + + a0b0 = (a0 + b0)c0 + a0b0 a1b1 a2b2 a3b3 Somador de vai-um antecipado (Carry-lookahead) - CLA Uma técnica intermediária entre dois extremos Motivação: Se não sabemos o valor do carry-in, o que fazemos? Quando sempre geramos um carry? Quando propagamos um carry? gi = ai bi pi = ai + bi Resolvemos o ripple calculando o vai-um antecipadamente, usando as equações: c1 c2 c3 c4 = = = = g0 g1 g2 g3 + + + + p0c0 p1c1 p2c2 p3c3 CarryIn a0 b0 a1 b1 a2 b2 a3 b3 CarryIn Result0--3 ALU0 P0 G0 pi gi Carry-lookahead unit C1 a4 b4 a5 b5 a6 b6 a7 b7 a8 b8 a9 b9 a10 b10 a11 b11 a12 b12 a13 b13 a14 b14 a15 b15 Construção de somadores grandes ci + 1 CarryIn Result4--7 ALU1 P1 G1 pi + 1 gi + 1 C2 ci + 2 CarryIn Result8--11 usar o princípio de CLA novamente! ALU2 P2 G2 pi + 2 gi + 2 C3 ci + 3 CarryIn Result12--15 ALU3 P3 G3 pi + 3 gi + 3 C4 CarryOut ci + 4 Multiplicação Mais complicado que soma Realizado via deslocamento e soma Mais tempo e mais área Vejamos 3 versões baseados no algoritmo 0010 __x_1011 (multiplicando) (multiplicador) Números negativos: converter e multiplicar Multiplicação: Implementação Start Multiplier0 = 1 1. Test Multiplier0 Multiplier0 = 0 1a. Add multiplicand to product and place the result in Product register Multiplicand Shift left 64 bits 2. Shift the Multiplicand register left 1 bit Multiplier Shift right 64-bit ALU 32 bits Product Write 64 bits 3. Shift the Multiplier register right 1 bit Control test 32nd repetition? No: < 32 repetitions Yes: 32 repetitions Done Start Segunda Versão Multiplier0 = 1 1. Test Multiplier0 Multiplier0 = 0 1a. Add multiplicand to the left half of the product and place the result in the left half of the Product register Multiplicand 32 bits Multiplier Shift right 32-bit ALU 2. Shift the Product register right 1 bit 32 bits Product Shift right Write Control test 3. Shift the Multiplier register right 1 bit 64 bits 32nd repetition? No: < 32 repetitions Yes: 32 repetitions Done Versão Final Start Product0 = 1 1. Test Product0 Product0 = 0 1a. Add multiplicand to the left half of the product and place the result in the left half of the Product register Multiplicand 32 bits 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 Multiplicação Paralela a5 a4 a3 a2 a1 a0 = A x b5 b4 b3 b2 b1 b0 = B ___________________________________ a5b0 a4b0 a3b0 a2b0 a1b0 a0b0 = W1 a5b1 a4b1 a3b1 a2b1 a1b1 a0b1 = W2 a5b2 a4b2 a3b2 a2b2 a1b2 a0b2 = W3 a5b3 a4b3 a3b3 a2b3 a1b3 a0b3 = W4 a5b4 a4b4 a3b4 a2b4 a1b4 a0b4 = W5 a5b5 a4b5 a3b5 a2b5 a1b5 a0b5 = W6 _________________________________________________________________ P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 = AxB=P Somadores CPA – Carry Propagation Adder Faz a adição de 2 números A e B para produzir o resultado A + B. CSA – Carry Save Adder Faz a adição de 3 números A, B e D, produzindo dois resultados: soma S e vai-um C. Matematicamente, tem-se A + B + D = S + C. A = 1 1 1 1 0 1 B = 0 1 0 1 1 0 D = 1 1 0 1 1 1 __________________________ C = 1 1 0 1 1 1 S = 0 1 1 1 0 0 __________________________ A+B+D=S+C = 1 0 0 0 1 0 1 0 B A Circuito de Multiplicação Paralela Gerador de multiplicandos deslocados CSA1 CSA2 CSA3 CSA4 CPA P=AxB A B 111011 110111 gerador de multiplicandos deslocados 111011 111011 5 Exemplo 000000 4 111011 111011 2 1 3 CSA1 01100100 111011 CSA2 10011010 01111110 4 3 10100001 1 CSA3 01100100 00011110000 4 10010001101 1 CSA4 010011000000 001100101101 1 CPA 110010101101 AxB Ponto Flutuante Necessitamos de uma forma para representar Números com frações, p.ex., 3.1416 Números muito pequenos, p.ex., .000000001 Números muito grandes, p.ex., 3.15576 109 Representação: Sinal, expoente, significando: (–1)sinal significando 2expoente Mais bits para o significando dá mais resolução Mais bits para o expoente aumenta o intervalo (range) Padrão ponto flutuante IEEE 754: Precisão simples: expoente de 8 bits, significando de 23 bits Precisão dupla: expoente de 11 bits, significando de 52 bit Padrão de ponto flutuante IEEE 754 O primeiro bit (leading bit), “1” do significando é implícito Expoente é “polarizado” para fazer a separação facilmente bias de 127 para precisão simples e 1023 para precisão dupla Resumo: (–1)sinal (1+significando) 2expoente – bias Exemplo: decimal: -.75 = -3/4 = -3/22 binário: -.11 = -1.1 x 2-1 Ponto flutuante: expoente = 126 = 01111110 Precisão simples IEEE: 10111111010000000000000000000000 Complexidade do Ponto Flutuante Além do overflow tem “underflow” Precisão pode ser um grande problema IEEE 754 mantem dois extra bits, guard e round Quatro modos de arredondamento positivo dividido por zero resulta em “infinito” zero dividido por zero resulta em “not a number” Outras complexidades A Implementação do padrão pode ser complicado Não usar o padrão pode ser mesmo pior Representação ponto flutuante Formato s exp frac s é o bit de sinal s = 0 positivo s=1 negativo exp é usado para obter E frac é usado para obter M Valor representado (-1)s M 2E Significando M é um valor fracionário no intervalo [1.0,2.0), para números normalizados e [0 e 1) para números denormalizados Exponente E fornece o peso em potência de dois Valores numéricos Normalizados Condição exp 000…0 e exp 111…1 Expoente codificado como valor polarizado (biased) E = exp – bias exp : valor não sinalizado bias : valor da polarização Precisão Simples: 127 (exp: 1…254, E: -126…127) Precisão dupla: 1023 (exp: 1…2046, E: -1022…1023) Em geral: bias = 2e-1 - 1, onde e e´ o numero de bits do expoente Significando codificado com bit 1 mais significativo (leading bit) implicito M = 1.xxx…x2 xxx…x: bits da frac Minimo quando 000…0 (M = 1.0) Maximo quando 111…1 (M = 2.0 – ) O bit extra (leading bit 1) e´ obtido “implicitamente” Valores denormalizados Condição exp = 000…0 Valor Valor do Expoente E = –Bias + 1 Valor do Significando M = 0.xxx…x2 xxx…x: bits de frac Casos exp = 000…0, frac = 000…0 Representa valor 0 Nota-se que existem valores distintos +0 e –0 exp = 000…0, frac 000…0 Numeros muito próximos de 0.0 Perde precisão à medida que vai diminuindo “ underflow gradual” Valores especiais Condição exp = 111…1 Casos exp = 111…1, frac = 000…0 Representa valor(infinito) Operação que transborda (overflow) Ambos positivo e negativo P. ex., 1.0/0.0 = 1.0/0.0 = +, 1.0/0.0 = exp = 111…1, frac 000…0 Not-a-Number (NaN) Nenhum valor numérico pode ser determinado P. ex., sqrt(–1), Resumo da codificação de números reais em ponto flutuante NaN -Normalizado +Denorm -Denorm 0 +0 +Normalizado + NaN Representação ilustrativa de 8 bits Representação ponto flutuante de 8 bits O bit de sinal e´ o bit mais significativo. Os seguintes quatro bits são expoente, com bias de 7. Os últimos três bits bits são frac Semelhante a forma geral no formato IEEE normalizado, denormalizado Representação de 0, NaN, infinito 7 6 s 0 3 2 exp frac Valores Relativos ao Expoente exp 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 E 2E -6 -6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 +6 +7 n/a 1/64 1/64 1/32 1/16 1/8 1/4 1/2 1 2 4 8 16 32 64 128 (denorms) (inf, NaN) Intervalo s exp 0 0 0 números denormalizados … 0 0 0 0 … 0 0 números 0 Normalizados 0 0 … 0 0 0 frac E Valor 0000 000 0000 001 0000 010 -6 -6 -6 0 1/8*1/64 = 1/512 2/8*1/64 = 2/512 Mais perto de zero 0000 0000 0001 0001 110 111 000 001 -6 -6 -6 -6 6/8*1/64 7/8*1/64 8/8*1/64 9/8*1/64 = = = = 6/512 7/512 8/512 9/512 maior denorm menor norm 0110 0110 0111 0111 0111 110 111 000 001 010 -1 -1 0 0 0 14/8*1/2 15/8*1/2 8/8*1 9/8*1 10/8*1 = = = = = 14/16 15/16 1 9/8 10/8 7 7 n/a 14/8*128 = 224 15/8*128 = 240 inf 1110 110 1110 111 1111 000 perto de 1 abaixo perto de 1 acima maior norm Distribuição de valores Formato de 6-bits tipo IEEE e = 3 bits de expoente f = 2 bits de fracao bias e´ 3 Notar como a distribuição fica mais densa perto de zero. -15 -10 -5 Denormalized 0 5 Normalized Infinity 10 15 Distribuição de Valores perto de zero Formato de 6-bits, tipo IEEE e = 3 bits de expoente f = 2 bits de fração Bias igual a 3 -1 -0,5 Denormalized 0 Normalized Infinity 0,5 1 Numeros interessantes exp frac Zero 00…00 00…00 menor Pos. Denorm. 00…00 00…01 Descrição valor numérico 0.0 2– {23,52} X 2– {126,1022} Single 1.4 X 10–45 Double 4.9 X 10–324 maior Denorm. 00…00 11…11 (1.0 – ) X 2– {126,1022} Single 1.18 X 10–38 Double 2.2 X 10–308 menor Pos. Norm. 00…01 00…00 Um 01…11 00…00 maior Normalized 11…10 11…11 Single 3.4 X 1038 Double 1.8 X 10308 1.0 X 2– {126,1022} 1.0 (2.0 – ) X 2{127,1023} Operações em ponto flutuante Conceitualmente Primeiro computar o resultado exato Fazê-lo enquadrar na precisão desejada transborda se o expoente for muito grande arredonda para caber no frac Modos de arredondamento 1.40 1.60 1.50 Zero 1 1 1 Round down (-) 1 1 1 Round up (+) 2 2 2 Nearest Even (default) 1 2 2 2.50 2 2 3 2 –1.50 –1 –2 –1 –2 Nota: 1. Round down: resultado e´perto mas não maior que o resultado verdadeiro. 2. Round up: resultado e´perto mas não menor do que o resultado verdadeiro. Multiplicação em FP Operandos * (–1)s1 M1 2E1 (–1)s2 M2 2E2 Resultado exato (–1)s M 2E Sinal s: s1 xor s2 Significando M: M1 * M2 Expoente E: E1 + E2 Representação final se M ≥ 2, deslocar à direita M, incrementar E se E fora do intervalo, overflow Arredonda M para caber em frac Adição FP Operandos (–1)s1 M1 2E1 E1–E2 (–1)s2 M2 2E2 (–1)s1 M1 Assumir E1 > E2 (–1)s2 M2 + Resultado exato (–1)s M 2E (–1)s M Sinal s, significando M: Resultado de alinhamento e adição Expoente E: E1 Representação final Se M ≥ 2, deslocar à direita M, incrementa E Se M < 1, deslocar à esquerda M de k posições, decrementar E de k Overflow se E fora do intervalo arredonda M para caber em frac Ariane 5 Explodiu 37 segundos após decolagem Por que? Foi computada a velocidade horizontal como número em ponto flutuante Convertido para inteiro de 16-bits Funcionou bem para Ariane 4 Ocorreu Overflow para Ariane 5 Foi usado o mesmo software