Transcript
Notas da terceira edição Nota: essas notas normalmente são complementadas por outros materiais, como problemas do texto que podem ser trabalhados em sala de aula. É provável que você queira personalizar esse material para que se ajuste às necessidades dos seus alunos. Essas notas foram prepararadas com base em uma turma de alunos que já aprendeu sobre desenvolvimento com lógica e freqüentou um laboratório prático de programação de linguagem assembly que não segue um formato de aula comum.
1
Capítulo 1
2
Introdução • O objetivo deste curso é mostrar como os computadores funcionam • Mas o que queremos dizer com a palavra “computador”? • Diferentes tipos: desktop, servidores, dispositivos embutidos – Diferentes usos: automóveis, design gráfico, finanças, genética... – Diferentes fabricantes: Intel, Apple, IBM, Microsoft, Sun... – Diferentes tecnologias subjacentes e diferentes custos! • Analogia: Pense em um curso sobre “veículos automotivos” – Muitas semelhanças de um veículo para outro (por exemplo, volantes) – Grandes diferenças de um veículo para outro (por exemplo, gasolina, álcool) • Melhor maneira de aprender: – Concentrar em um exemplo específico e aprender como ele funciona – Abordar princípios gerais e perspectivas históricas
3
Por que aprender esse assunto? • Você deseja se tornar um “cientista da computação” • Você deseja desenvolver softwares utilizáveis (precisam de desempenho) • Você precisa tomar uma decisão em relação a uma compra ou oferecer conselhos de “especialista”
• Tanto o hardware quanto o software afetam o desempenho: – O algoritmo determina o número de instruções na origem – Linguagem/compilador/arquitetura determinam as instruções da máquina (Capítulos 2 e 3)
– Processador/memória determinam a velocidade com que as instruções são executadas (Capítulos 5, 6 e 7)
• Avaliando e entendendo o desempenho no Capítulo 4
4
O que é um computador? • Componentes: – entrada (mouse, teclado) – saída (monitor, impressora) – memória (unidades de disco, DRAM, SRAM, CD) – rede • Nosso foco principal: o processador (caminho de dados e controle) – Implementado usando milhões de transistores – Impossível de entender olhando para os transistores – Precisamos...
5
Abstração • Uma boa dica para obter mais informações é aprofundar-se nos componentes
Programa em linguagem de alto nível (em C)
• Uma abstração omite detalhes desnecessários
swap (int v[], int k) {int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; }
e ajuda a entender a complexidade Compilador
Programa em linguagem assembly (para MIPS)
Quais são alguns dos detalhes que aparecem nestas abstrações familiares?
swap: muli add lw lw sw sw jr
$2, $5, 4 $2, $4, $2 $15, 0($2) $16, 4($2) $16, 0($2) $15 4($2) $31
Assembler
Programa em linguagem de máquina binária (para MIPS)
000000001010000100000000000000011000 000000000001100110000001100000100001 100011000110001000000000000000000000 100011001111001000000000000000000100 101011001111001000000000000000000000 101011000110001000000000000000000100 000000111110000000000000000000000100
6
Como os computadores funcionam? • É preciso entender abstrações como: – – – – – – – – – – –
Software de aplicações Software de sistemas Linguagem assembly Linguagem de máquina Aspectos de arquitetura, como caches, memória virtual, canalização Lógica seqüencial, máquinas de estado finito Lógica combinatória, circuitos aritméticos Lógica booleana, 1s e 0s Transistores usados para construir portões lógicos (CMOS) Semicondutores/silício usados para construir transistores Propriedades dos átomos, elétrons e dinâmica quantitativa
• Muito o que aprender!
7
Arquitetura do conjunto de instruções • Uma abstração muito importante – interface entre o hardware e o software de baixo nível – padroniza instruções, padrões de bits de linguagem de máquina etc. – vantagem: diferentes implementações da mesma arquitetura – desvantagem: algumas vezes impede o uso de inovações Verdadeiro ou falso: A compatibilidade binária é extremamente importante?
• Arquiteturas de conjunto de instruções modernas: – IA-32, PowerPC, MIPS, SPARC, ARM e outras
8
Perspectiva histórica • O ENIAC, construído na Segunda Guerra Mundial, foi o primeiro computador de finalidade geral – Usado para calcular tabelas de disparo de artilharia – 24 metros de comprimento por 2,5 metros de altura e dezenas de centímetros de profundidade – Cada um dos 20 registradores de 10 dígitos tinha 60 centímetros de comprimento – Usava 18.000 válvulas – Efetuava 1.900 adições por segundo
– Desde então: Lei de Moore: A capacidade dos transistores dobra a cada 18 a 24 meses
9
Capítulo 2
10
Instruções • Linguagem da máquina • Vamos trabalhar com a arquitetura do conjunto de instruções MIPS – Semelhante a outras arquiteturas desenvolvidas desde a década de 1980 – Quase 100 milhões de processadores MIPS fabricados em 2002 – Usada pela NEC, Nintendo, Cisco, Silicon Graphics, Sony... 1400
1300
1200
Milhões de processadores
1100
1000
Outro SPARC Hitachi SH PowerPC
Motorola 68K
900
MIPS IA-32
800
ARM
700
600 500
400
300 200
100 0 1998
1999
2000
2001
2002
11
Aritmética MIPS • Todas as instruções possuem três operandos • A ordem do operando é fixa (destino primeiro) Exemplo: Código C:
a = b + c
Código MIPS:
add a, b, c
(falaremos sobre registradores em breve)
“O número natural de operandos para uma operação como adição é três... Exigir que cada instrução tenha exatamente três operandos, nem mais nem menos, está de acordo com a filosofia de manter o hardware simples.”
12
Aritmética MIPS • Princípio de projeto: a simplicidade favorece a regularidade. • É claro, isso complica algumas coisas...
Código C:
a = b + c + d;
Código MIPS:
add a, b, c add a, a, d
• Os operandos precisam ser registradores, apenas 32 registradores fornecidos • Cada registrador contém 32 bits • Princípio de projeto: quanto menor, melhor.
Por quê?
13
Registradores versus memória • Os operandos das instruções aritméticas precisam ser registradores – apenas 32 registradores fornecidos
• O compilador associa variáveis com registradores • E quanto aos programas com muitas variáveis?
Entrada
Controle Memória Caminho de dados Processador
Saída
E/S
14
Organização da memória • Vista como um array grande e unidimensional, com um endereço. • Um endereço de memória é um índice para o array. • “Endereçamento de byte” significa que o índice aponta para um byte da memória.
0 8 bits de dados 1 8 bits de dados 2 8 bits de dados 3 8 bits de dados 4 8 bits de dados 5 8 bits de dados 6 8 bits de dados ... 15
Organização da memória • Os bytes são bons, mas a maioria dos itens de dados usam “words” maiores • Para o MIPS, uma word possui 32 bits ou 4 bytes.
0 4
32 bits de dados
8 12
32 bits de dados
32 bits de dados
Os registradores armazenam 32 bits de dados
32 bits de dados
• 232 bytes com endereços de byte de 0 a 232–1 • 230 words com endereços de byte 0, 4, 8, ... 232–4 • As words são alinhadas Por exemplo, quais são os 2 bits menos significativos de um endereço de word?
16
Instruções • Instruções load e store • Exemplo: Código C:
A[12] = h + A[8];
Código MIPS:
lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 48($s3)
• Pode se referir aos registradores por nome (por exemplo, $s2, $t2) em vez do número
• A instrução store word tem o destino por último • Lembre-se de que os operandos são registradores, não memória! Não podemos escrever:
add 48($s3), $s2, 32($s3)
17
Nosso primeiro exemplo • Você pode descobrir o código? swap(int v[ ], int k); { int temp; temp = v[k] v[k] = v[k+1]; v[k+1] = temp; } swap: muli $2, $5, 4 add $2, $4, $2 lw $15, 0($2) lw $16, 4($2) sw $16, 0($2) sw $15, 4($2) jr $31
Æ
18
Até agora, aprendemos: • MIPS – carga de words mas endereçamento de bytes – aritmética apenas em registradores • Instrução add $s1, $s2, $s3 sub $s1, $s2, $s3 lw $s1, 100($s2) sw $s1, 100($s2)
Significado $s1 = $s2 + $s3 $s1 = $s2 – $s3 $s1 = Memory[$s2+100] Memory[$s2+100] = $s1
19
Linguagem de máquina • Instruções, como registradores e words de dados, também possuem 32 bits de tamanho
– Exemplo: add $t1, $s1, $s2 – Registradores têm números, $t1=9, $s1=17, $s2=18 • Formato da instrução: 000000
10001
10010
01000
00000
100000
op
rs
rt
rd
shamt
funct
• Você sabe o significado dos nomes de campo?
20
Linguagem de máquina • Pense nas instruções load-word e store-word – O que o princípio da regularidade nos levaria a fazer? – Novo princípio: Um bom projeto exige comprometimento • Introduza um novo tipo de formato de instrução – Tipo I para instruções de transferência de dados – Outro formato era o tipo R para o registrador • Exemplo: lw $t0, 32($s2) 35
18
9
op
rs
rt
32 número de bit 16
• Qual é o compromisso?
21
Conceito do programa armazenado • Instruções são bits • Programas são armazenados na memória – para serem lidos ou escritos exatamente como os dados
Memória para dados, programas, compiladores, editores etc. Processador
Memória
• Ciclo de execução e busca – As instruções são buscadas e colocadas em um registrador especial – Os bits no registrador “controlam” as ações subseqüentes – Busca a próxima instrução e continua
22
Controle • Instruções de tomada de decisão – altera o fluxo de controle – por exemplo, mudar a “próxima” instrução a ser executada • Instruções de desvio condicionais do MIPS: bne $t0, $t1, Label beq $t0, $t1, Label
• Exemplo: if (i==j) h = i + j; bne $s0, $s1, Label add $s3, $s0, $s1 Label: ....
23
Controle • Instruções de desvio incondicionais do MIPS: j label
• Exemplo: if (i!=j) h=i+j; else h=i-j;
beq $s4, $s5, Lab1 add $s3, $s4, $s5 j Lab2 Lab1: sub $s3, $s4, $s5 Lab2: ...
• Você pode construir um “loop for” simples?
24
Até agora: • Instrução
Significado
add $s1,$s2,$s3 sub $s1,$s2,$s3 lw $s1,100($s2) sw $s1,100($s2) bne $s4,$s5,L beq $s4,$s5,L j Label
$s1 = $s2 + $s3 $s1 = $s2 – $s3 $s1 = Memory[$s2+100] Memory[$s2+100] = $s1 Next instr. is at Label if $s4 ¹ $s5 Next instr. is at Label if $s4 = $s5 Next instr. is at Label
• Formatos: R
op
rs
rt
rd
I
op
rs
rt
endereço de 16 bits
J
op
shamt
funct
endereço de 26 bits
25
Fluxo de controle • Temos: beq e bne; e branch-if-less-than? • Nova instrução: if
slt $t0, $s1, $s2
$s1 < $s2 then $t0 = 1 else $t0 = 0
• Podemos usar essa instrução para construir “blt $s1, $s2, Label” – agora podemos construir estruturas de controle gerais • Note que o assembler precisa de um registrador para fazer isso – existe uma política das convenções de uso para registradores
26
Política das convenções de uso Nome
Número do registrador
$zero
0
Uso O valor constante 0
$v0-$v1
2-3
Valores para resultados e avaliação de expressões
$a0-$a3
4-7
Argumentos
$t0-$t7
8-15
Temporários
$s0-$s7
16-23
Valores salvos
$t8-$t9
24-25
Mais temporários
$gp
28
Ponteiro global
$sp
29
Pointeiro de pilha
$fp
30
Pointeiro de quadro
$ra
31
Endereço de retorno
Registrador 1 ($at) reservado para o assembler, 26-27 para o sistema operacional
27
Constantes • Constantes pequenas são usadas muito freqüentemente (50% dos operandos) Por exemplo:
A = A + 5; B = B + 1; C = C - 18;
• Soluções? Por que não? – coloque “constantes típicas” na memória e carregue-as. – crie registradores “hard-wired” (como $zero) para constantes como um. • Instruções MIPS: addi $29, $29, 4 slti $8, $18, 10 andi $29, $29, 6 ori $29, $29, 4
• Princípio de projeto: Torne o caso comum rápido. Que formato?
28
E quanto às constantes maiores? • Gostaríamos de ser capazes de carregar uma constante de 32 bits em um registrador
• Precisamos usar duas instruções; nova instrução “load upper immediate”: lui $t0, 1010101010101010 1010101010101010
preenchido com zeros
0000000000000000
• Depois, precisamos acertar os bits de ordem inferior, por exemplo: ori $t0, $t0, 1010101010101010
1010101010101010
0000000000000000
0000000000000000
1010101010101010
1010101010101010
1010101010101010
ori
29
Linguagem assembly versus linguagem de máquina • O assembly fornece uma representação simbólica conveniente – muito mais fácil do que escrever números – por exemplo, destino primeiro • A linguagem de máquina é realidade subjacente – por exemplo, o destino não é mais o primeiro • O assembly pode fornecer “pseudoinstruções” – por exemplo, “move $t0, $t1” existe apenas no assembly – seria mais bem implementada usando “add $t0,$t1,$zero” • Ao considerar o desempenho, você deve contar as instruções reais
30
Outras questões • Abordadas em seu laboratório de programação de linguagem assembly: – suporte para procedimentos – linkers, carregadores, layout da memória – pilhas, quadros, recursão – manipulação de strings e ponteiros – interrupções e exceções – chamadas de sistema e convenções • Veremos alguns desses mais adiante • Estudaremos as otimizações de compilador no Capítulo 4.
31
Visão geral do MIPS • instruções simples, todas com 32 bits • muito estruturado, nenhuma bagagem desnecessária • apenas três formatos de instrução R
op
rs
rt
rd
I
op
rs
rt
endereço de 16 bits
J
op
shamt
funct
endereço de 26 bits
• nos baseamos no compilador para obter desempenho – quais são os objetivos do compilador?
• ajudamos o compilador onde podemos
32
Endereços em desvios e jumps • Instruções: bne $t4,$t5,Label
A próxima instrução está em Label se $t4 ° $t5
beq $t4,$t5,Label
A próxima instrução está em Label se $t4 = $t5
j Label
A próxima instrução está em Label
• Formatos: I
op
J
op
rs
rt
endereço de 16 bits
endereço de 26 bits
• Os endereços não são de 32 bits – Como manipular isso com instruções load e store?
33
Endereços em desvios • Instruções: bne $t4,$t5,Label beq $t4,$t5,Label
A próxima instrução está em Label se $t4¹$t5 A próxima instrução está em Label se $t4=$t5
• Formatos: I
op
rs
rt
endereço de 16 bits
• Poderíamos especificar um registrador (como lw e sw) e acrescentá-lo ao endereço – use o registrador de endereço de instrução (PC = contador do programa) – a maioria dos desvios é local (princípio da localidade) • As instruções jump usam apenas bits de ordem superior do PC – limites de endereço de 256 MB
34
Resumindo Operandos MIPS Nome
Exemplo
Comentários
32 registradores
$s0-$s7, $t0-$t9, $zero, $a0-$a3, $v0-$v1, $gp, $fp, $sp, $ra, $at Memória[0], Memória[4]..... Memória[4294967292]
Locais rápidos para dados. No MIPS, os dados precisam estar em registradores para a realização de operações aritméticas. O registrador MIPS $zero sempre é igual a 0. O registrador $at é reservado para o assembler tratar de constantes grandes. Acessadas apenas por instruções de transferência de dados. O MIPS utiliza endereços em bytes, de modo que os endereços em words seqüenciais diferem em 4 vezes. A memória contém estruturas de dados, arrays e spilled registers, como aqueles salvos nas chamadas de procedimento.
30
2 words na memória
Assembly do MIPS Categoria
Instrução
Exemplo
Significado
Comentários
Aritmética
add subtract add immediate load word
[TD]add $s1,$s2,$s3[TN] [TD]sub $s1,$s2,$s3[TN] addi $s1,$s2,100[TN] [TD]lw $s1,100($s2)[TN]
[TD]$s1 = $s2 + $s3[TN] [TD]$s1 = $s2- $s3[TN] [TD]$s1=$s2 + 100[TN] $s1 = Memória[$s2 + 100
Três operandos; dados nos registradores Três operandos; dados nos registradores Usada para somar constantes Dados da memória para o registrador
store word load byte store byte load upper immed. branch on equal
[TD]sw $s1,100($s2)[TN] lb $s1,100($s2)[TN] sb $s1,100($s2)[TN] [TD]lui $s1,100[TN] beq $s1,$s2,25
Dados do registrador para a memória Byte da memória para o registrador Byte de um registrador para a memória Carrega constante nos 16 bits mais altos Testa igualdade; desvio relativo ao PC
branch on not equal set on less than
bne $s1,$s2,25 slt $s1,$s2,$s3
set less than immediate jump
slti $s1,$s2,100
Memória[$s2 + 100] = $s1 $s1 = Memória[$s2 + 100 Memória[$s2+100] = $s1 [TD]$s1 = 100 * 216[TN] if ($s1 == $s2) go to PC + 4 + 100 if ($s1 != $s2) go to PC + 4 + 100 if ($s2 < $s3) $s1 = 1; else $s1 = 0 if ($s2 < 100) $s1 = 1; else $s1 = 0
j 2500
go to 10000
Desvia para endereço de destino
jump register jump and link
jr $ra jal 2500
go to [TD]$ra[TN] [TD]$ra[TN] = PC + 4. go to 10000
Para switch e retorno de procedimento Para chamada de procedimento
Transferência de dados
Desvio condicional
Desvio incondicional
Testa desigualdade; relativo ao PC Compara menor que; usado com beq, bne Compara menor que constante
35
1. Endereçamento imediato op
rs
rt
Imediato
2. Endereçamento em registrador op
rs
rd
rt
...
Registradores
funct
Registrador
3. Endereçamento de base op
rs
rt
Memória
Endereço
+
Registrador
Byte
Halfword
Word
4. Endereçamento relativo ao PC op
rs
Endereço
rt
PC
Memória
Word
5. Endereçamento pseudodireto op
Endereço
PC
Memória
Word
36
Arquiteturas alternativas • Alternativa de projeto: – forneça operações mais poderosas – o objetivo é reduzir o número de instruções executadas – o risco é um tempo de ciclo mais lento e/ou uma CPI mais alta — “O caminho em direção à complexidade da operação é, portanto, repleto de perigos. Para evitar esses problemas, os projetistas passaram para instruções mais simples.
• Vejamos (brevemente) o IA-32
37
IA-32 • • • • • • • • • •
1978: O Intel 8086 é anunciado (arquitetura de 16 bits) 1980: O coprocessador de ponto flutuante 8087 é acrescentado 1982: O 80286 aumenta o espaço de endereçamento para 24 bits; mais instruções 1985: O 80386 estende para 32 bits; novos modos de endereçamento 1989-1995: O 80486, Pentium e Pentium Pro acrescentam algumas instruções (especialmente projetadas para um maior desempenho) 1997: 57 novas instruções “MMX” são acrescentadas; Pentium II 1999: O Pentium III acrescenta outras 70 instruções (SSE) 2001: Outras 144 instruções (SSE2) 2003: A AMD estende a arquitetura para aumentar o espaço de endereço para 64 bits; estende todos os registradores para 64 bits, além de outras mudanças (AMD64) 2004: A Intel se rende e abraça o AMD64 (o chama EM64T) e inclui mais extensões de mídia
• Essa história ilustra o impacto das “algemas douradas” da compatibilidade “adicionando novos recursos da mesma forma que se coloca roupas em uma sacola”, uma arquitetura “difícil de explicar e impossível de amar”.
38
Visão geral do IA-32 • Complexidade: – instruções de 1 a 17 bytes de tamanho – um operando precisa agir como origem e destino – um operando pode vir da memória – modos de endereçamento complexos, por exemplo, “índice base ou escalado com deslocamento de 8 ou 32 bits”
• Graça salvadora: – as instruções mais usadas não são difíceis de construir – os compiladores evitam as partes da arquitetura que são lentas “O que o 80x86 perde em estilo é compensado na quantidade, tornando-o belo, do ponto de vista apropriado”
39
Registradores e endereçamento de dados do IA-32 • Registradores no subconjunto de 32 bits que surgiram com o 80386 Nome
Uso 31
0
EAX
GPR0
ECX
GPR1
EDX
GPR2
EBX
GPR3
ESP
GPR4
EBP
GPR5
ESI
GPR6
EDI
GPR7
EIP EFLAGS
CS
Ponteiro do segmento de código
SS
Ponteiro do segmento de pilha (topo da pilha)
DS
Ponteiro do segmento de dados 0
ES
Ponteiro do segmento de dados 1
FS
Ponteiro do segmento de dados 2
GS
Ponteiro do segmento de dados 3 Ponteiro de instrução (PC) Códigos de condição
40
Restrições de registrador do IA-32 • Os registradores não são de “finalidade geral” — observe as restrições abaixo Modo Registrador indireto
Descrição
Restrições de registrador
Equivalente MIPS
Endereço está em um registrador.
não ESP ou EBP
lw $s0,0($s1)
Modo base com 8 ou 32 bits de deslocamento
Endereço é o conteúdo do registrador base mais deslocamento.
não ESP ou EBP
lw $s0,100($s1)#deslocamento £ 16 bits
Base mais índice escalado
x Índice), onde O endereço é Base + (2 Escala tem o valor 0, 1, 2 ou 3.
Base: qualquer GPR Índice: não ESP
mul $t0,$s2,4 add $t0,$t0,$s1 lw $s0,0($t0)
Escala x Índice) + O endereço é Base + (2 deslocamento, onde Escala tem o valor 0, 1, 2 ou 3.
Base: qualquer GPR Índice: não ESP
mul $t0,$s2,4 add $t0,$t0,$s1 lw $s0,100($t0)#deslocamento £ 16 bits
Base mais índice escalado com 8 ou 32 bits de deslocamento
Escala
FIGURA 2.42 Modos de endereçamento de 32 bits do IA-32 com restrições de registrador e o código MIPS equivalente. O modo de endereçamento Base mais Índice Escalado, que não aparece no MIPS ou no PowerPC, foi incluído para evitar as multiplicações por quatro (fator de escala 2) para transformar um índice de um registrador em um endereço em bytes (ver Figuras 2.34 e 2.36). Um fator de escala 1 é usado para dados de 16 bits, e um fator de escala 3 para dados de 64 bits. O fator de escala 0 significa que o endereço não é escalado. Se o deslocamento for maior do que 16 bits no segundo ou quarto modos, então o modo MIPS equivalente precisaria de mais duas instruções: um lui para ler os 16 bits mais altos do deslocamento e um add para somar a parte alta do endereço ao registrador base $s1 (a Intel oferece dois nomes diferentes para o que é chamado modo de endereçamento com base com base e indexado -, mas eles são basicamente idênticos, e os combinamos aqui).
41
Instruções típicas do IA-32 • Quatro tipos principais de instruções de inteiro: – Movimento de dados, incluindo move, push, pop – Aritmética e lógica (registrador de destino ou memória) – Fluxo de controle (uso de códigos de condição/flags) – Instruções de string, incluindo movimento e comparação de strings Instrução JE nome JMP nome CALL nome MOVW EBX,[EDI+45] PUSH ESI POP EDI ADD EAX,#6765 TEST EDX,#42 MOVSL
Função se for igual(códigos de condição) {EIP=nome}; EIP-128 nome < EIP+128 EIP=nome SP=SP-4; M[SP]=EIP+5; EIP=nome; EBX=M[EDI+45] SP=SP-4; M[SP]=ESI EDI=M[SP]; SP=SP+4 EAX= EAX+6765 Define códigos de condição (flags) com EDX e 42 M[EDI]=M[ESI]; EDI=EDI+4; ESI=ESI+4
FIGURA 2.43 Algumas instruções IA-32 típicas e suas funções. Uma lista de operações freqüentes aparece na Figura 2.44. O CALL salva na pilha o EIP da próxima instrução (EIP é o PC da Intel).
42
Formatos de instruções IA-32 • Formatos típicos: (observe os diferentes tamanhos) a. JE EIP + deslocamento 4 4 8 CondiDeslocamento ção
JE
b. CALL 8
32 Deslocamento (offset)
CALL
c. MOV EBX, [EDI + 45]
6
1 1
8
8
MOV
d w
Pós-byte r/m
Deslocamento
d. PUSH ESI 5 3 PUSH
Reg
e. ADD EAX, #6765 4 3 1
32 Imediato
ADD Reg w
f. TEST EDX, #42 7 1 TEST
w
8 Pós-byte
32 Imediato
43
Resumo • A complexidade da instrução é apenas uma variável – instrução mais baixa versus CPI mais alta/velocidade de clock mais baixa • Princípios de projeto: – a simplicidade favorece a regularidade – menor é mais rápido – um bom projeto exige comprometimento – torne o caso comum rápido • Arquitetura do conjunto de instruções – uma abstração muito importante!
44
Capítulo 3
45
Números • Bits são apenas bits (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
• Obviamente, torna-se mais complicado: números são finitos (overflow) frações e números reais números negativos por exemplo, nenhuma instrução subi do MIPS; addi pode somar um número negativo
• Como representamos os números negativos? Por exemplo, que padrões de bit representarão esses números?
46
Representações possíveis • Sinal e magnitude: 000 = +0 001 = +1 010 = +2 011 = +3 100 = –0 101 = –1 110 = –2 111 = –3
Complemento a um 000 = +0 001 = +1 010 = +2 011 = +3 100 = –3 101 = –2 110 = –1 111 = –0
Complemento a dois 000 = +0 001 = +1 010 = +2 011 = +3 100 = –4 101 = –3 110 = –2 111 = –1
• Questões: equilíbrio, número de zeros, facilidade de operações • Qual é o melhor? Por quê?
47
MIPS • Números de 32 bits com sinal: 0000 0000 0000 ... 0111 0111 1000 1000 1000 ... 1111 1111 1111
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000
0000bin = 0dec 0001bin = + 1dec 0010bin = + 2dec
1111 1111 0000 0000 0000
1111 1111 0000 0000 0000
1110bin 1111bin 0000bin 0001bin 0010bin
1111 1111 0000 0000 0000
1111 1111 0000 0000 0000
1111 1111 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 0000 0000 0000
1111 1111 1111 1111 1111 1111
= = = = =
+ + -
2,147,483,646dec 2,147,483,647dec 2,147,483,648dec 2,147,483,647dec 2,147,483,646dec
maxint minint
1111bin = - 3dec 1111bin = - 2dec 1111bin = - 1dec
48
Operações de complemento a dois • Negar um número de complemento a dois: inverta todos os bits e some 1 – lembre-se: “negar” e “inverter” são muito diferentes! • Converter números de n bits em números com mais de n bits: – o campo imediato de 16 bits do MIPS é convertido em 32 bits para aritmética – copie o bit mais significativo (o bit de sinal) para os outros bits 0010 –> 0000 0010 1010 –> 1111 1010
• “extensão de sinal” (lbu versus lb)
49
Adição e subtração • Exatamente como aprendemos na escola (emprestar/subir 1s) 0111 + 0110
0111 – 0110
0110 – 0101
• Facilidade de operações do complemento a dois – subtração usando adição para números negativos 0111 + 1010
• Overflow (resultado muito grande para a word finita do computador): – por exemplo, somar dois números de n bits não produz um número de n bits 0111 + 0001 1000
note que o termo overflow é um pouco confuso; ele não significa que um carry “transbordou”
50
Detectando overflow • Nenhum overflow quando somar um número positivo com um negativo • Nenhum overflow quando sinais são iguais para subtração • O overflow ocorre quando o valor afeta o sinal: – overflow ao somar dois positivos produz um negativo – ou, somar dois negativos produz um positivo – ou, subtraia um negativo de um positivo e obtenha um negativo – ou, subtraia um positivo de um negativo e obtenha um positivo • Considere as operações A + B e A – B – Pode ocorrer overflow se B for 0? – Pode ocorrer overflow se A for 0?
51
Efeitos do overflow • Uma exceção (interrupção) ocorre – O controle salta para um endereço predefinido para exceção – O endereço interrompido é salvo para uma possível retomada • Detalhes baseados na linguagem/sistema de software – exemplo: controle de vôo versus dever de casa • Nem sempre desejamos detectar overflow – novas instruções MIPS: addu, addiu, subu – Nota: addiu – Nota: sltu, sltiu
ainda com extensão de sinal para comparações sem sinal
52
Multiplicação • Mais complexa do que a adição – realizada através de deslocamento e adição • Mais tempo e mais área • Vejamos três versões baseadas em um algoritmo da escola 0010 x 1011
(multiplicando) (multiplicador)
• Números negativos: converta e multiplique – existem técnicas melhores mas não as veremos
53
Multiplicação: Implementação Início
Multiplicador0 = 1
Multiplicando
1. Testar Multiplicador0
Multiplicador0 = 0
1a. Soma multiplicando ao produto e coloca o resultado no registrador Produto
Deslocar à esquerda
64 bits
Multiplicador Deslocar à direita
ALU de 64 bits
2. Deslocar registrador Multiplicando 1 bit à esquerda
32 bits Produto Escrever
Teste de controle
3. Deslocar registrador Multiplicador 1 bit à direita
64 bits
Não: < 32 repetições 32ª repetição?
Caminho de dados
Sim: 32 repetições
Controle Fim
54
Versão final • O multiplicador inicia na metade direita do produto Início
Produto0 = 1
1. Testar Produto0
Produto0 = 0
Multiplicando 32 bits
ALU de 32 bits
Deslocar à direita Produto Escrever
Teste de controle
3. Desloque o registrador Produto 1 bit para a direita
64 bits
32ª repetição?
O que entra aqui?
Não: < 32 repetições
Sim: 32 repetições
Fim
55
Ponto flutuante (um breve exame) • Precisamos de uma maneira de representar – números com frações, por exemplo, 3,1416 – números muito pequenos, por exemplo, 0,000000001 – números muito grandes, por exemplo, 3,15576 × 109 • Representação: – sinal, expoente, significando: (–1)sinal × significando × 2expoente – mais bits para o significando fornece mais precisão • mais bits para o expoente aumenta a faixa • Padrão de ponto flutuante IEEE 754: – precisão única: expoente de 8 bits, significando de 23 bits – precisão dupla: expoente de 11 bits, significando de 52 bits
56
Padrão de ponto flutuante IEEE 754 • O bit “1” inicial do significando está implícito • O expoente é “desviado” para facilitar a classificação – todos os 0s são o menor expoente, todos os 1s são o maior – desvio do 127 para precisão única e do 1023 para precisão dupla – resumo: (–1)sinal × (1 + significando) × 2expoente – desvio • Exemplo: – decimal: –0,75 = – ( ½ + ¼ ) – binário: –0,11 = – 1,1 × 2–1 – ponto flutuante: expoente = 126 = 01111110 – precisão única IEEE: 10111111010000000000000000000000
57
Adição de ponto flutuante Expoente
Sinal
Fração
Expoente
Sinal
Fração
1. Compare os expoentes dos dois números. Desloque o menor número para a direita até que seu expoente combine com o expoente maior.
ALU pequena
Diferença do expoente 0
Início
2. Some os significandos
0
1
0
1
3. Normalize a soma, deslocando para a direita e incrementando o expoente, ou deslocando para a esquerda e decrementando o expoente.
Desloca à direita
Controle
1
Overflow ou underflow?
ALU grande
Sim
Não 0
0
1
Exceção
1 4. Arredonde o significando para o número de bits apropriado
Incrementa ou decrementa
Desloca para esquerda ou direita
Não
Hardware de arredondamento
Ainda normalizado?
Sim Sinal
Expoente
Fração Fim
58
Complexidades do ponto flutuante • As operações são um pouco mais complicadas (veja o texto) • Além do overflow podemos ter o “underflow” • A precisão pode ser um grande problema – O IEEE 754 mantém dois bits extras, guarda e arredondamento – quatro modos de arredondamento – positivo dividido por zero produz “infinidade” – zero dividido por zero não produz um número – outras complexidades • Implementar o padrão pode ser arriscado • Não usar o padrão pode ser ainda pior – veja no texto a descrição do 80x86 e o bug do Pentium!
59
Resumo do Capítulo 3 • A aritmética de computador é restrita por uma precisão limitada • Os padrões de bit não têm um significado inerente mas existem padrões – complemento a dois – ponto flutuante IEEE 754 • As instruções de computador determinam o “significado” dos padrões de bit • O desempenho e a precisão são importantes; portanto, existem muitas complexidades nas máquinas reais
• A escolha do algoritmo é importante e pode levar a otimizações de hardware para espaço e tempo (por exemplo, multiplicação)
• Você fazer uma revisão pode ser uma boa idéia (a Seção 3.10 é uma ótima leitura!)
60
Capítulo 4
61
Desempenho • Meça, informe e resuma • Faça escolhas inteligentes • Veja através da propaganda de marketing • Vital para entender a motivação organizacional subjacente Por que alguns hardwares são melhores do que outros para diferentes programas? Que fatores do desempenho de sistema são relacionados ao hardware? (por exemplo, precisamos de uma nova máquina ou de um novo sistema operacional?) Como o conjunto de instruções da máquina afeta o desempenho?
62
Qual destes aviões possui o melhor desempenho?
Avião
Passageiros
Autonomia (milhas)
Velocidade (milhas por hora)
Boeing 737-100
101
630
598
Boeing 747
470
4150
610
BAC/Sud Concorde
132
4000
1350
Douglas DC-8-50
146
8720
544
• O quanto mais rápido é o Concorde comparado com o 747? • O quanto maior é o 747 do que o Douglas DC-8?
63
Desempenho do computador: TEMPO, TEMPO, TEMPO • Tempo de resposta (latência) – Quanto tempo leva para meu trabalho ser realizado? – Quanto tempo leva para realizar um trabalho? – Quanto tempo preciso esperar para a consulta ao banco de dados? • Vazão (throughput) – Quantos trabalhos a máquina pode realizar ao mesmo tempo? – Qual é a velocidade de execução média? – Quanto trabalho está sendo feito? • Se atualizarmos uma máquina com um novo processador, em que melhoramos? • Se acrescentarmos uma máquina ao laboratório, em que melhoramos?
64
Tempo de execução • Tempo decorrido – conta tudo (acessos a disco e a memória, E/S etc.) – um número útil, mas normalmente não é ideal para fins de comparação • Tempo de CPU – não conta E/S ou tempo gasto executando outros programas – pode ser dividido em tempo de sistema e tempo de usuário • Nosso foco: tempo de CPU do usuário – tempo gasto executando as linhas de código que estão “em” nosso programa
65
Definição de desempenho do livro • Para um programa sendo executado na máquina X, DesempenhoX = 1 / Tempo_execuçãoX
• “X é n vezes mais rápido do que Y” DesempenhoX / DesempenhoY = n
• Problema: – a máquina A executa um programa em 20 segundos – a máquina B executa o mesmo programa em 25 segundos
66
Ciclos de clock • Em vez de informar o tempo de execução em segundos, normalmente usamos ciclos segundos programa
=
ciclos programa
x
segundos ciclos
• As marcações de clock indicam quando iniciar as atividades (uma abstração):
tempo
• tempo de ciclo = tempo entre as marcações = segundos por ciclo • velocidade de clock (freqüência) = ciclos por segundo (1 Hz. = 1 ciclo/segundo) Um clock de 4 Ghz possui um tempo de ciclo de
1 x 1012 =250 picosegundos (ps) 9 4 x 10
67
Como melhorar o desempenho segundos programa
=
ciclos programa
x
segundos ciclos
• Portanto, para melhorar o desempenho (tudo mais sendo igual), você pode (aumentar ou diminuir?) o número de ciclos necessários para um programa, ou o tempo de ciclo de clock ou, dito de outra maneira, a velocidade de clock.
68
Quantos ciclos são necessários para um programa?
. . .
6ª instrução
5ª instrução
4ª instrução
3ª instrução
2ª instrução
1ª instrução
• Poderíamos considerar que o número de ciclos é igual ao número de instruções
Tempo
Essa suposição é incorreta; diferentes instruções levam diferentes períodos de tempo em diferentes máquinas. Por quê? Dica: lembre-se de que essas são instruções de máquina, não linhas de código C.
69
Diferentes números de ciclos para diferentes instruções
tempo
• A multiplicação leva mais tempo do que a adição • As operações de ponto flutuante levam mais tempo do que as operações de inteiros • Acessar a memória leva mais tempo do que acessar os registradores • Importante: Mudar o tempo de ciclo normalmente muda o número de ciclos necessários para várias instruções (veja mais posteriormente)
70
Exemplo • Nosso programa favorito é executado em 10 segundos no computador A, que possui um clock de 4 GHz. Estamos tentando ajudar um projetista de computador a construir uma nova máquina B, que execute esse programa em 6 segundos. O projetista determinou que um aumento substancial na velocidade de clock é possível, mas esse aumento afetará o restante do projeto da CPU, fazendo com que o computador B exija 1,2 vez mais ciclos de clock do que o computador A para esse programa. Que velocidade de clock devemos pedir para que o projetista almeje?
• Não entre em pânico! Podemos resolver isso facilmente usando os princípios básicos
71
Agora que entendemos os ciclos • Um determinado programa exigirá – um determinado número de instruções (instruções de máquina) – um determinado número de ciclos – um determinado número de segundos • Temos um vocabulário que relaciona essas quantidades: – tempo de ciclo (segundos por ciclo) – velocidade de clock (ciclos por segundo) – CPI (ciclos por instrução) uma aplicação com excessivo uso de ponto flutuante pode ter uma CPI mais alta
– MIPS (milhões de instruções por segundo) isso seria mais alto para um programa usando instruções simples
72
Desempenho • O desempenho é determinado pelo tempo de execução • Qualquer uma das outras variáveis igualam o desempenho? – número de ciclos para executar o programa? – número de instruções no programa? – número de ciclos por segundo? – número médio de ciclos por instrução? – número médio de instruções por segundo? • Armadilha comum: pensar que uma das variáveis é indicadora do desempenho, quando na realidade não é.
73
Exemplo de CPI • Suponha que tenhamos duas implementações da mesma arquitetura do conjunto de instruções (ISA) Para um determinado programa, A máquina A tem um tempo de ciclo de clock de 250 ps e uma CPI de 2,0 A máquina B tem um tempo de ciclo de clock de 500 ps e uma CPI de 1,2 Que máquina é mais rápida para esse programa e quão mais rápida ela é?
• Se duas máquinas possuem a mesma ISA, qual de nossas quantidades (por exemplo, velocidade de clock, CPI, tempo de execução, número de instruções, MIPS) será sempre idêntica?
74
Exemplo de número de instruções • Um projetista de compilador está tentando decidir entre duas seqüências de código para um determinada máquina. Com base na implementação de hardware, existem três classes diferentes de instruções: Classe A, Classe B e Classe C, e elas exigem um, dois e três ciclos, respectivamente. A primeira seqüência de código possui 5 instruções: 2 de A, 1 de B e 2 de C. A segunda seqüência possui 6 instruções: 4 de A, 1 de B e 1 de C. Que seqüência será mais rápida? O quanto mais rápida? Qual é a CPI para cada seqüência?
75
Exemplo de MIPS • Dois compiladores diferentes estão sendo testados para uma máquina de 4 GHz com três classes diferentes de instruções: Classe A, Classe B e Classe C, e elas exigem um, dois e três ciclos, respectivamente. Ambos os compiladores são usados para produzir código para um grande software. O código do primeiro compilador usa 5 milhões de instruções da Classe A, 1 milhão de instruções da Classe B e 1 milhão de instruções da Classe C. O código do segundo compilador usa 10 milhões de instruções da Classe A, 1 milhão de instruções da Classe B e 1 milhão de instruções da Classe C.
• Que seqüência será mais rápida de acordo com o MIPS? • Que seqüência será mais rápida de acordo com o tempo de execução?
76
Benchmarks • A melhor forma de determinar desempenho é executando uma aplicação real – Usa programas típicos do workload esperado – Ou, típico da classe de aplicações esperada — por exemplo, compiladores/editores, aplicações científicas, design gráfico etc.
• Benchmarks pequenos – ótimos para arquitetos e projetistas – fácil de padronizar – pode ser forçado • SPEC (System Performance Evaluation Cooperative) – as empresas concordaram sobre um conjunto de programas e entradas reais – valioso indicador do desempenho (e da tecnologia do compilador) – ainda pode ser forçado
77
Jogos de benchmark • A Intel reconheceu, envergonhada, na sexta-feira que um bug em um programa de software conhecido como um compilador levou a empresa a anunciar uma velocidade 10 por cento maior dos seus chips microprocessadores em um benchmark da área. Entretanto, os analistas do setor disseram que o erro de codificação foi um comentário infeliz sobre uma prática comum de “mentir” nos testes de desempenho padronizados. O erro foi atribuído à Intel dois dias atrás pela concorrente Motorola, em um teste conhecido como SPECint92. A Intel reconheceu que havia “otimizado” seu compilador para melhorar suas pontuações de teste. A empresa também havia dito que não gostava da prática, mas que foi forçada a fazer as otimizações porque seus concorrentes estavam fazendo o mesmo. No coração do problema da Intel está a prática de “ajustar” os programas de compilador para reconhecerem certos problemas de computação no teste e, então, substituir por partes especiais do código escritas a mão. Sábado, 6 de janeiro de 1996 — New York Times
78
SPEC ‘89 • “Melhorias” e desempenho de compilador 800
700
Taxa de desempenho SPEC
600
500
400
300
200
100
0
gcc
espresso
spice
doduc
nasa7
li
Benchmark
eqntott
matrix300
fpppp
tomcatv
Compilador Compilador melhorado
79
SPEC CPU2000
Benchmarks de inteiros Nome gzip vpr gcc mcf crafty parser eon perlbmk gap vortex bzip2 twolf
Descrição Compactação Posicionamento e roteamento de circuitos FPGA O compilador C Gnu Otimização combinatória Programa de xadrez Programa de processamento de textos Visualização por computador Aplicação Perl Teoria de grupo, interpretador Banco de dados orientado a objetos Compactação Simulador de posicionamento e roteamento de circuitos
Benchmarks de ponto flutuante Nome Wupwise Swim Mgrid Applu Mesa Galgel Art Equake Facerec Ammp Lucas Fma3d Sixtrack Apsi
Tipo Cromodinâmica Quântica Modelo de água rasa Solver multigrade no campo 3D potencial Equação diferencial parcial parabólica/elíptica Biblioteca de gráficos tridimensionais Dinâmica computacional de fluidos Reconhecimento de imagem usando redes neurais Simulação de propagação de ondas sísmicas Reconhecimento de imagem de rostos Química computacional Teste de primalidade Simulação de choque usando método de elementos finitos Projeto de acelerador de física nuclear de alta energia Meteorologia: distribuição de poluentes
FIGURA 4.5 Os benchmarks SPEC CPU2000. Os 12 benchmarks de inteiros no lado esquerdo da tabela são escritos em C e C++, enquanto os benchmarks de ponto flutuante no lado direito são escritos em Fortran (77 ou 90) e em C. Para obter mais informações sobre o SPEC e os benchmarks SPEC, veja www.spec.org. Os benchmarks SPEC CPU usam o tempo de relógio como métrica, mas, como há pouca E/S, eles medem o desempenho da CPU.
80
SPEC 2000 Dobrar a velocidade de clock dobra o desempenho? Uma máquina com uma velocidade de clock mais lenta pode ter um desempenho melhor?
81
Experiência • Telefone para um grande vendedor de computadores e diga que você está com dificuldade de decidir entre dois computadores diferentes, especificamente, que está confuso quanto aos pontos fortes e fracos dos processadores (Por exemplo, entre Pentium 4 2Ghz e Celeron M 1.4 Ghz)
• Que tipo de resposta você provavelmente receberá? • Que tipo de resposta você poderia dar a um amigo com a mesma dúvida?
82
Lei de Amdahl Tempo de execução após melhoria = Tempo de execução não afetado + (Tempo de execução afetado / Quantidade de melhoria)
• Exemplo: “Suponha que um programa seja executado em 100 segundos em uma máquina, com multiplicação responsável por 80 segundos desse tempo. O quanto precisamos melhorar a velocidade da multiplicação se queremos que o programa seja executado 4 vezes mais rápido?” Que tal torná-lo 5 vezes mais rápido?
• Princípio: torne o caso comum rápido
83
Exemplo • Suponha que melhoramos uma máquina fazendo todas as instruções de ponto flutuante serem executadas cinco vezes mais rápido. Se o tempo de execução de algum benchmark antes da melhoria do ponto flutuante é 10 segundos, qual será o aumento de velocidade se metade dos 10 segundos é gasta executando instruções de ponto flutuante?
• Estamos procurando um benchmark para mostrar a nova unidade de ponto flutuante descrita acima e queremos que o benchmark geral mostre um aumento de velocidade de 3 vezes. Um benchmark que estamos considerando é executado durante 100 segundos com o hardware de ponto flutuante antigo. Quanto do tempo de execução as instruções de ponto flutuante teriam que considerar para produzir nosso aumento de velocidade desejado nesse benchmark?
84
Lembre-se • O desempenho é específico a um determinado programa – O tempo de execução total é um resumo consistente do desempenho • Para uma determinada arquitetura, os aumentos de desempenho vêm de: • aumentos na velocidade de clock (sem efeitos de CPI adversos) – melhorias na organização do processador que diminuem a CPI – melhorias no compilador que diminuem a CPI e/ou a contagem de instruções – escolhas de algoritmo/linguagem que afetam a contagem de instruções • Armadilha: esperar que a melhoria em um aspecto do desempenho de uma máquina afete o seu desempenho total
85
Vamos construir um processador • Estamos quase prontos para entrar no Capítulo 5 e iniciar a construção de um processador
• Primeiro, vamos revisar a lógica booleana e construir a ALU de que precisaremos (material do Apêndice B) operação
a 32
ALU resultado 32
b 32
86
Revisão: Álgebra booleana e portões • Problema: Considere uma função lógica com três entradas: A, B e C. A saída D é verdadeira se pelo menos uma entrada for verdadeira A saída E é verdadeira se exatamente duas entradas forem verdadeiras A saída F é verdadeira apenas se todas as três entradas forem verdadeiras
• Mostre a tabela de verdade para essas três funções. • Mostre as equações booleanas para essas três funções. • Mostre a implementação consistindo de portões inversores, AND e OR.
87
Uma ALU (unidade lógica aritmética) • Vamos construir uma ALU para dar suporte às instruções andi e ori – construiremos apenas uma ALU de 1 bit e usaremos 32 deles operação a
op a
b
res
resultado
b
• Implementação possível (soma-dos-produtos):
88
Revisão: o multiplexador • Seleciona uma das entradas para ser a saída, com base em uma entrada de controle S Nota: chamamos isso de um mux de duas entradas, mesmo que ele tenha três entradas!
A
0
B
1
C
• Vamos construir nossa ALU usando um MUX:
89
Diferentes implementações • Não é fácil decidir a “melhor” maneira de construir algo – não queremos entradas demais em um único portão – não queremos ter que atravessar muitos portões – para nossos objetivos, a facilidade de compreensão é importante • Vejamos uma ALU de 1 bit para adição: CarryIn
a Sum
cout = a b + a cin + b cin sum = a xor b xor cin
b
CarryOut
• Como poderíamos construir uma ALU de 1 bit para add, and e or? • Como poderíamos construir uma ALU de 32 bits?
90
Construindo uma ALU de 32 bits Operação CarryIn
a0 b0
CarryIn ALU0 CarryOut
Resultado0
CarryIn ALU1 CarryOut
Resultado1
CarryIn ALU2 CarryOut
Resultado2
Operação CarryIn a1 a
b1
0
1
Resultado
a2 b2
b
+
CarryOut
2
.. .
a31 b31
.. .
CarryIn ALU31
.. .
Resultado31
91
E quanto à subtração (a – b)? • Método do complemento a dois: simplesmente negue b e some. • Como negamos?
• Uma solução muito inteligente: Binvert
Operação CarryIn
a 0
1
b
0
+
Resultado
2
1
CarryOut
92
Acrescentando uma função NOR • Também podemos escolher inverter a. Como obtemos um “a NOR b”? Operação
Ainvert Binvert
a
CarryIn
0 0
1
1
b
0
+
Resultado
2
1
CarryOut
93
Adequando a ALU ao MIPS • Precisamos oferecer suporte à instrução set-on-less-than (slt) • lembre-se: slt é uma instrução aritmética – produz um 1 se rs < rt e produz um 0 em caso contrário – use subtração: (a–b) < 0 implica a < b • Precisamos aceitar teste de igualdade (beq $t5, $t6, $t7) • use subtração: (a–b) = 0 implica a = b
94
Suporte a slt • Podemos imaginar a idéia? Binvert
Binvert
CarryIn
CarryIn a
a
Operação
Ainvert
Operação
Ainvert
0
0
0
0 1
1 1 1 Resultado Resultado b
0
+
b
0
+
2
2 1
1 Less Less
3
3 Set CarryOut Detecção de overflow
Overflow
Todos os outros bits Use esta ALU para o bit mais significativo
95
Suporte a slt Operação
Binvert Ainvert CarryIn
a0 b0
CarryIn ALU0 Less CarryOut
Resultado0
a1 b1 0
CarryIn ALU1 Less CarryOut
Resultado1
a2 b2 0
CarryIn ALU2 Less CarryOut
Resultado2
.. .
. .. . . .. .. a31 b31 0
.. . CarryIn CarryIn ALU31 Less
.. .
Resultado31 Set Overflow
96
Teste de igualdade • Observe as linhas de controle:
Operação
Bnegate Ainvert
0000 0001 0010 0110 0111 1100
= = = = = =
and or add subtract slt NOR
a0 b0
CarryIn ALU0 Less CarryOut
a1 b1 0
CarryIn ALU1 Less CarryOut
CarryIn ALU2 Less CarryOut
a2 b2 0
• Nota: zero é um 1 quando o resultado é zero!
.. .
. .. . .. .. . a31 b31 0
Result0
Result1 .. .
Result2
.. . CarryIn CarryIn ALU31 Less
Zero
.. .
.. .
Result31 Set Overflow
97
Conclusão • Podemos construir uma ALU para aceitar o conjunto de instruções MIPS – idéia básica: usar um multiplexador para selecionar a saída que desejamos – podemos realizar subtração eficientemente usando o complemento a dois – podemos duplicar uma ALU de 1 bit para produzir uma ALU de 32 bits • Pontos importantes sobre hardware – todos os portões estão sempre operando – a velocidade de um portão é influenciada pelo número de entradas do portão – a velocidade de um circuito é influenciada pelo número de portões na série (no “caminho crítico” ou no “nível mais profundo da lógica”)
• Nosso foco principal: compreensão; entretanto, – Mudanças inteligentes na organização podem melhorar o desempenho (semelhante a usar melhores algoritmos no software)
– Vimos isso na multiplicação; agora vejamos na adição
98
Problema: o somador com carry ripple é lento • Uma ALU de 32 bits é tão rápida quanto uma ALU de 1 bit? • Existe mais de uma maneira de fazer adição? – dois extremos: carry ripple e soma-de-produtos Você consegue ver o ripple? Como você se livraria dele? c1 c2 c3 c4
= = = =
b 0 c0 b 1 c1 b 2 c2 b 3 c3
+ + + +
a 0 c0 a 1 c1 a 2 c2 a 3 c3
+ + + +
a0b0 a1b1c2 = a2b2 c3 = a3b3 c4 =
Inviável! Por quê?
99
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 bi
– Quando propagaríamos o carry?
p i = ai + bi
• Nos livramos do ripple? c1 c2 c3 c4
= = = =
g0 g1 g2 g3
+ + + +
p 0 c0 p 1 c1 p 2 c2 p 3 c3
c2 = c3 = c4 = Viável! Por quê?
100
Use princípio para construir somadores maiores CarryIn
a0 b0 a1 b1 a2 b2 a3 b3
a4 b4 a5 b5 a6 b6 a7 b7
a8 b8 a9 b9 a10 b10 a11 b11
a12 b12 a13 b13 a14 b14 a15 b15
CarryIn
Resultado0–3
ALU0 P0 G0
pi gi C1
ci + 1
CarryIn
Unidade de carry lookahead
Resultado4–7
• Não podemos construir um somador de 16 bits dessa maneira... (grande demais)
ALU1 P1 G1
pi + 1 gi + 1 C2
• Poderíamos usar o carry ripple dos
ci + 2
CarryIn
somadores CLA de 4 bits Resultado8–11
• Melhor ainda: use o princípio CLA novamente!
ALU2 P2 G2
pi + 2 gi + 2 C3
ci + 3
CarryIn
Resultado12–15
ALU3 P3 G3
pi + 3 gi + 3 C4
CarryOut
ci + 4
101
Resumo da ALU • • • •
Podemos construir uma ALU para aceitar adição MIPS Nosso foco está na compreensão, não no 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! module MIPSALU (ALUctl, A, B, ALUOut, Zero); input [3:0] ALUctl; input [31:0] A,B; output reg [31:0] ALUOut; output Zero; assign Zero = (ALUOut==0); // Zero é verdadeiro se ALUOut é 0; vai para algum lugar always @(ALUctl, A, B) // reavalia se estes mudarem case (ALUctl) 0: ALUOut <= A & B; 1: ALUOut <= A | B; 2: ALUOut <= A + B; 6: ALUOut <= A - B; 7: ALUOut <= A < B ? 1:0; 12: ALUOut <= ~(A | B); // resultado é nor default: ALUOut <= 0; // default é 0, não deverá acontecer; endcase endmodule
FIGURA B4.3 Uma definição comportamental em Verilog de uma ALU MIPS. Isso poderia ser sintetizado por meio de uma biblioteca de módulos contendo operações aritméticas e lógicas básicas.
102
Capítulo 5
103
O processador: caminho de dados e controle • Estamos prontos para ver uma implementação do MIPS • Simplificada para conter apenas: – instruções de referência à memória: lw, sw – instruções lógicas e aritméticas: add, sub, and, or, slt – instruções de fluxo de controle: beq, j • Implementação genérica: – use o contador de programa (PC) para fornecer endereço de instrução – obtenha a instrução da memória – leia os registradores – use a instrução para decidir exatamente o que fazer • Todas as instruções usam a ALU após lerem os registradores Por quê? Referência à memória? Aritmética? Fluxo de controle?
104
Mais detalhes de implementação • Visão abstrata/simplificada: 4
Add
Add
Dados
PC
Endereço
Instrução
Memória de instruções
Nº do Registrador Registradores Nº do Registrador Nº do Registrador
ALU
Endereço Memória de dados Dados
Dois tipos de unidades funcionais:
– elementos que operam nos valores de dados (combinacionais) – elementos que contêm estado (seqüenciais)
105
Elementos de estado • Sem clock versus com clock • Clocks usados na lógica síncrona – quando um elemento que contém estado deve ser atualizado? Transição de descida
Período de clock
Transição de subida
tempo de ciclo
106
Um elemento de estado sem clock • O trinco set-reset – a saída depende das entradas presentes e também das entradas passadas R Q
Q S
107
Trincos e flip-flops • A saída é igual ao valor armazenado dentro do elemento (não é necessário pedir permissão para olhar o valor)
• A mudança do estado (valor) é baseada no clock • Trincos: sempre que as entradas mudarem e o clock for afirmado • Flip-flop: o estado muda apenas em uma transição de clock (metodologia de acionamento por transição) “Logicamente verdadeiro” — poderia significar eletricamente baixo
Uma metodologia de clocking define quando os sinais podem ser lidos e quando podem ser escritos — não desejaríamos ler um sinal ao mesmo tempo em que ele estivesse sendo escrito
108
Trinco D • Duas entradas: – o valor de dados a ser armazenado (D) – o sinal de clock (C) indicando quando ler e armazenar D • Duas saídas: – o valor do estado interno (Q) e seu complemento C Q
D
C
Q
Q D
109
Flip-flop D • A saída muda apenas na transição do clock
D
Q
D
C
Q
D D latch
D latch C
Q
Q Q
C
D
C
Q
110
Nossa implementação • Uma metodologia de acionamento por transição • Execução típica: – ler conteúdo de alguns elementos de estado, – enviar valores através de alguma lógica combinacional – escrever os resultados em um ou mais elementos de estado Elemento de estado 1
Lógica combinacional
Elemento de estado 2
Ciclo de clock
111
Arquivo de registrador • Construído usando flip-flops D Registrador de leitura número 1 Registrador 0 Registrador 1 ... Registrador de leitura número 1 Registrador de leitura número 2 Banco de registradores Registrador para escrita Dados para escrita
Registrador n – 2
Dados da leitura 1
Dados da leitura 2
M u x
Dados da leitura 1
M u x
Dados da leitura 2
Registrador n – 1
Registrador de leitura número 2
Write
Você entende? Qual é o “Mux” acima?
112
Abstração • Certifique-se de ter entendido as abstrações! • Algumas vezes é fácil achar que entendeu, quando não entendeu Select
A31 Select B31 A
B
M u x
C31
32
32
M u x
32
C
A30
B30
M u x
C30 .. .
.. . A0
B0
M u x
C0
113
Arquivo de registrador • Nota: ainda usamos o clock real para determinar quando escrever Escrita C
0 1 Número do registrador
Decodificador n-para-2n
Registrador 0 .. .
D C Registrador 1
n –1 n
D .. .
C Registrador n – 2 D C Registrador n – 1 Dados para o registrador
D
114
Implementação simples • Inclui as unidades funcionais de que precisamos para cada instrução Endereço de instrução
EscreveMem
Instrução
Add Soma
PC
Memória de instruções a. Memória de instruções
b. Contador de programa
c. Somador
Endereço
Dados para escrita
Dados da leitura Memória de dados
16
Extensão de sinal
32
LeMem a. Unidade de memória de dados b. Unidade de extensão de sinal
5
Números dos registradores
5 5
Dados
Registrador de leitura 1
4 Dados da leitura 1
Registrador de leitura 2 Registradores Registrador para escrita Dados da leitura 2 Dados para escrita
Dados
Operação da ALU
Zero ALU Resultado da ALU
Por que precisamos disso?
EscreveReg a. Registradores
b. ALU
115
Construindo o caminho de dados • Use multiplexadores para uni-los OrigPC
M u x
Add Add
4 Deslocamento de 2 à esquerda
PC
Endereço de Leitura Instrução Memória de instruções
Registrador de leitura 1
OrigALU Dados da leitura 1
Operação da ALU EscreveMem
Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita
M u x
Dados para escrita
Zero ALU Resultado da ALU
MemparaReg Endereço
Dados da leitura
M u x
Memória Dados de dados para escrita
EscreveReg 16
4
Resultado da ALU
Extensão de sinal
32
LeMem
116
Controle • Selecionar as operações a serem realizadas (ALU, leitura/escrita etc.) • Controlar o fluxo de dados (entradas do multiplexador) • Informações vêm dos 32 bits da instrução • Exemplo: add $8, $17, $18
Formato de instrução:
000000
10001
10010
01000
00000
100000
op
rs
rt
rd
shamt
funct
• Operação da ALU com base no tipo de instrução e código de função
117
Controle • Por exemplo, o que a ALU deve fazer com essa instrução • Exemplo: lw $1, 100($2) 35
2
1
op
rs
rt
100 offset de 16 bits
• Entrada do controle da ALU 0000 0001 0010 0110 0111 1100
AND OR add subtract set-on-less-than NOR
• Por que o código para subtrair é 0110 e não 0011?
118
Controle • Precisa descrever hardware para calcular entrada de controle da ALU de 4 bits – tipo de instrução dada 00 = lw, sw 01 = beq, OpALU calculado do tipo de instrução 10 = aritmética – código de função para aritmética
• Descreva-o usando uma tabela verdade (pode se tornar portões): OpALU
Campo func.
OpALU1
OpALU 0
F5
F4
F3
F2
F1
F0
Operação
0 X 1 1 1 1 1
0 1 X X X X X
X X X X X X X
X X X X X X X
X X 0 0 0 0 1
X X 0 0 1 1 0
X X 0 1 0 0 1
X X 0 0 0 1 0
0010 0110 0010 0110 0000 0001 0111
FIGURA 5.13 A tabela verdade para os três bits de controle da ALU (chamados Operação). As entradas são OpALU e o campo de código func. Apenas as entradas para as quais o controle da ALU é ativado são mostradas. Algumas entradas “don’t care” foram incluídas. Por exemplo, como OpALU não usa a codificação 11, a tabela verdade pode conter entradas 1X e X1, em vez de 10 e 01. Além disso, quando o campo func é usado, os dois primeiros bits (F5 e F4) dessas instruções são sempre 10; portanto, eles são termos don’t care e são substituídos por XX na tabela verdade.
119
Add 4
Instrução [31:26]
PC
Endereço de Leitura
RegDst Branch LeMem MemparaReg OpALU EscreveMem OrigALU EscreveReg
Instrução [25:21]
Registrador de leitura 1
Instrução [20:16]
Registrador de leitura 2
Instrução [31:0] Memória de instruções
Controle
Instrução [15:11]
Instrução [15:0]
0 M u x 1
Registrador para escrita
Dados da leitura 1 Dados da leitura 2
1 M u x 0
Dados para escrita Registradores
16
Extensão de sinal
Resultado Add da ALU
Deslocamento de 2 à esquerda
Zero ALU Resultado da ALU
0 M u x 1
Endereço
Dados da leitura
1 M u x 0
Dados Memória para de dados escrita
32 Controle da ALU
Instrução [5:0]
Instrução formato R lw sw beq
RegDst 1 0 X X
OrigALU 0 1 1 0
Mempara Reg 0 1 X X
Escreve Reg 1 1 0 0
Le Mem 0 1 0 0
Escreve Mem 0 0 1 0
Branch 0 0 0 1
ALUOpl 1 0 0 0
ALUOp0 0 0 0 1
120
Controle • Lógica combinacional simples (tabelas verdade) Entradas Op5 Op4 Op3 Op2
OpALU
Op1 Bloco de controle da ALU
Op0
OpALU0 OpALU1 Saídas F3 F2 F (5–0)
Operação 1
Operation
Iw
sw
beq
RegDst OrigALU MemparaReg
F1 Operação 0 F0
Formato R
Operação 2
EscreveReg LeMem EscreveMem Branch OpALU1 OpALU0
121
Nossa estrutura de controle simples • Toda a lógica é combinacional • Esperamos que tudo se acalme e a coisa certa seja feita – a ALU pode não produzir a “resposta certa” imediatamente – usamos sinais de escrita junto com o clock para determinar quando escrever • Tempo de ciclo determinado pela duração do caminho mais longo Elemento de estado 1
Lógica combinacional
Elemento de estado 2
Ciclo de clock
Estamos ignorando alguns detalhes como tempos de setup e hold
122
Implementação de ciclo único • Calcule o tempo de ciclo considerando os retardos insignificantes, exceto: – memória (200ps), ALU e somadores (100ps) acesso ao arquivo de registrador (50ps) OrigPC
M u x
Add Add
4 Deslocamento de 2 à esquerda
PC
Endereço de Leitura Instrução Memória de instruções
Registrador de leitura 1
OrigALU Dados da leitura 1
Operação da ALU EscreveMem
Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita
M u x
Dados para escrita
Zero ALU Resultado da ALU
MemparaReg Endereço
Dados da leitura
M u x
Memória Dados de dados para escrita
EscreveReg 16
4
Resultado da ALU
Extensão de sinal
32
LeMem
123
Nosso direcionamento • Problemas de ciclo único: – e se tivéssemos uma instrução mais complicada, como ponto flutuante? – desperdício de área • Uma solução: – usar um tempo de ciclo “menor” – fazer com que diferentes instruções usem diferentes números de ciclos – um caminho de dados “multiciclo”:
PC
Endereço
Registrador de instrução
A Nº do Registrador Registradores Nº do Registrador
Instrução Memória ou dados Dados
Dados
Registrador de dados da memória
ALU
SaídaALU
B Nº do Registrador
124
Método multiciclo • Vamos reutilizar unidades funcionais – ALU usada para calcular endereço e incrementar o PC – Memória usada para instrução e dados • Nossos sinais de controle não serão determinados diretamente pela instrução – por exemplo, o que a ALU deve fazer para uma instrução “subtração”? • Usaremos uma máquina de estado finito para controle
125
Método multiciclo • Divida as instruções em etapas, cada uma durando um ciclo – equilibre a quantidade de trabalho a ser feito – restrinja cada ciclo para usar apenas uma unidade funcional • No final de um ciclo – armazene os valores para uso em ciclos posteriores (a coisa mais fácil a fazer) – introduza registradores “internos” adicionais
PC
0 M u x 1
Endereço Memória DadosMem Dados para escrita
Instrução [25:21] Instrução [20:16] Instrução [15:0] Registrador de instrução Instrução [15:0] Registrador de dados da memória
0 M u x 1
Registrador de leitura 1
Instrução [15:11]
0 M u x 1 0 M u x 1 16
Dados da Registrador leitura 1 de leitura 2 Registradores Registrador Dados da para escrita leitura 2 Dados para escrita
Extensão 32 de sinal
A
B 4
Zero ALU Resultado da ALU
SaídaALU
0 1 M u 2 x 3
Deslocamento de 2 à esquerda
126
Instruções da perspectiva da ISA • Considere cada instrução da perspectiva da ISA. • Exemplo: – A instrução add muda um registrador. – Registrador especificado pelos bits 15:11 da instrução. – Instrução especificada pelo PC. – Novo valor é a soma (“op”) dos dois registradores. – Registradores especificados pelos bits 25:21 e 20:16 da instrução Reg[Memory[PC][15:11]]
<=
Reg[Memory[PC][25:21]] op Reg[Memory[PC][20:16]]
– Para conseguir isso, precisamos desmembrar a instrução (um tanto como introduzir variáveis ao programar).
127
Desmembrando uma instrução • Definição ISA da aritmética: Reg[Memory[PC][15:11]]
<=
Reg[Memory[PC][25:21]] op Reg[Memory[PC][20:16]]
• Poderia ser dividida em: – IR <= Memory[PC] – A <= Reg[IR[25:21]] – B <= Reg[IR[20:16]] – ALUOut <= A op B – Reg[IR[20:16]] <= ALUOut • Esquecemos uma parte importante da definição da aritmética! – PC <= PC + 4
128
Conceito subjacente do método multiciclo • Definimos cada instrução da perspectiva ISA (faça isso!) • Divida-a em etapas seguindo nossa regra de que os dados fluem através de, no máximo, uma grande unidade funcional (por exemplo, distribua o trabalho entre as etapas)
• Introduza novos registradores conforme necessário (por exemplo, A, B, ALUOut, MDR, etc.)
• Finalmente, experimente concentrar o máximo em cada etapa (evite ciclos desnecessários), enquanto também tenta compartilhar etapas quando possível (minimiza o controle e ajuda a simplificar a solução)
• Resultado: a implementação multiciclo do nosso livro!
129
Cinco etapas de execução • Busca da instrução • Decodificação da instrução e busca dos registradores • Execução, cálculo do endereço de memória ou conclusão do desvio • Acesso à memória ou conclusão da instrução tipo R • Etapa de escrita adiada (write-back)
AS INSTRUÇÕES LEVAM DE 3 A 5 CICLOS!
130
Etapa 1: Busca da instrução • Use o PC para obter a instrução e colocá-la no registrador Instrução. • Incremente o PC em 4 e coloque o resultado novamente no PC. • Pode ser descrita brevemente usando a RTL (Register-Transfer Language — linguagem de transferência de registrador) IR <= Memory[PC]; PC <= PC + 4; Podemos descobrir os valores dos sinais de controle? Qual é a vantagem de atualizar o PC agora?
131
Etapa 2: Decodificação da instrução e busca dos registradores • Leia os registradores rs e rt no caso de precisarmos deles • Calcule o endereço de desvio no caso de a instrução ser um branch • RTL: A <= Reg[IR[25:21]]; B <= Reg[IR[20:16]]; ALUOut <= PC + (sign-extend(IR[15:0]) < 2);
• Não estamos definindo quaisquer linhas de controle com base no tipo de instrução (estamos ocupados “decodificando-a” em nossa lógica de controle)
132
Etapa 3 (dependente da instrução) • ALU está desempenhando uma de três funções, com base no tipo de instrução – Referência à memória: ALUOut <= A + sign-extend(IR[15:0]);
– Tipo R: ALUOut <= A op B;
– Branch: if (A==B) PC <= ALUOut;
133
Etapa 4: (Tipo R ou acesso à memória) • Loads e stores acessam a memória MDR <= Memory[ALUOut]; ou Memory[ALUOut] <= B;
• Instruções Tipo R terminam Reg[IR[15:11]] <= ALUOut; A escrita na verdade ocorre no final do ciclo na transição
134
Etapa 5: Escrita adiada • Reg[IR[20:16]] <= MDR; Que instrução precisa disso?
135
Resumo
Etapa
Ação para instruções tipo R
Ação para instruções de acesso à memória
Busca da instrução
Ação para jumps
IR <= Memória[PC] PC <= PC + 4
Decodificação da instrução e busca dos registradores
A <= Reg[IR[25:21]] B <= Reg[IR[20:16]] SaídaALU <= PC + (estende-sinal (IR[15:0]) << 2)
Execução, cálculo do endereço, conclusão do desvio/jump
SaídaALU <= A op B
SaídaALU <= A + estende-sinal (IR[15:0])
Acesso à memória ou conclusão de instrução tipo R
Reg[IR[15:11]]<= SaídaALU
Load: MDR <= Memória[SaídaALU] ou Store: Memória [SaídaALU] <= B
Conclusão da leitura da memória
Ação para desvios
if (A == B) PC <= SaídaALU
PC <= {PC [31:28], (IR[25:0]],2’b00)}
Load: Reg[IR[20:16]] <= MDR
FIGURA 5.30 Resumo das etapas realizadas para executar qualquer classe de instrução. As instruções levam de três a cinco etapas de execução. As duas primeiras etapas são independentes da classe de instrução. Após essas etapas, uma instrução leva ainda de um a três ciclos para ser concluída, dependendo da classe de instrução. As entradas vazias da etapa de acesso à memória ou a etapa de conclusão da leitura da memória indicam que a classe de instrução específica leva menos ciclos. Em uma implementação multiciclo, uma nova instrução será iniciada tão logo a instrução atual seja concluída; portanto, esses ciclos não são ociosos ou desperdiçados. Na verdade, como mencionado anteriormente, o banco de registradores lê todos os ciclos, mas, como o IR não muda, os valores lidos do banco de registradores são idênticos. Em especial, o valor lido para o registrador B durante a etapa de decodificação da instrução, para uma instrução de desvio ou tipo R, é o mesmo valor armazenado em B durante a etapa de execução e, depois, usado na etapa de acesso à memória para uma instrução store word.
136
Perguntas simples • Quantos ciclos serão necessários para executar este código? lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...
#considere not
• O que está ocorrendo durante o 8º ciclo da execução? • Em que ciclo ocorre a adição real de $t2 e $t3?
137
OrigPC
EscrevePCCond EscrevePC
Saídas
IouD LeMem
Controle
EscreveIR
OrigBALU OrigAALU
EscreveMem MemparaReg
OpALU
EscreveReg
Op [5:0]
RegDst 26
Instrução [25:0]
PC
0 M u x 1
Instrução [31:26] Endereço Memória DadosMem Dados para escrita
Instrução [25:21] Instrução [20:16] Instrução [15:0] Registrador de instrução Instrução [15:0] Registrador de dados da memória
Instrução [15:11]
0 M u x 1 0 M u x 1 16
Registrador de leitura 1 Dados da Registrador leitura 1 de leitura 2 Registradores Registrador Dados para escrita da Dados para leitura 2
A
28
B
Deslocamento de 2 à esquerda
4
Endereço do jump [31:0]
0 M 1 u x 2
PC [31:28]
ALU Zero Resultado da ALU
escrita
Extensão 32 de sinal
0 M u x 1
Deslocamento de 2 à esquerda
SaídaALU
0 1 M u 2 x 3
Controle da ALU
Instrução [5:0]
138
Revisão: Máquinas de estado finito • Máquinas de estado finito: – um conjunto de estados e – próxima função de estado (determinada pelo estado atual e pela entrada) – função de saída (determinada pelo estado atual e possivelmente pela entrada) Próximo estado Estado atual
Função de próximo estado
Clock Entradas
Função de saída
Saídas
– Usaremos uma máquina de Moore (saída com base apenas no estado atual)
139
Revisão: Máquinas de estado finito • Exemplo: B.37 Um amigo gostaria que você construísse um “olho eletrônico” para ser usado como um dispositivo de segurança falso. O dispositivo consiste em três luzes alinhadas, controladas pelas saídas Esquerda, Centro e Direita, que, se afirmadas, indicam que uma luz deve ser ligada. Apenas uma luz é acesa de cada vez, e a luz “move-se” da esquerda para a direita e, depois, da direita para a esquerda, afugentando, assim, os ladrões, que acreditam que o dispositivo está monitorando suas ações. Desenhe uma representação gráfica para a máquina de estado finito usada para especificar o olho eletrônico. Note que a velocidade do movimento do olho será controlada pela velocidade do clock (que não deve ser muito alta) e que basicamente não existem entradas.
140
Implementando o controle • O valor dos sinais de controle depende de: – que instrução está sendo executada – que etapa está sendo realizada • Use as informações que acumulamos para especificar uma máquina de estado finito – especifique a máquina de estado finito graficamente ou – use microprogramação • A implementação pode ser derivada da especificação
141
Busca da instrução Busca dos registradores/ LeMem decodificação da instrução OrigAALU = 0 1 IouD = 0 OrigAALU = 0 EscreveIR OrigBALU = 11 OrigBALU = 01 OpALU = 00 OpALU = 00 EscrevePC OrigPC = 00
Especificação gráfica da FSM 0 Início
• Nota: – não se preocupe se não for mencionada
necessários?
Cálculo do endereço de memória 2
(Op
8
OrigAALU = 1 OrigBALU = 00 OpALU = 10
OrigAALU = 1 OrigBALU = 00 OpALU = 01 EscrevePCCond OrigPC = 01
Conclusão do jump 9 EscrevePC OrigPC = 10
p = W
'S ')
Acesso à memória
Acesso à memória
5
LeMem IouD = 1
4
6
(O
3
Conclusão do branch
Execução
OrigAALU = 1 OrigBALU = 10 OpALU = 00
= 'B EQ ')
R) o tip = p
(O
(Op = 'LW')
• Quantos bits de estado serão
p=
(O
– caso contrário, valor exato
'SW
u(
)o
' 'LW
= Op
(Op = 'J')
')
– afirmada se apenas nome
EscreveMem IouD = 1
Conclusão de tipo R 7 RegDst = 1 EscreveReg MemparaReg = 0
Etapa de conclusão da leitura de memória
RegDst = 1 EscreveReg MemparaReg = 0
142
Máquina de estado finito para controle • Implementação: EscrevePC EscrevePCCond IouD LeMem EscreveMem EscreveIR MemparaReg
Lógica de controle
OrigPC Saídas
OpALU OrigBALU OrigAALU EscreveReg RegDst NS3 NS2 NS1 NS0
Registrador de instrução Campo opcode
S0
S1
S2
S3
Op0
Op1
Op2
Op3
Op4
Op5
Entradas
Registrador de estado
143
Implementação PLA • Se seu selecionasse uma linha horizontal ou vertical, você poderia explicá-la?
144
Implementação da ROM • ROM = “Read Only Memory” – os valores dos locais de memória são fixados antecipadamente • Uma ROM pode ser usada para implementar uma tabela verdade – se o endereço for m bits, podemos endereçar 2m entradas na ROM. – nossas saídas são os bits de dados para os quais o endereço aponta.
m
n
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
0 1 1 1 0 0 0 0
0 1 1 0 0 0 1 1
1 0 0 0 0 0 1 1
1 0 0 0 0 1 0 1
m é a “altura” e n é a “largura”
145
Implementação da ROM • Quantas entradas existem? 6 bits para opcode, 4 bits para estado = 10 linhas de endereço (por exemplo, 210 = 1024 endereços diferentes)
• Quantas saídas existem? 16 saídas do controle do caminho de dados, 4 bits de estado = 20 saídas
• A ROM possui 210 x 20 = 20K bits (e um tamanho bastante incomum) • Muito ineficiente, já que, para muitas das entradas, as saídas são iguais – por exemplo, opcode freqüentemente é ignorado
146
ROM versus PLA • Divida a tabela em duas partes – 4 bits de estado indicam as 16 saídas, 24 × 16 bits de ROM – 10 bits informam os próximos 4 bits de estado, 210 × 4 bits of ROM – Total: 4,3 Kbits de ROM • A PLA é muito menor – pode compartilhar termos de produto – precisa apenas entradas que produzem uma saída ativa – pode levar em conta don’t cares • O tamanho é (no. de entradas × no. de termos-produto) + (no. de saídas × no. de termos-produto) Para este exemplo = (10x17)+(20x17) = 510 células de PLA
• As células de PLA normalmente possuem o tamanho aproximado de uma célula de ROM (ligeiramente maior)
147
Outro estilo de implementação • Instruções complexas: o “próximo estado” normalmente é o estado atual + 1
EscrevePC EscrevePCCond IouD
Unidade de controle
LeMem EscreveMem
PLA ou ROM
Saídas
EscreveIR EscreveB MemparaReg OrigPC OpALU OrigBALU OrigAALU EscreveReg RegDst
Entrada
CtlEnd
1 Estado Somador
Op[5–0]
Lógica se seleção de endereço
Campo opcode do registrador Instruction
148
Detalhes Op 000000 000010 000100 100011 101011
ROM de despacho 1 Nome do opcode formato R jmp beq lw sw
Valor 0110 1001 1000 0010 0010
ROM de despacho 2 Nome do opcode lw sw
Op 100011 101011
Valor 0011 0101
PLA ou ROM
1 Estado Somador Mux 3
2
1
CtlEnd 0 0
ROM de despacho 2
Ação do controle de endereço Usa o estado incrementado Usa a ROM de despacho 1 Usa a ROM de despacho 2 Usa o estado incrementado Substitui o número do estado por 0 Substitui o número do estado por 0 Usa o estado incrementado Substitui o número do estado por 0 Substitui o número do estado por 0 Substitui o número do estado por 0
Valor de CtlEnd 3 1 2 3 0 0 3 0 0 0
ROM de despacho 1 Lógica de seleção de endereço
Op
Número do estado 0 1 2 3 4 5 6 7 8 9
Campo opcode do registrador Instruction
149
Microprogramação Unidade de controle Memória de microcódigo
Saídas
Entrada
EscrevePC EscrevePCCond IouD LeMem EscreveMem EscreveIR EscreveB MemparaReg OrigPC OpALU OrigBALU OrigAALU EscreveReg RegDst CtlEnd
Caminho de dados
1 Contador de microprograma Somador
Op[5–0]
Lógica de seleção de endereço
Campo opcode do registrador Instruction
• Quais são as microinstruções?
150
Microprogramação • Uma metodologia de especificação – apropriada se houver centenas de opcodes, modos, ciclos etc. – sinais especificados simbolicamente usando microinstruções Rótulo Fetch Mem 1 LW2
Controle da ALU Add Add Add
SRC1
SRC2
PC PC A
4 Extshft Extend
Controle do registrador
Memória Lê PC
Controle EscrevePC ALU
Lê Lê ALU Escreve MDR
SW2 Rformat1
Escreve ALU Código Func
A
B Escreve ALU
BEQ1
Subt
A
JUMP1
B
ALU Out-cond Endereço de jump
Seqüenciação Seq Dispatch 1 Dispstch 2 Seq Fetch Fetch Seq Fetch Fetch Fetch
• Duas implementações da mesma arquitetura possuem o mesmo microcódigo? • O que um microassembler faria?
151
Formato da microinstrução Nome do campo Controle da ALU
SRC1 SRC2
Controle dos Registradores
Valor Add Subt Func code PC A B 4 Extend Extshft Read
Sinais ativos OpALU = 00 OpALU = 01 OpALU = 10 OrigAALU = 0 OrigAALU = 1 OrigBALU = 00 OrigBALU = 01 OrigBALU = 10 OrigBALU = 11
Write ALU
EscreveReg, RegDst = 1, MemparaReg = 0 EscreveReg, RegDst = 0, MemparaReg = 1 LeMem, IouD = 0, LeMem, IouD = 1 EscreveMem, IouD = 1 OrigPC = 00, EscrevePC OrigPC = 01, EscrevePCCond OrigPC = 10, EscrevePC CtlEnd = 11 CtlEnd = 00 CtlEnd = 01 CtlEnd = 10
Write MDR
Memória
Read PC Read ALU Write ALU
Controle de escrita no PC
ALU ALUOut-cond jump address
Seqüenciamento
Seq Fetch Dispatch 1 Dispatch 2
Comentário Faz com que a ALU realize uma soma. Faz com que a ALU realize uma subtração; isso implementa a comparação para desvios. Usa o código de função da instrução para determinar o controle da ALU. Usa o PC como a primeira entrada da ALU. O registrador A é a primeira entrada da ALU. O registrador B é a segunda entrada da ALU. Usa 4 como a segunda entrada da ALU. Usa a saída da unidade de extensão de sinal como a segunda entrada da ALU. Usa a saída da unidade de deslocamento em dois bits como a segunda entrada da ALU. Lê dois registradores usando os campos rs e rt do IR como os números de registrador e colocando os dados nos registradores A e B. Escreve num registrador usando o campo rd do IR como o número de registrador e o conteúdo de SaídaALU como os dados. Escreve num registrador usando o campo rt do IR como o número de registrador e o conteúdo de MDR como os dados. Lê a memória usando o PC como o endereço; escreve o resultado no IR (e no MDR). Lê a memória usando SaídaALU como o endereço; escreve o resultado no MDR. Escreve na memória usando SaídaALU como o endereço e o conteúdo de B como os dados. Escreve a saída da ALU no PC. Se a saída Zero da ALU estiver ativa, escreve o PC com o conteúdo do registrador SaídaALU. Escreve o PC com o endereço de jump da instrução. Escolhe a próxima microinstrução seqüencialmente. Vai para a primeira microinstrução para iniciar uma nova instrução. Despacha usando a ROM 1. Despacha usando a ROM 2.
152
Maximamente versus minimamente codificado • Nenhuma codificação: – 1 bit para cada operação de caminho de dados – mais rápido, exige mais memória (lógica) – usada para Vax 780 — incrível memória de 400K! • Muita codificação: – envia as microinstruções através da lógica para obter sinais de controle – usa menos memória, mais lento • Contexto histórico do CISC: – Muita lógica para colocar em um único chip com tudo mais – Use uma ROM (ou mesmo RAM) para armazenar o microcódigo – É fácil acrescentar novas instruções
153
Microcódigo: negociações • A distinção entre especificação e implementação às vezes é vaga • Vantagens da especificação: – Fácil de projetar e escrever – Projeto da arquitetura e do microcódigo em paralelo • Vantagens da implementação (ROM fora do chip) – Fácil de mudar, já que os valores estão na memória – Pode emular outras arquiteturas – Pode fazer uso dos registradores internos • Desvantagens da implementação, MAIS LENTA, agora que: – O conteúdo é implementado no mesmo chip do processador – Agora a ROM não é mais rápida do que a RAM – Não há necessidade de voltar e fazer mudanças
154
Perspectiva histórica • Nas décadas de 1960 e 1970, a microprogramação era muito importante para implementar máquinas
• Isso levou a ISAs mais sofisticadas e ao VAX • Na década de 1980, os processadores RISC com base em pipelining se tornaram populares
• Também é possível canalizar as microinstruções! • As implementações dos processadores de arquitetura IA-32 desde o 486 usam: – “controle hardwired” para implementações mais simples (menos ciclos, controle FSM implementado usando PLA ou lógica aleatória)
– “controle microcodificado” para instruções mais complexas (grande número de ciclos, loja de controle central)
• A arquitetura IA-64 usa a ISA no estilo RISC e pode ser implementada sem uma grande loja de controle central
155
Pentium 4 • O pipelining é importante (o último IA-32 sem ela foi o 80386 em 1985) Controle Controle
Interface de E/S
Capítulo 7
Cache de instrução Cache de dados Ponto flutuante e multimídia aperfeiçoados
Caminho de dados de inteiro
Controle
Suporte a hyperthreading de pipelining avançado
Cache secundário e interface de memória
Capítulo 6
Controle
• O pipelining é usado para as instruções simples beneficiadas pelos compiladores “Explicado de forma simples, uma implementação de alto desempenho precisa garantir que as instruções simples sejam executadas rapidamente e que o peso das complexidades do conjunto de instruções penalize as instruções complexas, usadas com menos freqüência.”
156
Pentium 4 • Em algum lugar em todo esse controle, precisamos manipular instruções complexas Controle Controle
Interface de E/S
Cache de instrução Cache de dados Ponto flutuante e multimídia aperfeiçoados
Caminho de dados de inteiro
Cache secundário e interface de memória
Controle
Suporte a hyperthreading de pipelining avançado
Controle
• O processador executa microinstruções simples, de 70 bits de largura (hardwired) • 120 linhas de controle para o caminho de dados de inteiro (400 para ponto flutuante) • Se uma instrução exigir mais de 4 microinstruções para ser implementada, controle da ROM de microcódigo (8000 microinstruções) • Isso é complicado!
157
Resumo do Capítulo 5 • Se entendermos as instruções... Podemos construir um processador simples!
• Se as instruções duram diferentes períodos de tempo, o multiciclo é melhor • O caminho de dados é implementado usando: – Lógica combinacional para aritmética – Elementos de preservação de estado para se lembrar dos bits • Controle implementado usando: – Lógica combinacional para implementação de ciclo único – Máquina de estado finito para implementação de multicilo
158
Capítulo 6
159
Pipelining • Melhore o desempenho aumentando a vazão da instrução
A aceleração ideal é o número de estágios no pipeline. Conseguimos isso?
160
Pipelining • O que o facilita – todas as instruções possuem o mesmo tamanho – apenas alguns formatos de instrução – operandos de memória aparecem apenas em loads e stores • O que o dificulta? – riscos estruturais: suponha que tivéssemos apenas uma memória – riscos de controle: necessidade de se preocupar com instruções ramificadas – riscos de dados: uma instrução depende de uma instrução anterior • Construiremos um pipeline simples e veremos esses problemas • Falaremos sobre os processadores modernos e o que realmente o torna difícil – tratamento de exceções – tentar melhorar o desempenho com execução fora de ordem etc.
161
Conceito básico IF: Busca de instruções
ID: Decodificação de EX: Execução/cálculo de endereço instruções/leitura do banco de registradores
MEM: Acesso à memória
WB: Escrita adiada
Add Resultado ADD do Somador
4 Desloc. 2 esq.
0 M u x 1
PC
Endereço
Instrução Memória de instruções
Registrador de leitura 1
Dados da leitura 1
Registrador de leitura 2 Registradores Registrador Dados da para escrita leitura 2 Dados para escrita
16
Extensão de sinal
Zero
0 M u x 1
ALU Resultado da ALU
Endereço
Dados da leitura Memória de dados
Dados para escrita
1 M u x 0
32
• O que precisamos acrescentar para realmente dividir os caminhos de dados em estágios?
162
Caminho de dados em pipeline IF/ID
ID/EX
EX/MEM
MEM/WB
Add Resul-
Add tado do
4
Somador
Desloc. 2 esq.
PC
Endereço
Memória de instruções
Instrução
0 M u x 1
Registrador Dados de leitura 1 da leitura 1 Registrador de leitura 2 Registradores Dados Registrador da leitura 2 para escrita Dados para escrita
Resul-
ALU tado da 0 M u x 1
ALU
Endereço Memória de dados
Dados da leitura
0 M u x 1
Dados para escrita 16
Extensão de sinal
32
Você consegue encontrar um problema mesmo se não houver dependências? Que instruções podemos executar para manifestar o problema?
163
Caminho de dados corrigido
IF/ID
ID/EX
MEM/WB
EX/MEM
Add Resultado Add do Somador
4 Desloc. 2 esq.
PC
Endereço
Memória de instruções
Instrução
0 M u x 1
Registrador de leitura 1
Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita
0 M u x 1
Dados para escrita
Zero ALU Resultado da ALU
Dados da leitura
Endereço Memória de dados
0 M u x 1
Dados para escrita
16
Extensão de sinal
32
164
Representando pipelines graficamente Ordem de execução do programa (em instruções) lw $1, 100($0)
lw $2, 200($0)
lw $3, 300($0)
Tempo (em ciclos de clock) CC 1
CC 2
IM
Reg
IM
CC 3
ALU
Reg
IM
CC 4
CC 5
DM
Reg
ALU
DM
Reg
ALU
DM
Reg
CC 6
CC7
Reg
• Pode ajudar a responder questões como estas: – quantos ciclos leva para executar esse código? – qual é a ALU sendo executada durante o ciclo 4? – use essa representação para ajudar a entender os caminhos de dados
165
Controle do pipeline OrigPC
ID/EX
IF/ID
MEM/WB
EX/MEM
Add Resultado Add do Somador
4 Desloc. 2 esq. EscreveReg
PC
Endereço
Instrução
0 M u x 1
Branch
Memória de instruções
Registrador de leitura 1
Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita
EscreveMem OrigALU 0 M u x 1
Dados da leitura
Zero ALU Resultado da ALU
MemparaReg Dados da leitura
Endereço Memória de dados
1 M u x 0
Dados para escrita Instrução (15-0)
Instrução (20-16)
Instrução (15-11)
16
Extensão 32 de sinal
6
0 M u x 1
Controle da ALU
LeMem
OpALU
RegDst
166
Controle de pipeline • Temos 5 estágios. O que precisa ser controlado em cada estágio? – Busca da instrução e incremento do PC – Decodificação da instrução / Busca do registrador – Execução – Estágio de memória – Escrita adiada • Como o controle seria manipulado em uma fábrica de automóveis? – um espetacular centro de controle dizendo a todo mundo o que fazer? – deveríamos usar uma máquina de estado finito?
167
Controle do pipeline • Transfira os sinais de componente exatamente como os dados Linhas de controle do estágio de cálculo de endereço/execução
Linhas de controle do estágio de acesso à memória
Linhas de controle do estágio de escrita do resultado
Instrução
RegDst
OpALU1
OpALU0
OrigALU
Branch
LeMem
Escreve Mem
Escreve Reg
Mem para Reg
Formato R
1
1
0
0
0
0
0
1
0
lw
0
0
0
1
0
1
0
1
1
sw
X
0
0
1
0
0
1
0
X
beq
X
0
1
0
1
0
0
0
X
168
Caminho de dados com controle OrigPC
ID/EX
Controle
IF/ID
WB
EX/MEM
M
WB
EX
M
MEM/WB
WB
Add Resultado Add do Somador
4
Memória de instruções
Registrador de leitura 1
Dados da leitura 1 Registrador de leitura 2 Registradores Dados da Registrador leitura 2 para escrita
Zero ALU Resultado da ALU
0 M u x 1
Dados da leitura
MemparaReg
Endereço
Branch
OrigALU
EscreveMem
EscreveReg
PC
Instrução
0 M u x 1
Desloc. 2 esq.
Dados da leitura
Endereço
Memória de dados
0 M u x 1
Dados para escrita Instrução (15-0)
16
Extensão de sinal
32
6
Controle ALU
Instrução (20-16)
Instrução (15-11)
LeMem
OpALU
0 M u x 1
RegDst
169
Dependências • Problemas com o início da próxima instrução antes do término da primeira – dependências que “voltam no tempo” são hazards de dados Tempo (em ciclos de clock) CC 1 CC 2 Valor do registrador $2: 10
10
CC 3
CC 4
CC 5
10
10
10/–20
DM
Reg
CC 6 –20
CC 7
CC 8
–20
–20
CC 9 –20
Ordem de execução do programa (em instruções) sub $2, $1, $3
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)
IM
Reg
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
170
Solução de software • Faça o compilador garantir a inexistência de hazards • Onde inserimos os “nops”? sub and or add sw
$2, $1, $3 $12, $2, $5 $13, $6, $2 $14, $2, $2 $15, 100($2)
• Problema: isso realmente nos torna lentos!
171
Forwarding • Use resultados temporários, não espere que eles sejam escritos – forwarding do arquivo de registrador para manipular read/write para o mesmo registrador – forwarding da ALU Tempo (em ciclos de clock) CC 1 CC 2 CC 3 Valor do registrador $2: 10 10 10 Valor de EX/MEM: X X X Valor de MEM/WB: X X X
CC 4
CC 5
CC 6
CC 7
CC 8
CC 9
10 –20 X
10/–20 X –20
–20 X X
–20 X X
–20 X X
–20 X X
DM
Reg
Ordem de execução do programa (em instruções) sub $2 $1, $3
and $12, $2 $5
or $13, $6, $2
add $14, $2 $2
sw $15, 100($2)
E se este $2 fosse $13?
IM
Reg
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
172
Forwarding • A idéia principal (alguns detalhes não mostrados)
ID/EX
EX/MEM
MEM/WB
M u x ForwardA
Registradores
ALU
M u x
Memória de dados
M u x
ForwardB Rs Rt Rt Rd
EX/MEM.RegistradorRd
M u x Unidade de forwarding
MEM/WB.RegistradorRd
173
Forwarding nem sempre é possível • Load word ainda pode causar um hazard: – uma instrução tenta ler um registrador seguindo uma instrução load que escreve no mesmo registrador. Tempo (em ciclos de clock) CC 1 CC 2
CC 3
CC 4
CC 5
DM
Reg
CC 6
CC 7
CC 8
CC 9
Ordem de execução do programa (em instruções) lw $2, 20($1)
and $4, $2, $5
or $8, $2, $6
add $9, $4, $2
slt $1, $6, $7
IM
Reg
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
Portanto, precisamos de uma unidade de detecção de hazard para “deter” (stall) a instrução load
174
Stalls • Podemos ocasionar um stall no pipeline mantendo uma instrução no mesmo estágio Tempo (em ciclos de clock) CC 1 CC 2 CC 3
CC 4
CC 5
DM
Reg
CC 6
CC 7
CC 8
CC 9
CC 10
Ordem de execução do programa (em instruções) lw $2, 20($1)
IM
Reg
bolha and torna-se nop
add $4, $2, $5
or $8, $2, $6
add $9, $4, $2
IM
Reg
IM
DM
Reg
IM
Reg
DM
DM
Reg
IM
Reg
Reg
Reg
DM
Reg
175
Unidade de detecção de hazard • Ocasione um stall deixando que uma instrução que não escreverá nada prossiga Unidade de detecção de hazards
EscreveIF/ID
ID/EX.MemRead
ID/EX M u x
EscrevePC
Controle
IF/ID
0
WB
EX/MEM
M
WB
MEM/WB
EX
M
WB
PC
Memória de instruções
Instrução
M u x Registradores
ALU
M u x
Memória de dados
M u x
IF/ID.RegistradorRs IF/ID.RegistradorRt IF/ID.RegistradorRt
Rt
IF/ID.RegistradorRd
Rd
M u x
ID/EX.RegistradorRt Rs Rt
Unidade de forwarding
176
Hazards de desvio • Quando decidimos desviar, outras instruções estão no pipeline! Tempo (em ciclos de clock) CC 1
CC 2
CC 3
CC 4
CC 5
DM
Reg
CC 6
CC 7
CC 8
CC 9
Ordem de execução do programa (em instruções) 40 beq $1, $3, 28
44 and $12, $2, $5
48 or $13, $6, $2
IM
Reg
IM
Reg
IM
DM
Reg
52 add $14, $2, $2
72 lw $4, 50($7)
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
• Estamos prevendo “desvio não tomado” – precisamos acrescentar hardware para descartar instruções se estivermos errados
177
Descartando instruções IF.Flush Unidade de detecção de hazards ID/EX WB Controle
0 IF/ID
M u x
+
EX/MEM
M
WB
EX/MEM
EX
M
WB
+ 4
M u x
Desloc. 2 esq.
Registradores PC
=
M u x
Memória de instruções
ALU
Memória de dados
M u x
M u x
Extensão de sinal
M u x Unidade de forwarding
Nota: também movemos a decisão de desvio para o estágio ID
178
Desvios • Se o desvio for tomado, temos uma penalidade de um ciclo • Para nosso projeto simples, isso é razoável • Com pipelines mais profundos, a penalidade aumenta e a previsão de desvio estático diminui drasticamente o desempenho
• Solução: previsão de desvio dinâmico Tomado Não tomado Previsão tomada
Previsão tomada Tomado
Tomado
Não tomado Não tomado
Previsão não tomada
Previsão não tomada Tomado Não tomada
Um esquema de previsão de dois bits
179
Previsão de desvio • Técnicas sofisticadas: – Um “buffer de destino de desvio” nos ajuda a consultar o destino. – Correlacionar previsores que baseiem a previsão no comportamento global e nos desvios recentemente executados (por exemplo, previsão para uma instrução de desvio específica com base no que ocorreu nos desvios anteriores).
– Previsores de competição que usam diferentes tipos de estratégias de previsão e controlam qual delas está sendo melhor executada.
– Um “espaço de retardo de desvio” que o compilador tenta preencher com uma instrução útil (forma a parte do retardo de um ciclo da ISA).
• Previsão de desvio é especialmente importante porque permite que outras técnicas de pipelining mais avançadas sejam eficazes!
• Os processadores modernos prevêem corretamente 95% das vezes!
180
Melhorando o desempenho • Tente evitar stalls! Por exemplo, reordene estas instruções: lw lw sw sw
$t0, $t2, $t2, $t0,
0($t1) 4($t1) 0($t1) 4($t1)
• Programação de pipeline dinâmica – O hardware escolhe que instruções executar em seguida – Executará instruções fora de ordem (por exemplo, não espera que uma dependência seja resolvida, e sim continua executando!)
– Especula sobre desvios e mantém o pipeline cheio (pode precisar reverter se a previsão for incorreta)
• Tentando explorar o paralelismo em nível de instrução
181
Pipelining avançado • Aumenta a profundidade do pipeline • Inicia mais de uma instrução em cada ciclo (despacho múltiplo) • Desdobramento de loop para expor mais ILP (melhor programação) • Processadores “superescalares” – DEC Alpha 21264: pipeline de 9 estágios, despacho de 6 instruções • Todos os processadores modernos são superescalares e despacham instruções múltiplas normalmente com algumas limitações (por exemplo, diferentes “pipes”)
• VLIW: Very Long Instruction Word (palavra de instrução muito longa) – despacho múltiplo estático (se baseia mais na tecnologia do compilador)
• Essa aula forneceu o conhecimento de que você precisa para aprender mais!
182
Resumo do Capítulo 6 • O pipelining não melhora a latência, mas melhora a vazão
Despacho múltiplo com pipeline (Seção 6.9)
Menor
Ciclo único (Seção 5.4)
Menos Instruções por clock (IPC = 1/CPI)
Mais
Despacho múltiplo com pipeline profundo (Seção 6.10)
Especializado
Pipeline
Hardware
Multiciclo (Seção 5.5)
Despacho múltiplo com pipeline profundo (Seção 6.10)
Compartilhado
Velocidade de clock
Maior
Pipeline profundo
Despacho múltiplo com pipeline (Seção 6.9) Ciclo único (Seção 5.4)
Pipeline
Pipeline profundo
Multiciclo (Seção 5.5)
1
Várias Latência no uso das instruções
183
Capítulo 7
184
Memórias: Revisão • SRAM: – o valor é armazenado em um par de portões invertidos – muito rápida, mas ocupa mais espaço do que a DRAM (4 a 6 transistores) • DRAM: – o valor é armazenado como uma carga no capacitor (precisa ser atualizada) – muito pequena, porém, mais lenta do que a SRAM (fator de 5 a 10) Linha de word A B
A B
Transistor de passagem
Capacitor
Linha de bit
185
Explorando a hierarquia da memória • Os usuários querem memórias grandes e rápidas! Os tempos de acesso da SRAM são 0,5 a 5 ns ao custo de US$ 4000 a US$ 10000 por GB. Os tempos de acesso são 50 a 70 ns ao custo de US$ 100 a US$ 200 por GB. Os tempos de acesso a disco são 5 a 20 milhões de ns ao custo de US$ 0,50 a US$ 2 por GB.
2004
• Tente oferecer isso a eles – Construa uma hierarquia de memória CPU
Nível 1
Níveis na hierarquia de memória
Aumentando a distância da CPU no tempo de acesso
Nível 2 …
Nível n
Tamanho da memória em cada nível
186
Localidade • Um princípio que faz da hierarquia de memória uma boa idéia • Se um item for referenciado, localidade temporal: tenderá a ser referenciada novamente em breve localidade espacial: itens próximos tenderão a ser referenciados em breve
Por que o código possui localidade?
• Nosso foco inicial: dois níveis (superior, inferior) – bloco: unidade mínima de dados – acerto: os dados solicitados estão no nível superior – falha: os dados solicitados não estão no nível superior
187
Cache • Dois problemas: – Como sabemos se um item de dados está no cache? – Se estiver, como encontrá-lo? • Nosso primeiro exemplo: – O tamanho do bloco é uma word de dados – “diretamente mapeado”
Para cada item de dados no nível inferior, existe exatamente um local no caminho onde ele pode estar. Por exemplo, muitos itens no nível inferior compartilham locais no nível superior
188
Cache diretamente mapeado • Mapeamento: O endereço é o módulo do número de blocos no cache
000 001 010 011 100 101 110 111
Cache
00001
00101
01001
01101
10001
10101
11001
11101
Memória
189
Cache diretamente mapeado • Para MIPS: Endereço (mostrando as posições dos bits) 31 30
13 12 11
2 10 Offset do byte
Acerto
20
10
Tag Dados
Índice x Índice x 0 1 2
Validade alid Tag
Dados
1021 1022 1023 20
32
=
De que tipo de localidade estamos nos valendo?
190
Cache diretamente mapeado • Tirando vantagem da localidade espacial:
Endereço (mostrando as posições dos bits) 31 14 13 65 210
18
Acerto
8
4
Tag
Offset do byte
Dados Offset do bloco
Índice 18 bits V
512 bits
Tag
Dados
256 Entradas
16
32
32
32
= Mux 32
191
Acertos versus falhas • Acertos de leitura – é isso o que queremos! • Falhas de leitura – ocasione um stall na CPU, busque o bloco da memória, distribua para o cache, reinicie
• Acertos de escrita: – podem substituir os dados no cache e na memória (escrita direta) – escrevem os dados apenas no cache (escrita adiada no cache posteriormente) • Falhas de escrita: – lêem o bloco inteiro para o cache, depois escrevem a word
192
Problemas de hardware • Facilite a leitura de múltiplas words usando bancos de memória CPU
CPU
CPU
Multiplexador Cache
Cache Cache
Barramento
Barramento
Barramento
Memória
Banco de Banco de Banco de Banco de memória 0 memória 1 memória 2 memória 3
b. Organização de memória larga
c. Organização de memória intercalada
Memória
a. Organização de memória com uma word de largura
• Isso pode ficar muito mais complicado...
193
Desempenho • Aumentar os tamanhos de bloco tende a reduzir a taxa de falhas: 40% 35%
Taxa de falhas
30% 25% 20% 15% 10% 5% 0%
4
16
64
Tamanho de bloco (bytes)
256 1 KB 8 KB 16 KB 64 KB 256 KB
• Use caches divididos porque existe mais localidade espacial no código: Programa gcc spice
Tamanho de bloco em words
Taxa de falhas de instrução
Taxa de falha de dados
Taxa de falhas combinadas efetiva
1
6,1%
2,1%
5,4%
4
2,0%
1,7%
1,9%
1
1,2
1,3
1,2%
4
0,3
0,6
0,4%
194
Desempenho • Modelo simplificado: Tempo de execução = (ciclos de execução + ciclos de stall) × tempo de ciclo Ciclos de stall = número de instruções × taxa de falhas × penalidade de falha
• Duas maneiras de melhorar o desempenho: – reduzir a taxa de falhas – reduzir a penalidade de falhas
O que acontece se aumentarmos o tamanho de bloco?
195
Reduzindo a taxa de falhas com associatividade Associativa por conjunto de uma via (diretamente mapeada) Bloco 0
Tag Dados Associativa por conjunto de duas vias
1 2 3 4 5 6
Conjunto Tag Dados Tag Dados 0 1 2 3
7 Associativa por conjunto de quatro vias Conjunto Tag Dados Tag Dados Tag Dados Tag Dados 0 1
Associativa por conjunto de oito vias (totalmente associativa) Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados Tag Dados
Comparado com o mapeamento direto, forneça uma série de referências que:
– resulte em uma taxa de falhas usando um cache associativo de duas vias – resulte em uma taxa de falhas maior usando um cache associativo de duas vias considerando que usamos a estratégia de substituição “usada menos recentemente”
196
Uma implementação 31 30
12 11 10 9 8 22
Índice 0 1 2
V Tag
Dados
3210 8
V Tag
Dados
V Tag
Dados
V Tag
Dados
253 254 255 22 =
=
=
32
=
Multiplexador 4 para 1
Acerto
Dados
197
Desempenho 15% 1 KB
Taxa de falhas
12%
2 KB
9%
4 KB 6% 8 KB 16 KB 32 KB
3%
64 KB
128 KB
0 Uma via
Duas vias
Quatro vias
Oito vias
Associatividade
198
Reduzindo a penalidade de falhas com caches multinível • Acrescente um segundo cache de nível: – normalmente o cache primário está no mesmo chip do processador – use SRAMs para acrescentar outro cache acima da memória principal (DRAM) – a penalidade de falhas diminui se os dados estiverem no cache de segundo nível • Exemplo: – CPI de 1,0 em uma máquina de 5 GHz com uma taxa de falhas de 5%, acesso a DRAM de 100 ns
– Acrescentar cache de segundo nível com tempo de acesso de 5 ns diminui a taxa de falhas para 0,5%
• Usando caches multinível: – tente otimizar o tempo de acerto no cache de primeiro nível – tente otimizar a taxa de falhas no cache de segundo nível
199
Complexidades de cache – Nem sempre é fácil entender as implicações dos caches: 1200
2000 1600
Ciclos de clock/item
Instruções/item
Radix Sort
Radix Sort
1000 800 600 400 200
Quicksort
0
1200 800 400
Quicksort
0 4
8
16
32
64
128 256 512 1024 2048 4096
4
8
16
32
64
128 256 512 1024 2048 4096
Tamanho (K itens a ordenar)
Tamanho (K itens a ordenar)
Comportamento teórico de Radix Sort versus Quicksort
Comportamento observado de Radix Sort versus Quicksort
200
Complexidades de cache • Veja o porquê: 5 Radix Sort
Falhas de cache/item
4 3 2 1 Quicksort 0 4
8
16
32
64
128 256 512 1024 2048 4096
Tamanho (K itens a ordenar)
• O desempenho do sistema de memória normalmente é um fator crítico – caches multinível, processadores em pipeline, dificultam a previsão de resultados
– otimizações de compilador para aumentar a localidade algumas vezes prejudicam o ILP
• Difícil prever o melhor algoritmo: é preciso dados experimentais
201
Memória virtual • A memória principal pode atuar como um cache para o armazenamento secundário (disco) Endereços físicos
Endereços virtuais Tradução de endereço
Endereços do disco
• Vantagens: – ilusão de ter mais memória física – remanejamento do programa – proteção
202
Páginas: blocos de memória virtual • Falhas de página: Os dados não estão na memória; recupere-os do disco – enorme penalidade de falha; portanto, as páginas devem ser bastante grandes (por exemplo, 4KB)
– é importante reduzir as falhas de página (LRU vale a pena) – pode manipular as falhas no software em vez de no hardware – como a escrita direta é muito onerosa, usamos escrita adiada Endereço virtual 31 30 29 28 27
15 14 13 12 11 10 9 8
Número de página virtual
3210
Offset de página
Tradução
29 28 27
15 14 13 12 11 10 9 8
Número de página física
3210
Offset de página
Endereço físico
203
Tabelas de página Número de página virtual Tabela de páginas Validade 1 1 1 1 0 1 1 0 1 1 0 1
Página física ou endereço de disco
Memória física
Armazenamento em disco
204
Tabelas de página Registrador de tabela de páginas Endereço virtual 31 30 29 28 27
15 14 13 12 11 10 9 8 Número de página virtual
Offset de página 12
20 Validade
3 2 1 0
Número de página física
Tabela de páginas
18 Se for 0, então a página não está presente na memória 29 28 27
15 14 13 12 11 10 9 8 Número de página física
3 2 1 0
Offset de página
Endereço físico
205
Tornando a tradução de endereço rápida • Um cache para traduções de endereço: translation-lookaside buffer (TLB) Número de página virtual
o çã cia de ifica rên a e lid od ef Va M R
1 1 1 1 0 1
TLB Tag
Endereço de página física
0 1 1 1 1 1 0 1 0 0 0 1
Memória física
Tabela de páginas ão ia e icaç ênc d f r Endereços de página a i lid od efe física ou de disco Va M R 1 1 1 1 0 1 1 0 1 1 0 1
Valores típicos:
1 0 0 0 0 0 0 0 1 1 0 1
1 0 0 1 0 1 1 0 1 1 0 1
Armazenamento em disco
16-512 entradas, taxa de falhas: 0,01% – 1% penalidade de falhas: 10-100 ciclos
206
TLBs e caches Endereço virtual
Acesso à TLB
Exceção de falha de TLB
Não
Sim
Acerto de TLB?
Endereço físico
Não
Sim Escrita?
Tente ler os dados da cache
Stall de falha de cache durante leitura do bloco
Não
Sim
Não
Bit de acesso de escrita ligado?
Exceção de proteção de escrita
Sim
Tente escrever os dados na cache
Acerto de cache?
Envie os dados para a CPU Stall de falha de cache durante leitura do bloco
Não
Sim Acerto de cache?
Escreva os dados na cache, atualize o bit de modificação e coloque os dados e o endereço no buffer de escrita
207
TLBs e caches Endereço virtual 31 30 29
14 13 12 11 10 9 Número de página virtual
o
çã
TLB hit
Offset de página 12
20
e a ad ific id od l Va M
TLB
3 2 1 0
Número de página física
Tag = = = = = =
20
Offset de página Número de página física Endereço físico Offset Tag de endereço físico Índice de cache de bloco 18
8
4
Offset de byte 2
8 12 Validade
Dados
Tag
Cache
= Acerto de cache
32 Dados
208
Sistemas modernos Característica
Intel Pentium P4
Endereço virtual Endereço físico Tamanho de página Organização de TLB
32 bits 36 bits 4KB, 2/4MB 1 TLB para instruções e 1 TLB para dados Ambas são associativas por conjunto de quatro vias Ambas usam substituição pseudo-LRU Ambas têm 128 entradas Falhas de TLB tratadas por hardware
AMD Opteron 48 bits 40 bits 4KB, 2/4MB 2 TLBs para instruções e 2 TLBs para dados Ambas as TLBs L1 são totalmente associativas, substituição LRU Ambas as TLBs L2 são associativas por conjunto de quatro vias, LRU com round-robin Ambas as TLBs L1 têm 40 entradas Ambas as TLBs L2 têm 512 entradas Falhas de TLB tratadas por hardware
FIGURA 7.34 Tradução de endereços e hardware TLB para o Intel Pentium P4 e o AMD Opteron. O tamanho de word define o tamanho máximo do endereço virtual, mas um processador não precisa usar todos esses bits. O tamanho de endereço físico é independente do tamanho de word. O P4 tem uma TLB para instruções e uma TLB idêntica separada para dados, enquanto o Opteron possui uma TLB L1 e uma TLB L2 para instruções e TLBs L1 e L2 idênticas para dados. Os dois processadores fornecem suporte para páginas grandes, que são usadas para coisas como o sistema operacional ou para mapear um buffer de quadro. O esquema de página grande evita o uso de um grande número de entradas para mapear um único objeto que está sempre presente. Característica Organização de cache L1 Tamanho de cache L1 Associatividade de cache L1 Substituição L1 Tamanho de bloco L1 Política de escrita L1 Organização de cache L2 Tamanho de cache L2 Associatividade de cache L2 Substituição L2 Tamanho de bloco L2 Política de escrita L2
Intel Pentium P4 Caches de instruções e de dados divididos 8KB para dados, cache de trace de 96KB para instruções RISC (operações RISC de 12K) Associativa por conjunto de 4 vias Substituição LRU aproximada 64 bytes Escrita direta Unificada (instruções e dados) 512KB Associativa por conjunto de 8 vias Substituição LRU aproximada 128 bytes Escrita direta
AMD Opteron Caches de instruções e de dados divididos 64KB cada para instruções/dados Associativa por conjunto de 2 vias Substituição LRU 64 bytes Escrita adiada Unificada (instruções e dados) 1024KB (1MB) Associativa por conjunto de 16 vias Substituição LRU aproximada 64 bytes Escrita adiada
FIGURA 7.35 Caches de primeiro nível e segundo nível do Intel Pentium P4 e do AMD Opteron. As caches primárias do P4 são fisicamente indexadas e rotuladas; para uma descrição das alternativas, veja o Detalhe na página 527.
209
Sistemas modernos • As coisas estão ficando complicadas! MPU
AMD Opteron
Conjunto de instruções Aplicação pretendida 2
Tamanho do die (mm ) (2004) Instruções despachadas por clock Velocidade de clock (2004) Cache de instruções Latência (clocks) Cache de dados Latência (clocks) Entradas de TLB (TLB I/D/L2) Tamanho de página mínimo Cache L2 on-chip
Cache L2 off-chip Tamanho de bloco (L1/L2, bytes)
Intrinsity FastMATH
Intel Pentium 4
Intel PXA250 ARM Embutido de baixo consumo
Sun UltraSPARC IV
IA-32, AMD64 Servidor
MIPS32 Embutido
IA-32 Desktop
SPARC v9 Servidor
193
122
217
3
2
3 operações RISC
1
4×2
2,0GHz 64KB, associativa por conjunto de 2 vias 3 64KB, associativa por conjunto de 2 vias 3 40/40/512/512
2,0GHz 16KB, diretamente mapeada 4 16KB, associativa por conjunto de 1 via 3 16
3,2GHz cache de trace com 12000 operações RISC (~96 KB) 4 8KB, associativa por conjunto de 4 vias 2 128/128
0,4GHz 32KB, associativa por conjunto de 32 vias 1 32KB, associativa por conjunto de 32 vias 1 32/32
1,2GHz 32KB, associativa por conjunto de 4 vias 2 64KB, associativa por conjunto de 4 vias 2 128/512
4KB
4KB
4KB
1KB
8KB
1024KB, associativa por conjunto de 16 vias —
1024KB, associativa por conjunto de 4 vias —
512KB, associativa por conjunto de 8 vias —
—
—
—
64
64
64/128
32
16MB, associativa por conjunto de 2 vias 32
356
FIGURA 7.36 Microprocessadores para desktops, embutidos e para servidores em 2004. De uma perspectiva da hierarquia de memória, a principal diferença entre as categorias é a cache L2. Não há uma cache L2 para o embutido de baixo consumo, uma grande L2 on-chip para o embutido e para o desktop e uma off-chip de 16 MB para o servidor. As velocidades de clock de processador também variam: 0,4 GHz para embutido de baixo consumo, 1 GHz ou mais alta para o restante. Observe que o UltraSPARC IV possui dois processadores no chip.
210
Alguns problemas • As velocidades do processador continuam a aumentar muito rápido – muito mais rápido do que os tempos de acesso à DRAM ou ao disco 100.000
10.000
1.000 Desempenho
CPU 100
10 Memória
19 80 19 81 19 82 19 83 19 84 19 85 19 86 19 87 19 88 19 89 19 90 19 91 19 92 19 93 19 94 19 95 19 96 19 97 19 98 19 99 20 00 20 01 20 02 20 03 20 04 20 05
1
Ano
• Desafio de projeto: lidar com essa crescente disparidade – Prefetching? Caches de terceiro nível e mais? Projeto de memória?
211
Capítulos 8 e 9 (abordagem parcial)
212
Interface entre processadores e periféricos • O projeto de E/S é afetado por muitos fatores (expansibilidade, resiliência) • Desempenho: – latência de acesso – vazão – conexão entre os dispositivos e o sistema – a hierarquia de memória – o sistema operacional • Uma variedade de usuários diferentes (por exemplo, bancos, supercomputadores, engenheiros) Interrupções Processador
Cache
Barramento de E/S de memória
Memória principal
Controlador de E/S
Disco
Disco
Controlador de E/S
Controlador de E/S
Saída gráfica
Rede
213
E/S • Importante, mas negligenciada “As dificuldades em avaliar e projetar sistemas de E/S freqüentemente têm relegado a E/S à condição de segunda classe” “os cursos em todos os aspectos da computação, da programação à arquitetura de computador, normalmente ignoram a E/S ou a abordam superficialmente” “os livros-texto deixam o assunto para o final, o que pode fazer com que alunos e instrutores o pulem”
• CULPADOS! – não veremos a E/S em muito detalhe aqui. – não deixe de ler o Capítulo 8 inteiro. – você provavelmente assistirá a uma aula de rede!
214
Dispositivos de E/S • Dispositivos muito diversos – comportamento (por exemplo, entrada versus saída) – parceiro (quem está no outro lado?) – velocidade de dados Interrupções Processador
Cache
Barramento de E/S de memória
Memória principal
Controlador de E/S
Disco
Disco
Controlador de E/S
Controlador de E/S
Saída gráfica
Rede
FIGURA 8.2 Uma coleção típica de dispositivos de E/S. As conexões entre os dispositivos de E/S, processador e memória normalmente são chamadas de barramentos. A comunicação entre os dispositivos e o processador utiliza interrupções e protocolos no barramento, conforme veremos neste capítulo. A Figura 8.11, na página 585, mostra a organização para um PC desktop.
215
Exemplo de E/S: Unidades de disco
Pratos
Trilhas
Prato Setores
Trilha
• Para acessar dados: – busca: posiciona a cabeça sobre a trilha correta (3 a 14 ms em média) – latência rotacional: espera pelo setor desejado (0,5 rpm) – transferência: recupera os dados (um ou mais setores; 30 a 80 MB/seg)
216
Exemplo de E/S: Barramentos • Link de comunicação compartilhado (um ou mais fios) • Projeto difícil: – pode ser gargalo – extensão do barramento – número de dispositivos – negociações (buffers para largura de banda maior aumenta a latência) – suporte para muitos dispositivos diferentes – custo • Tipos de barramento: – processador-memória (curto, projeto personalizado e de alta velocidade) – backplane (alta velocidade, freqüentemente padronizado; por exemplo, PCI) – E/S (longo, diferentes dispositivos; por exemplo, USB, Firewire) • Síncrono versus assíncrono – usam um clock e um protocolo síncronos, rápidos e pequenos, mas cada dispositivo precisa operar na mesma velocidade e a variação de clock exige que o barramento seja curto – não usam um clock, mas usam hanshaking
217
Padrões de barramento de E/S • Hoje temos dois padrões de barramento dominantes:
Características Tipo de barramento Largura básica do barramento de dados (sinais) Clock Largura de banda máxima teórica Facilidade de conexão Número máximo de dispositivos Tamanho máximo do barramento (fio de cobre) Nome do padrão
Firewire (1394) E/S 4 assíncrono 50MB/seg (Firewire 400) ou 100MB/seg (Firewire 800) sim 63 4,5 metros IEEE 1394, 1394b
USB 2.0 E/S 2 assíncrono 0,2MB/seg (baixa velocidade), 1,5MB/seg (velocidade plena) ou 60MB/seg (velocidade alta) sim 127 5 metros USB Implementors Forum
FIGURA 8.9 Principais características dos dois padrões de barramento de E/S dominantes.
218
Outros aspectos importantes • Arbitração de barramento: – arbitração de margarida (não muito justa) – arbitração centralizada (exige um árbitro), por exemplo, PCI – detecção de colisão, por exemplo, Ethernet • Sistema operacional: – polling – interrupções – acesso direto à memória (DMA) • Técnicas de análise de desempenho: – teoria do enfileiramento – simulação – análise; por exemplo, encontrar o link mais fraco (veja “Projeto de sistema de E/S”)
• Muitos desenvolvimentos recentes
219
Pentium 4 • Opções de E/S
Chip set 875P Segmento de destino
PC de desempenho Barramento do sistema (64 bits) 800/533MHz Hub controlador de memória (“bridge norte”)
DDR 400 (3,2GB/seg) DIMMs da memória principal
DDR 400 (3,2GB/seg)
42,5 x 42,5mm, 1005
37,5 x 37,5mm, 760
Processador Pentium 4
Velocidade da memória
DDR 400/ 333/266 SDRAM
DDR 266/200, PC133 SDRAM
Barramento do sistema (800MHz, 604GB/seg) AGP 8X Hub Saída (2,1GB/seg) controlador gráfica de memória CSA (bridge norte) (0,266GB/seg) Ethernet 1 Gbit 82875P
Barramentos de memória, larguras Número de DIMMs, suporte a Mbit da DRAM Capacidade máxima da memória Correção de erro da memória disponível? Barramento gráfico AGP, velocidade Controlador gráfico
2x72 4, 128/256/ 512Mbits 4GB sim sim, 8X ou 4X Externo
1x64 2, 128/256/ 512Mbits 2GB não não Interno (Extreme Graphics) não 266MHz
(266MB/seg) ATA paralelo (100MB/seg)
ATA serial (150MB/seg)
ATA paralelo (100MB/seg)
Disco
Estéreo (som surround)
AC/97 (1MB/seg) USB 2.0 (60MB/seg) ...
PC de menor custo 400MHz
Tamanho do pacote, pinos
ATA serial (150MB/seg)
Disco
Chip set 845GL
Hub controlador de E/S (bridge sul) 82801EB
CD/DVD
Fita
(20 MB/seg) Ethernet 10/100 Mbit Barramento PC (132MB/seg)
Interface CSA Gigabit Ethernet sim Velocidade de interface da bridge sul (8 bits) 266MHz Hub controlador de E/S (“bridge sul”) Tamanho do pacote, pinos Barramento PCI: largura, velocidade, masters Controlador MAC Ethernet, interface Portas USB 2.0, controladoras Portas ATA 100 Controlador ATA serial 150, portas Controlador RAID 0 Controlador de áudio AC-97, interface Gerenciamento de E/S
31 x 31mm, 460 32 bits, 33MHz, 6 masters 100/10Mbits 8, 4 2 sim, 2 sim sim SMbus 2.0, GPIO
31 x 31mm, 421 32 bits, 33MHz, 6 masters 100/10Mbits 6, 3 2 não não sim SMbus 2.0, GPIO
FIGURA 8.12 Dois chip sets de E/S Pentium 4 da Intel. A bridge norte 845GL utiliza muito menos pinos do que o 875, com apenas um barramento de memória e omitindo o barramento AGP e a interface Gigabit Ethernet. Observe que a natureza serial do USB e da ATA serial significa que mais duas portas USB e mais duas portas ATA serial precisam de apenas mais 39 pinos na bridge sul do chip set 875 versus o chip set 845GL.
220
Falácias e armadilhas • Falácia: O tempo médio para falha (MTTF) indicado para discos é 1.200.000 horas ou quase 140 anos, de modo que os discos praticamente nunca falham.
• Falácia: O armazenamento de disco magnético está com seus dias contados; será substituído.
• Falácia: Um barramento de 100 MB/seg pode transferir 100 MB por segundo. • Armadilha: Mover funções da CPU para o processador de E/S, esperando melhorar o desempenho sem análise.
221
Multiprocessadores • Idéia: criar computadores poderosos conectando muitos computadores menores boa notícia:
funciona para compartilhamento de tempo (melhor do que um supercomputador)
má notícia:
é muito difícil escrever bons programas concorrentes, muitas falhas comerciais
Processador
Processador
Processador
Processador
Processador
...
Processador
Cache
Cache
Cache
Cache
Cache
...
Cache
Memória
Memória
...
Memória
Barramento único
Memória
E/S
Rede
222
Perguntas • Como os processadores paralelos compartilham dados? – espaço de endereço único (SMP versus NUMA) – transferência de mensagens • Como os processadores paralelos são coordenados? – sincronização (bloqueios, semáforos) – primitivas send/receive embutidas – protocolos de sistema operacional • Como eles são implementados? – conectados por um único barramento – conectados por uma rede
223
Supercomputadores Representação dos 500 maiores sites de supercomputador durante uma década:
SIMD (Single Instruction Multiple Data) 500
Cluster (rede de estações de trabalho) Cluster (rede de SMPs)
400
300 MPPs (Massively Parallel Processors)
200
100
SMPs (Shared Memory Multiprocessors)
0 93 93 94 94 95 95 96 96 97 97 98 98 99 99 00 Uniprocessadores
224
Usar múltiplos processadores – uma idéia antiga • Alguns projetos SIMD:
Instituição Universidade de Illinois ICL Goodyear Thinking Machines Maspar
Nome
Número máximo de processadores
Bits/proc.
Velocidade de clock do proc. (MHz)
Tamanho/sistema de memória máximo (MB)
Número de FPUs
BW/sistema de comunicações (MB/s)
Ano
Illiac IV
64
64
13
64
1
2.560
1972
DAP MPP CM-2 MP-1216
4.096 16.384 65.536 16.384
1 1 1 4
5 10 7 25
0 0 2048 (opcional) 0
2 2 512 256 ou 1024
2.560 20.480 16.384 23.000
1980 1982 1987 1989
FIGURA 9.11.1 Características de cinco computadores SIMD. Número de FPUs significa o número de unidades de ponto flutuante.
• Os custos para o Illiac IV aumentaram de US$ 8 milhões em 1966 para US$ 32 milhões em 1972 apesar da conclusão de apenas ¼ da máquina. Levou três outros anos para que ele estivesse operacional! “Por sorte ou por azar, os arquitetos de computador não são facilmente desencorajados” Muitos projetos e idéias interessantes, muitas falhas, poucos sucessos
225
Topologias
226
Clusters • Construídos a partir de computadores inteiros • Redes independentes e escaláveis • Vantagens: – Muitas aplicações receptivas a máquinas frouxamente agrupadas – Exploram redes locais – Econômicos / fáceis de expandir • Desvantagens: – Custos de administração não necessariamente baixos – Conectados usando barramento de E/S • Altamente disponíveis devido à separação das memórias • Em teoria, devemos ser capazes de fazer melhor
227
Google • Serve uma média de 1.000 consultas por segundo • Usa 6.000 processadores e 12.000 discos • Dois locais físicos no Vale do Silício e dois na Virgínia • Cada local está conectado à Internet usando OC48 (2488 Mbit/seg) • Confiabilidade: – Em um dia típico, 20 máquinas precisam ser reiniciadas (erros de software) – Menos de 2% das máquinas são substituídas a cada ano
Em certo sentido, são idéias simples bem executadas. Melhores (e mais baratas) do que outros métodos envolvendo maior complexidade.
228
Comentários finais • Evolução versus revolução “Na maioria das vezes, o custo da inovação é devido a ser muito problemático para os usuários de computador.” Microprocessador de processamento paralelo Uso especial
SIMD massivo
Multiprocessador CC-NUMA
(Reprogramar)
Clusters
Multiprocessador CC-UMA
(Recompilar)
RISC
Instruções vetoriais
Instruções de multimídia
(Novas bibliotecas)
Memória virtual Superescalar
Multiprocessador com time sharing
Pipelining
Evolucionário
Cache
Microprogramação
(Compatível a nível binário)
Revolucionário
“A aceitação de idéias de hardware exige aceitação pelas pessoas de software; portanto, as pessoas de hardware precisam aprender mais sobre software. Além disso, se as pessoas de software quiserem boas máquinas, elas precisam aprender mais sobre hardware para serem capazes de se comunicar com — e, portanto, influenciar — os projetistas de hardware.”
229