Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquitetura de Computadores
Emilio Francesquini
e.francesquini@ufabc.edu.br
2021.Q1
Centro de Matemática, Computação e Cognição
Universidade Federal do ABC
Disclaimer
1
Aritmética para computadores
Aritmética para computadores
Operações em inteiros
I Soma e subtração
I Multiplicação e divisão
I Lidando com overflow
Números de ponto flutuante
I Representação e operações
2
Adição de inteiros
Exemplo: 7 + 6
4
Lidando com overflows
5
Aritmética para aplicações multimídia
6
Multiplicação e Divisão de Inteiros
Multiplicação
7
Multiplicação - Exemplo
2x3=6
4 bits
Iteration Step Multiplier Multiplicand Product
0 Initial values 0011 0000 0010 0000 0000
1 1a: 1 ⇒ Prod = Prod + Mcand 0011 0000 0010 0000 0010
2: Shift left Multiplicand 0011 0000 0100 0000 0010
3: Shift right Multiplier 0001 0000 0100 0000 0010
2 1a: 1 ⇒ Prod = Prod + Mcand 0001 0000 0100 0000 0110
2: Shift left Multiplicand 0001 0000 1000 0000 0110
3: Shift right Multiplier 0000 0000 1000 0000 0110
3 1: 0 ⇒ No operation 0000 0000 1000 0000 0110
2: Shift left Multiplicand 0000 0001 0000 0000 0110
3: Shift right Multiplier 0000 0001 0000 0000 0110
4 1: 0 ⇒ No operation 0000 0001 0000 0000 0110
2: Shift left Multiplicand 0000 0010 0000 0000 0110
3: Shift right Multiplier 0000 0010 0000 0000 0110
8
Hardware para multiplicação
9
Multiplicador otimizado
10
Um multiplicador ainda mais rápido
12
Divisão
1001010 | 1000
-1000 ---------
---- 1001
0001
10 # baixa o 0
101 # baixa o 1
1010 # baixa o 0
Operandos de n bits resultam
-1000
em um quociente e resto de ----
n bits. 0010 <- resto
14
Divisão - Exemplo
7 / 2 = 3 resto 1
4 bits
Iteration Step Quotient Divisor Remainder
0 Initial values 0000 0010 0000 0000 0111
1: Rem = Rem – Div 0000 0010 0000 1110 0111
1 2b: Rem < 0 ⇒ +Div, sll Q, Q0 = 0 0000 0010 0000 0000 0111
3: Shift Div right 0000 0001 0000 0000 0111
1: Rem = Rem – Div 0000 0001 0000 1111 0111
2 2b: Rem < 0 ⇒ +Div, sll Q, Q0 = 0 0000 0001 0000 0000 0111
3: Shift Div right 0000 0000 1000 0000 0111
1: Rem = Rem – Div 0000 0000 1000 1111 1111
3 2b: Rem < 0 ⇒ +Div, sll Q, Q0 = 0 0000 0000 1000 0000 0111
3: Shift Div right 0000 0000 0100 0000 0111
1: Rem = Rem – Div 0000 0000 0100 0000 0011
4 2a: Rem ≥ 0 ⇒ sll Q, Q0 = 1 0001 0000 0100 0000 0011
3: Shift Div right 0001 0000 0010 0000 0011
1: Rem = Rem – Div 0001 0000 0010 0000 0001
5 2a: Rem ≥ 0 ⇒ sll Q, Q0 = 1 0011 0000 0010 0000 0001 15
3: Shift Div right 0011 0000 0001 0000 0001
Hardware para divisão
16
Hardware otimizado para divisão
18
Divisão no MIPS
1 div rs, rt
2 divu rs, rt
19
Números com pontos flutuantes
Pontos flutuantes
20
Padrão IEEE 754-1985
21
Formato IEEE para números em ponto flutuante
23
Precisão Dupla
24
Sobre a precisão de pontos flutuantes
A precisão é relativa
I Todos os bits da mantissa são levados em consideração
I Precisão simples: ≈ 2−23
Equivalente a 23 × log10 2 ≈ 23 × 0.3 ≈ 6 casas decimais
I Precisão dupla: ≈ 2−52
Equivalente a 52 × log10 2 = 52 × 0.3 ≈ 16 casas decimais
25
Exemplo 1
26
Exemplo 2
27
Infinitos e NaNs
± Infinito
I Expoente: 1111...11
I Mantissa: 0000...00
I Pode ser utilizado pelos cálculos seguintes sem a necessidade de verificações
de overflow
Qualquer operação com Inf resulta em Inf, exceto com NaN que resulta em NaN.
NaN - Not a Number
I Expoente: 1111...11
I Mantissa: =
6 0000...00
√
I Indica uma operação ilegal ou resultado não definido ( −1 ou divisão por 0,
por exemplo).
I Pode ser utilizado pelos cálculos seguintes sem a necessidade de verificações
de overflow.
Qualquer operação com NaN resulta em NaN.
28
Resumo
29
Adição e multiplicação de pontos
flutuantes
Adição de pontos flutuantes
30
Adição de pontos flutuantes
31
Hardware para a soma de FPs
32
Somador de FPs
33
Multiplicação de FPs
1 Some expoentes
I Para expoentes com bias subtraia o bias da soma
I Novo expoente = 10 + (–5) = 5
2 Multiplique as mantissas
I 1.110 × 9.200 = 10.212 → 10.212 × 105
3 Normaliza o resultado e verifica por over/underflow
I 1.0212 × 106
4 Arredonda e renormaliza se necessário
I 1.021 × 106 $
5 Determina o sinal do resultado pelo sinal dos operandos
I +1.021 × 106
34
Multiplicação de FPs
1 Soma expoentes
I Sem bias: –1 + (–2) = –3
I Com bias: (–1 + 127) + (–2 + 127) = –3 + 254–127 = –3 + 127
2 Multiplica mantissa
I 1.0002 × 1.1102 = 1.1102 → 1.1102 × 2–3
3 Normaliza resultado e verifica over/underflow
I 1.1102 × 2–3 (sem mudanças) sem over/underflow
4 Arredonda e renormaliza (se necessário)
I 1.1102 × 2–3 (sem mudanças)
5 Determina sinal: + × – → –
I –1.1102 × 2–3 = –0.21875
35
Multiplicador de FPs
36
Instruções de FP no MIPS
Instruções FP no MIPS
6 # Comparação
7 # P. Simples: c.eq.s c.lt.s c.le.s ...
8 # P. Dupla: c.eq.d c.lt.d c.le.d ...
9 # Ambos os casos setam o bit de condição para 0 ou 1
10 c.lt.s $f3, $f4
11
38
Exemplo de código com FPs - °F para °C
1 f2c:
2 lwc1 $f16, const5($gp) # Carrega 5.0 para $f16
3 lwc1 $f18, const9($gp) # Carrega 9.0 para $f18
4 div.s $f16, $f16, $f18 # Div. $f16 por $f18
5 lwc1 $f18, const32($gp) # Carrega 32.0 para $f18
6 sub.s $f18, $f12, $f18 # Subtrai $f18 de $f12
7 mul.s $f0, $f16, $f18 # Multiplica $f16 $f18
8 jr $ra # Retorna
39
Exemplo 2 - Multiplicação de arrays
X =X+Y ×Z
I Todos são matrizes de 32 × 32 de FPs de precisão dupla
Código em C
40
Exemplo 2 - Multiplicação de arrays
1 li $t1, 32 # $t1 = 32 (tamanho linha/fim do laço)
2 li $s0, 0 # i = 0; inicializa primeiro laço
3 L1: li $s1, 0 # j = 0; reinicia segundo laço
4 L2: li $s2, 0 # k = 0; reinicia terceiro laço
5 sll $t2, $s0, 5 # $t2 = i * 32 (tam. da linha de x)
6 addu $t2, $t2, $s1 # $t2 = i * tamanho(linha) + j
7 sll $t2, $t2, 3 # $t2 = byte offset de [i][j]
8 addu $t2, $a0, $t2 # $t2 = endereço de x[i][j]
9 l.d $f4, 0($t2) # $f4 = 8 bytes de x[i][j]
10 L3: sll $t0, $s2, 5 # $t0 = k * 32 (tam da linha de z)
11 addu $t0, $t0, $s1 # $t0 = k * tamanho(linha) + j
12 sll $t0, $t0, 3 # $t0 = byte offset de [k][j]
13 addu $t0, $a2, $t0 # $t0 = endereco de z[k][j]
14 l.d $f16, 0($t0) # $f16 = 8 bytes de z[k][j]
15 sll $t0, $s0, 5 # $t0 = i*32 (tam. da linha de y)
16 addu $t0, $t0, $s2 # $t0 = i*tamanho(linha) + k
17 sll $t0, $t0, 3 # $t0 = byte offset de [i][k]
18 addu $t0, $a1, $t0 # $t0 = endereco de y[i][k]
19 l.d $f18, 0($t0) # $f18 = 8 bytes de y[i][k]
20 mul.d $f16, $f18, $f16 # $f16 = y[i][k] * z[k][j]
21 add.d $f4, $f4, $f16 # f4=x[i][j] + y[i][k]*z[k][j]
22 addiu $s2, $s2, 1 # $k = k + 1
23 bne $s2, $t1, L3 # if (k != 32) vai para L3
24 s.d $f4, 0($t2) # x[i][j] = $f4
25 addiu $s1, $s1, 1 # $j = j + 1
26 bne $s1, $t1, L2 # if (j != 32) vai para L2
27 addiu $s0, $s0, 1 # $i = i + 1 41
28 bne $s0, $t1, L1 # if (i != 32) vai para L1
Aritmética mais precisa
42
Outras Arquiteturas e Conclusão
Arquitetura FP do x86
43
Instruções de FP no x86
Variações
I Operando inteiro: I
I Pop do operando da pilha: P
I Ordem inversa dos operandos: R
I Mas nem todas as combinações são possíveis. 44
Streaming SIMD Extension 2 (SSE2)
45
Deslocamento para esquerda e divisão
46
Associatividade
(x + y) + z x + (y + z)
x −1.50E + 38 −1.50E + 38
y +1.50E + 38 0.00E + 00
z 1.0 1.0 +1.50E + 38
1.00E + 00 0.00E + 00
47
Quem se importa com a precisão de FPs?
48
Conclusões
49
Conclusões
50