Anda di halaman 1dari 95

Princpios da Microprogramao

Horizontal X Vertical
Passaremos agora a discutir sobre dois conceitos
relacionados microprogramao
Na microprogramao horizontal, a
preocupao exclusivamente com as portas
lgicas
Nada de sinais codificados para economia de
bits: cada conjunto de sinais que sai do MIR
controla de forma direta sua respectiva
componente
1
Isto significa que as microinstrues em uma
arquitetura assim teriam largura equivalente ao
total de sinais de controle recebidos pelas
componentes

2
...mas claro que esta
explicao no deixou
nada muito claro

Usaremos um exemplo da mquina que
projetamos anteriormente. Lembra-se do nosso
MIR?

3
U
L
A
D
E
S
M
B
R
M
A
R
R
D
W
R
E
n
C
C
C
O
N
D
A
M
U
X
B A
A
D
D
R
Os campos A, B e C possuam 4 bits cada, que
passavam por decodificadores onde eram
transformados em 16
Se tivssemos usado, exclusivamente,
microprogramao horizontal na arquitetura, cada
um desses campos teria 16 bits. Isto aumentaria
drasticamente a largura do MIR

Os campos ULA e DES tambm ficariam maiores.
Os pares 00, 01, 10 e 11 tambm so codificaes,
as quais geram um conjunto de 4 bits que
identificam qual a operao a ser realizada pela
ULA ou pelo deslocador
No caso do deslocador, pode ser gerado um
conjunto de 3 bits, j que o deslocador possui
apenas 3 funes e o par 11 nunca ocorre
Assim, conclumos que o campo ULA passaria a
ter 4 bits e o campo DES, 3 bits

4
fcil perceber que seguir risca
o conceito de microprogramao
horizontal no teria sido a opo
mais inteligente para a nossa mquina,
j que sempre optamos por tentar diminuir o
tamanho da memria de controle e, assim, do MIR
Mas se quisssemos ser ainda mais econmicos
na largura das microinstrues (e do MIR,
consequentemente) da arquitetura que
projetamos, poderamos aplicar o conceito de
microprogramao vertical

5
A microprogramao vertical carrega uma ideia
rigorosamente oposta horizontal: encurtar ao
mximo a largura das microinstrues, criando o
mximo possvel de codificaes nos sinais
Diminuir o nmero de bits das microinstrues
geralmente uma ideia interessante. Vamos
mostrar como ficaria nossa mquina se
segussemos este princpio exclusivamente
Nosso MIR, que antes tinha 32 bits de largura,
pode passar a ter apenas 12, como veremos a
seguir
6
Com apenas 4 bits para OPCODE e 8 para
operandos (4 para cada), possvel escrever um
microprograma equivalente ao que vimos
anteriormente



claro que as restries aumentam com esses
cortes
Agora, s temos 2 operandos. Como saber onde o
resultado ser gravado?
A soluo guardar o resultado sempre no
mesmo registrador de um dos operandos
7
OPCODE
OPERANDO 1 OPERANDO 2
ADDR (endereo)
4 bits 4 bits 4 bits
Antes, podamos fazer R3 <- R1 + R2. Agora, se
queremos de fato guardar em R3 o resultado da
soma dos valores de R1 e R2, precisamos fazer
R1 <- R1 + R2; e depois R3 <- R1
Por este exemplo j foi possvel perceber que o
microprograma ficaria mais extenso do que aquele
que fizemos anteriormente, mas isso assunto
para mais tarde
A seguir, ser apresentada como ficaria nossa
mquina em microprogramao vertical. Repare
na presena de 3 novos elementos: OP, AND e NZ
8
9
Recordando: os dados de entrada so sempre
carregados dos registradores no subciclo 2, e o
resultado salvo em um deles no subciclo 4
J que agora temos 2 operandos e um deles ser
ao mesmo tempo um dado de entrada e o destino
do resultado, o bloco AND se faz necessrio para
ativar cada barramento no subciclo correto
Pelo esquema apresentado alguns slides atrs,
vimos que os 2 operandos da microinstruo pode
tambm ser usado como um endereo. Isto
significa que no podemos ter endereo e
operandos em uma mesma microinstruo
10
Para comeo de conversa, j podemos com isso
adiantar que no possvel testar se o resultado
de uma operao da ULA maior, igual ou menor
que 0, em apenas uma microinstruo
Precisamos portanto armazenar os bits N e Z
liberados pela ULA, para que eles possam ser
avaliados no ciclo seguinte. a que entra NZ, que
nada mais do que um registrador que armazena
estes dois bits
Resta falar sobre OP, a mais importante das 3
inditas componentes em nossa nova mquina
11
Para cada combinao de OPCODE (16 possveis,
j que so 4 bits), so gerados 13 bits que
controlam a lgica de microssequenciamento
(componente usada na avaliao dos bits N e Z), a
ULA, o deslocador, o registrador NZ, o AMUX, os
registradores MBR e MAR, e os sinais RD e WR; 2
bits para os 3 primeiros e um bit para os outros
O problema que quem est projetando a
mquina precisa construir todo um circuito que
gere os bits de controle corretos para cada
OPCODE
12
Exemplificando: suponha que as combinaes
OPCODE para as instrues que iniciam as
operaes de leitura e escrita (portanto, envolvem
a ativao do MAR) sejam 1000 e 1001
Tudo o que sabemos :
A combinao de OPCODE 1000 gera o bit 1 para MAR
A combinao de OPCODE 1001 gera o bit 1 para MAR
As demais combinaes geram o bit 0 para MAR
Temos ento uma tabela que contm os bits de
entrada e tambm os bits de sada
13
14
A B C D S
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 0
0 1 0 1 0
0 1 1 0 0
0 1 1 1 0
1 0 0 0 1
1 0 0 1 1
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 1 1 1 0
A, B, C e D seguem a
ordem do bit mais
significativo para o menos
significativo, e S a sada
A partir da, basta utilizar
os conhecimentos da
disciplina de Circuitos
Digitais para montar um
circuito apropriado
Da tabela, obtemos (A.B.C.D) + (A.B.C.D), que
pode ser simplificado em A.B.C
Com isso, j temos projetado o circuito que,
recebendo os bits de OPCODE, gera o bit de
controle apropriado para MAR. Os circuitos que
vo gerar os outros 12 bits de controle so
construdos utilizando o mesmo raciocnio deste
exemplo
Enfim, o bloco OP nada mais do que o conjunto
de todos estes circuitos. Como chegar em cada um
deles no relevante para os nossos estudos
15
Para efeitos de comparao, vamos supor que
fosse ser executado em nossa mquina original
um microprograma de 80 instrues, lembrando
que na mquina original uma microinstruo tinha
32 bits de largura, enquanto na que acabamos de
projetar, uma microinstruo possui 12 bits
16
80 instrues
Muito provavelmente,
mais de 80 instrues
Como j foi dito, as restries causadas pela
fixao da largura de OPCODE em 4 fazem com
que uma funo desempenhada por uma
microinstruo em nossa primeira mquina
necessite de mais de uma microinstruo na nova
arquitetura (operar na ULA e depois avaliar o
resultado, por exemplo)
Assim, podemos saber qual das duas mquinas
ser mais econmica atravs de um clculo
bastante simples
O microprograma que ocupar menos volume na
memria de controle determinar a resposta
17
Por volume, entende-se a largura de cada
microinstruo multiplicada pelo total de
microinstrues
Na mquina original, ocupou-se um volume de
80 x 32 = 2560 bits. Se fizermos:
80 x 32 > n x 12
teremos n < 213, isto , a mquina que acabamos
de projetar ser mais econmica caso o
microprograma equivalente quele de 80
instrues tenha menos de 213
E a tendncia que realmente tenha bem menos
que 213 microinstrues
18
Ento, toda mquina deve ser projetada seguindo
risca o princpio da microprogramao vertical?
Certamente no. Lembre-se de que cada
microinstruo , independente de sua largura,
executada no tempo de um ciclo, que fixo
Quanto mais microinstrues necessrias para
executar uma funo, mais lenta a execuo.
Logo, a nossa primeira mquina mais cara e mais
rpida, enquanto a ltima mais lenta, porm
mais barata
19
Nanoprogramao
Falando em economia, existe ainda outra forma
de ocupar menos memria no armazenamento
dos microprogramas, que deve ser discutida
Vimos que programas so sequncias de
instrues. possvel dividi-los em sequncias e
instrues
Vamos a seguir entender melhor esta jogada
20
Consideremos um microprograma que ocupa
completamente esta memria de controle, isto ,
possui h instrues de largura w
Podemos dividi-lo em duas partes:
21
Memria de Controle h
w
esquerda, temos uma memria que armazena
nmeros binrios que identificam cada instruo
As instrues completas so armazenadas na
memria direita, com a vantagem de cada uma
aparecer apenas uma vez
22
1
3
2
0
1
2
5
.
.
.
h
w
sequncia na qual
ocorre cada
instruo,
identificada
apenas
por um nmero
A
B
C
.
.
.
cada instruo
individualmente,
todas distintas
entre si
(n instrues no
total)
Novamente, a melhor maneira de clarear tudo
ilustrando com um pequeno exemplo
Imagine o seguinte microprograma:
23
A
B
A
A
A
C
D
D
B
D
C
A
A
C
D
B
A equivale a 01100101100101101001
B equivale a 10110110001000011011
C equivale a 11101000110100110000
D equivale a 00010110100101110010
Neste exemplo, w = 20 e h = 16, isto , um total
de 16 microinstrues onde a largura de cada
uma de 20 bits, totalizando 320 bits
Vamos agora dividir o microprograma. A parte
esquerda o microprograma de fato, e direita
temos o nanoprograma, que guarda cada
microinstruo diferente
Cada linha do microprograma passa a conter
apenas o endereo da nanomemria no qual est
a instruo que deveria estar naquele local do
microprograma
24
25
00
01
00
00
00
10
11
11
01
11
10
00
00
10
11
01
h = 16
w = 20
01100101100101101001
10110110001000011011
11101000110100110000
00010110100101110010
00
01
10
11
endereos
A
B
A
A
A
C
D
D
B
D
C
A
A
C
D
B
memria de controle
nanomemria
Vimos que cada linha da memria de controle
passou a ter 2 bits apenas. Isto porque o
microprograma tem, no total, 4 instrues
diferentes, fazendo necessrios log4 = 2 bits
para represent-las. A quantidade de linhas a
mesma do microprograma original: 16
Portanto, a memria de controle passou a ter
16 x 2 = 32 bits ocupados
J a nanomemria possui o total de instrues
multiplicado pela largura das mesmas, o que
totaliza 80 bits (4 x 20)
Dos 320 bits originais, o microprograma passou a
ocupar apenas 32 + 80 = 112 bits!
26
De uma forma geral, temos:
o microprograma original ocupa h.w bits
a memria de controle aps a diviso passa de h.w
para h.logn bits ocupados, onde n o total de
instrues diferentes do microprograma
a nanomemria introduzida tem n.w bits ocupados
Em outras palavras, a nanoprogramao ser
econmica sempre que a seguinte inequao for
satisfeita:
h.w > h.logn + n.w
27
Observe que n aparece nos dois produtos
direita, sendo determinante na economia dos bits
Isso faz sentido porque, se houver muitas
instrues diferentes em relao ao nmero de
linhas no microprograma original, recorrer
nanoprogramao no ser eficiente. A
nanomemria ter um tamanho prximo ao
tamanho que tinha a memria de controle antes
da diviso
Tudo o que teramos ento seria uma memria
parecida com a anterior, e mais uma outra
contendo apenas referncias para a nova
memria
28
Pipeline
At agora, nos
prendemos muito em
economizar espao na
memria e baratear o
custo de uma mquina
Mas, e quando
quisermos uma
mquina mais veloz,
isto , com melhor
desempenho?
29
At aqui, sempre assumimos que o tempo de um
ciclo era fixo e pr-definido. E por causa disso, o
nmero de microinstrues a serem executadas
definia o tempo gasto na execuo do programa
Esquecendo um pouco a memria,
vamos focar agora em como
reduzir o tempo gasto na execu-
o das microinstrues
A seguir, veremos o uso do
pipeline
30
At aqui, seguindo o modelo de Von Neumann,
vimos que as etapas de execuo de uma
instruo seguem uma ordem: busca da
instruo, identificao, busca dos operandos,
execuo da operao e armazenamento do
resultado
Podemos representar desta forma, onde cada
quadrado representa um subciclo:
31
B
I
BO
E AR
Vimos tambm que, por este modelo, uma nova
microinstruo s pode ser executada aps o
trmino da anterior, mesmo que no haja
interdependncia entre elas
Esquematizando, teramos:






Como otimizar este processo?
32
B
I
BO
E AR 1
2
tempo
3
B
I
BO
E AR
B
...
Curiosidades
Henry Ford (1863 1947)
nasceu nos EUA, fundou
a Ford fbrica de auto-
mveis e defendia for-
temente o consumismo
Mas nada disso nos
interessa
33
Curiosidades
Ford utilizava a chamada linha
de montagem, que consistia em
especializar seus empregados em
funes definidas
O mesmo empregado passava todo o tempo
realizando uma nica tarefa, mais especfica possvel
e repetidas vezes, de forma que a prtica o levasse a
diminuir a chance de erros e o fizesse gastar menos
tempo para concluir a tarefa
34
Aplicaremos o fordismo aos nossos estudos: as
componentes devero estar exercendo suas
funes sempre que possvel, em vez de ter que
esperar o que chamvamos de um ciclo para
voltar a trabalhar
O ganho no desempenho bastante significativo
35
B
I
BO
E AR 1
2
tempo
3
B
I
BO
E AR
B
...
B
I
Dessa forma, assim que a busca de uma
instruo for concluda, pode ser iniciada a busca
da prxima, j que as componentes
especializadas nesta tarefa (no caso, PC, IR e
MAR) j estaro livres. E o mesmo serve para
identificao, busca de operandos etc
Podemos chamar cada um dos quadrados de um
estgio do pipeline
Antes, o tempo total era dado pelo tempo de
uma instruo multiplicado pelo total de
instrues:
t = n.tinst
36
No pipeline, o tempo de uma instruo dado
pelo nmero de estgios multiplicado pelo tempo
de um estgio:
tinst = ne.te
E, se analisarmos o esquema de execuo das
instrues no pipeline feito h pouco, teremos o
tempo total de execuo no pipeline:
tpipe = tinst + (n 1).te
= (ne + n 1).te
Com isso, podemos conhecer o speedup, ou seja,
o quanto mais rpido a execuo por pipeline
em relao arquitetura anterior
37
O clculo se d dividindo o tempo total t do
modelo de Von Neumann pelo tempo gasto no
pipeline, o que nos d:


O nmero de estgios vai ser sempre muito
inferior ao nmero de instrues, portanto
podemos ignorar os valores ne e -1 no
denominador. No numerador, isso no possvel
por ser uma multiplicao, e no uma soma
Passamos a ter ento:
38
Com o resultado, inferimos que a execuo de
um programa , idealmente, ne vezes mais rpida
no pipeline
fcil visualizar isso:
39
Note que na rea entre os
pontilhados, 4 tarefas esto
sendo executadas ao mesmo
tempo, enquanto apenas uma
estaria sendo no modelo antigo.
Isto porque so 4 estgios
Lembre-se de que, em uma aplicao real, o
esquema anterior teria centenas de
microinstrues. Isto , a rea entre as linhas
pontilhadas sempre vai ser a imensa maioria
Mas, como sempre, existem problemas





E deles que vamos falar a partir de agora
40
Dependncia de dados
Quando h dependncia de dados entre instrues,
algumas componentes precisam se manter ociosas
durante alguns ciclos
Isto caracteriza desperdcio de tempo
41
a = b + c
d = a + h
B E GR
I
BO
B E GR
I
BO
Vamos acompanhar a sucesso dos ciclos para
entender o que acontece
B
No primeiro ciclo, a instruo buscada. Ou seja,
ao seu final, a mquina apenas tem a instruo
sem nem sequer saber o que significa, pois ainda
no foi identificada
I
BO
B
Aqui, a mquina identifica a instruo a = b + c e
j busca o valor dos operandos b e c. Neste mesmo
ciclo, j buscada a instruo d = a + h
E
I
BO
Agora, aparece o problema. Neste ciclo, buscamos
os operandos a e h da instruo 2, sendo que a o
resultado da instruo 1. E este resultado ainda
no foi gravado, j que isto s ter sido feito ao
final do ciclo seguinte
- -
Dependncia de dados
Quando h dependncia de dados entre instrues,
algumas componentes precisam se manter ociosas
durante alguns ciclos
Isto caracteriza desperdcio de tempo
42
a = b + c
d = a + h
B E GR
I
BO
E GR
I
BO
Portanto, faz-se necessrio esperar at que o
valor de a esteja corretamente gravado em algum
registrador
B
Note que, sem esse problema, levaramos 5
ciclos para executar as 2 instrues. Com o
impasse, levamos 2 ciclos a mais
Se a dependncia de dados ocorresse
seguidamente em 500 instrues, levaramos 2
ciclos a mais para cada dependncia
De pouco mais de 500 ciclos, a sequncia
passaria a levar cerca de 1500 ciclos para ser
executada
H ainda outro problema, muito mais comum do
que a dependncia de dados
43
Dependncia de controle
Sabemos que o endereo da instruo a ser buscada
na memria se encontra no registrador PC
Sabemos tambm que, se no h desvios, a prxima
instruo a ser buscada est no endereo dado por pc
(contedo de PC) + 1
No pipeline, busca-se uma instruo em um estgio,
e j no prximo busca-se a instruo seguinte, no
endereo pc + 1
44
45
Memria de
Controle
MPC
I
N
C
MUX
A
M
U
X
C
O
N
D
N1
N0
LMS
ULA
N Z
Controle
Convm uma pequena
reviso. Lembra-se deste
esquema?
sobre como so feitos os
desvios de instrues

U
L
A
. . . . .
A
D
D
R
Na verdade, no necessrio relembrar o que
acontece em cada parte no desenho
Tudo o que precisamos ter em mente que os
desvios condicionais so realizados aps alguma
operao na ULA, a qual libera os sinais N e Z que
contm informaes sobre a sada da ULA. Esta
sada , ento, avaliada de acordo com a
condio do desvio
Dito isso, conclui-se ento que s no terceiro
estgio saberemos se ocorrer desvio
46
B E GR
I
BO
Isso significa que teremos problemas no pipeline
se tivermos uma instruo parecida com:

Suponha que a instruo acima esteja no
endereo 1 da memria principal
47
se a = 0 ento goto 8
B E GR
I
BO
B E GR
I
BO
B
I
BO
B
E
I
BO
Neste ciclo, estaremos buscando a nossa
instruo. PC contm seu endereo, ento o
contedo de PC 1
Agora, identificamos nossa instruo e buscamos o
operando a. Vamos supor que este seja igual a 0.
Neste mesmo ciclo, buscamos a prxima instruo,
por default, no endereo pc + 1. Est sendo
buscada, ento, a instruo no endereo 2
Porm, chegamos agora ao ciclo onde a primeira
instruo executada. A ULA dar como sada o
prprio operando a, que ser avaliado na lgica de
microssequenciamento e, como igual a 0, a
execuo do programa teria de ser desviada para a
instruo no endereo 8 (goto 8)
- -
Isso significa que teremos problemas no pipeline
se tivermos uma instruo parecida com:

Suponha que a instruo acima esteja no
endereo 1 da memria principal
48
se a = 0 ento goto 8
B E GR
I
BO
B E GR
I
BO
E agora? Constatamos anteriormente que a
instruo no endereo 2 j foi buscada, e a
mquina a essa altura j identificou e buscou os
operandos dessa instruo que no nos interessa
Mais uma vez, necessrio esperar alguns ciclos
at que tenhamos a confirmao de que haver
desvio, para s depois buscar a prxima instruo
Ns, como projetistas da mquina, precisamos
sempre buscar formas de passar por todos os
obstculos existentes em uma implementao





A sada geralmente pensar em otimizaes que
diminuam o prejuzo causado por possveis
problemas de uma implementao
49
A primeira otimizao, que qualquer bom
compilador deve ser capaz de fazer, uma
arrumao na sequncia de instrues a fim de
diminuir ao mximo o nmero de ocorrncias de
dependncia de dados em um programa
Vimos que a sequncia
a = b + c
d = a + h
causaria um desperdcio de 2 ciclos na mquina
Entretanto, o compilador pode procurar outras
instrues que nada tenham a ver com estas e
execut-las neste espao
50
Por exemplo, se houver no programa outras duas
instrues de soma, a ordem de execuo pode
ser:
a = b + c
x = y + z
m = n + p
d = a + h
Desta forma, no haver perda de tempo
51
B E GR
I
BO
B E GR
I
BO
B E GR
I
BO
B E GR
I
BO
a = b + c
x = y + z
m = n + p
d = a + h
O processador acaba de
gravar o resultado em algum
registrador
Inicia-se a busca dos
operandos. Quando o
registrador onde est a for
consultado, l j estar o
valor correto de a
Outra otimizao possvel conhecida como
Data Forwarding
Consiste em buscar os operandos sem esperar
que o resultado da instruo anterior seja
gravado em um registrador, mesmo que um
desses operandos seja esse resultado
52
ULA
Registradores
Na sequncia:
a = b + c
d = a + h
sabemos que a segunda instruo tambm pode
ser escrita como d = b + c + h
Desta forma, no precisamos esperar at que o
registrador da varivel a seja atualizado para
buscar os operandos da segunda instruo
Em outras palavras, no necessrio esperar
chegarmos ao final do estgio onde o resultado
gravado (GR) para conhecermos um dos
operandos da segunda instruo
53
54
- -
B E GR
I
BO
E GR
I
BO
B
Antes, precisvamos do valor
gravado em um registrador
Agora, podemos reaproveitar este
valor logo aps o trmino da
execuo da operao na ULA
Esta seria uma opo bastante til
para um caso do tipo:
a = b + c
d = a + e
f = d + g
h = f + i
j = h + k
x = j + h
Processadores como o da Intel possuem uma
srie de outras otimizaes na implementao do
pipeline
Prejuzos causados por dependncia de controle
so diminudos com maneiras de prever se a
instruo atual causar desvio na execuo da
sequncia de instrues, com probabilidades
altas de acerto
Outra otimizao possvel armazenar certas
informaes quando houver desvios na instruo,
para serem usadas quando esta instruo
aparecer novamente. Por exemplo, em um loop
onde so feitas 10 iteraes, ocorrem 9 desvios
para a mesma instruo (a primeira)
55
Acompanhe:

i <- 1;
para i = 1 at 10 faa
instruo 1;
instruo 2;
instruo 3;
i <- i + 1;
fim do loop
56
i = 1
A condio analisada e
no ocorre desvio:
entramos no loop
Hora de analisar
novamente se i menor
ou igual a 10
Neste momento, i = 2,
ento para iniciar a
segunda iterao...
...desviamos de volta para
a primeira instruo no
loop
H ainda uma ltima forma de otimizao que
melhora o desempenho da nossa mquina,
conhecida como superpipelining
Vimos que a implementao do pipeline agiliza,
idealmente, ne vezes a execuo do programa em
relao nossa mquina antiga
Ora, por que ento usar apenas 4 estgios?
Um dos processadores da Intel possui pipeline
de 20 estgios. Apenas para dar uma ideia, os
primeiros 4 estgios so usados para operaes
de busca de instrues
57
. . .
. . .
B1 B2 B3 B4
Esta configurao caracteriza exatamente um
superpipeline
Ok, 20 estgios j est melhor que 4. Mas por
que no usar, talvez, 1000 estgios?
Para executar vrias operaes do mesmo tipo
ao mesmo tempo, precisaramos aumentar o
nmero de componentes. No caso de 4
operaes de busca, por exemplo, o processador
precisa ter 4 PCs para armazenar o endereo
dessas instrues, 4 IRs para armazenar as
instrues propriamente ditas, etc
Aumentar o nmero de componentes encarece a
mquina, o que tornaria um desastre elevar
demais o nmero de estgios do pipeline
58
Muito bem, falamos bastante sobre como
amenizar os revs do pipeline, mas no podemos
esquecer que estes no so os nicos que afetam
o desempenho da mquina
At agora, economizamos alguns ciclos aqui,
outros l, j executamos vrias instrues ao
mesmo tempo e por a vai
Mas no nos aprofundamos ainda em um outro
problema que aumenta consideravelmente o
tempo gasto pela mquina na execuo de
problemas: leitura e escrita na memria principal
Estas operaes levam aproximadamente 100
ciclos para serem realizadas!
59
Memria Principal x Cache
Uma das solues possveis para diminuir a
perda de tempo envolvida em operaes de
leitura e escrita na memria principal so as
memrias cache
Este um tipo de memria rpida, isto ,
acessos a ela levam muito menos tempo, porm
com a desvantagem de serem surrealmente caras
Recordando, de forma simplificada, o modelo de
Von Neumann:
60
Memria Processador
Temos as seguintes opes:
A que usvamos antes, memria principal, lenta, mas
com um tamanho maior sem um custo alto demais



Uma memria cache, carssima e, portanto, de
tamanho bem limitado, mas muito mais rpida
61
Memria
Principal
Processador
Cache Processador
Podemos sonhar que
somos infinitamente
ricos e simplesmente
aumentar a cache at o
tamanho que queremos
Ou podemos voltar realidade...
62
Agora, vem a pergunta manjada: ser que
possvel ter o benefcio da rapidez da memria
cache sem ter que aument-la a ponto de deixar
a mquina cara demais, e ao mesmo tempo ter o
tamanho de uma memria principal razovel?
Podemos comear com uma constatao bsica:
utilizando uma memria convencional,
gastaremos 100 ciclos (tempo de leitura na
memria, como j vimos) pelo menos uma vez
por instruo, pois precisamos buscar cada uma
delas na memria
Ento, j seria um bom comeo no precisar
buscar uma mesma instruo duas vezes
63
Podemos arrumar nossa mquina da seguinte
forma:



J que a cache tem um tamanho bastante
limitado, podemos us-la pelo menos para
armazenar instrues que j tenham sido
buscadas. Assim, quando o processador precisar
de alguma instruo pela segunda vez, ela ser
carregada da cache, o que levar muito menos
tempo do que carreg-la da memria principal
novamente
64
Memria
Principal
Processador Cache
dados dados
Vamos agora supor uma instruo que
executada k vezes ao longo de um programa
Na arquitetura em que s havia processador e
memria principal, o tempo mdio para buscar
essa instruo seria, naturalmente, o tempo
gasto em uma operao de busca na memria
J na arquitetura proposta no slide anterior,
sabemos que a instruo s ser buscada na
memria principal na primeira vez. Nas outras
(k - 1) vezes, ela ser carregada da cache. Logo, o
tempo mdio para buscar essa instruo ser:
65
Para k muito grande, temos k >> tmem, e k k - 1.
Da:
66
Ou seja, o tempo mdio de busca dessa
instruo ser o tempo de busc-la na cache, que
era o que queramos antes
E nem precisamos gastar uma senhora grana
com uma cache do tamanho da memria
principal; bastou usar uma menor com alguma
inteligncia
Existe um tipo especial de cache, chamado cache
associativa, que recebe da memria principal um
conjunto de instrues, em vez de apenas uma
por vez. Estes conjuntos so os blocos
Blocos de instrues so divises feitas tanto na
memria principal quanto na cache, de tamanho
fixo e pr-determinado
Por exemplo, podemos dividir a memria
principal em blocos de tamanho 4 (cada um
contm 4 palavras):
67
.
.
.
bloco 0
bloco 1
bloco 2
bloco 3
bloco 4
Sempre que o processador pedir uma instruo,
a cache armazenar todo o bloco de onde essa
instruo faz parte:
Vamos dar um zoom em parte da memria do
slide anterior. Suponha que o processador precisa
da palavra no endereo 4:
68
0
1
2
3
4
5
6
7
8
9
10
11
Cache
As palavras nos endereos
5, 6 e 7 tambm so
carregadas para a cache
Se as palavras nos endereos 4, 5, 6 e 7 forem
todas instrues e estas forem executadas
sequencialmente, apenas uma consulta na
memria principal ser necessria, em vez de 4
Considerando que, em aplicaes reais, o
tamanho dos blocos tende a ser muito maior que
4, pode-se dizer que conseguimos uma grande
vantagem
Analisaremos mais a fundo a cache associativa
para entender melhor suas vantagens
69
Cache associativa para blocos de tamanho 4:
70
1 3 P0 P1 P2 P3
1 5 P0 P1 P2 P3
0 2 P0 P1 P2 P3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
validade
(0 ou 1)
n do
bloco
contedo do bloco
(Pn a n-sima palavra do bloco)
Validade o bit que diz se aquele bloco est sendo
usado ou lixo. 1 significa que o bloco est sendo
usado, enquanto 0 quer dizer que aquela linha pode
ser sobrescrita
Nmero do bloco o nmero (evidentemente
binrio) que representa onde aquele bloco estava na
memria principal. Se o bloco armazena as palavras
vindas dos endereos 0, 1, 2 e 3 da memria, ento
seu nmero 0; se armazena as palavras dos
endereos 4, 5, 6 e 7, ento seu nmero 1; etc
Quando o processador pede alguma palavra da
memria, todas as linhas de validade 1 so
verificadas, e a palavra buscada na memria
principal apenas se no existir na cache
Mas como essa checagem feita?
71
Antes, precisamos entender
uma certa mgica
Seja a memria dividida em
blocos de tamanho n
Cortando os logn bits menos significativos do
endereo de uma palavra, obtemos exatamente o
bloco onde ela est
Por exemplo, vimos que, dividindo em blocos de
tamanho 4, a instruo no endereo 7 est no
bloco 1
7 na base 2, em 8 bits, igual a:
72
00000111
log4 = 2; ento, tirando os 2 bits menos
significativos, obtemos o valor 1, que o
nmero do bloco da instruo 7
Na verdade, no algo to difcil de aceitar se
pensarmos em uma generalizao
Vamos pensar na base 10: considere uma
memria dividida em blocos de tamanho 100
Os endereos 0 at 99 esto no bloco 0, do 100
at 199, esto no bloco 1, e por a vai
Para obter o bloco da palavra no endereo 374,
precisamos tirar os log100 bits menos
significativos (mudamos para a base 10, ento a
base do logaritmo passa a ser 10)
73
3 74
log100 = 2, ento tiramos os 2
algarismos menos significativos. A
palavra est no bloco 3
3
Voltando ao que interessa, vamos supor que o
valor 00001001 chegue ao MAR no processador.
Isto significa que o processador est pedindo a
palavra que est no endereo 9 (bloco 2)
Os 2 bits menos significativos so ignorados, e o
valor 000010 comparado, na cache, a todos os
nmeros de bloco pertencentes a linhas de
validade 1
Mas como uma consulta na cache pode ser to
rpida, se ainda precisamos fazer uma busca
sequencial para saber se o bloco 2 j est de fato
armazenado na cache?
74
Na verdade, a busca no sequencial
Em cada uma das linhas da cache, existem portas
lgicas que comparam simultaneamente o
nmero do bloco nela presente ao valor recebido
75
1 3 P0 P1 P2 P3
1 5 P0 P1 P2 P3
1 2 P0 P1 P2 P3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
000010
3
5
2
os valores so diferentes
os valores so iguais
76
Esse festival de portas lgicas constitui um
importante motivo do encarecimento da cache
Isso porque, como vimos desde os primeiros
slides, hardware tem uma grande influncia no
preo final da mquina
O bloco 2 ento est na cache. Mas como
encontrar a palavra certa (a do endereo 9) em
meio s 4 do bloco, que contm as palavras dos
endereos 8, 9, 10 e 11?
Recordando: a palavra pedida a do endereo
00001001, e para obter o bloco ignoramos os 2
bits mais esquerda, 01
E estes dois bits so exatamente os bits que
informam a palavra certa a ser buscada no bloco!
Ento, a palavra do endereo 9 a P do bloco 2
Dessa forma, carregamos a palavra direto da
cache, sem consulta memria principal
77
Existe outro tipo de cache, mais barato que a
associativa, a cache com mapeamento direto
Nela, cada linha da cache destinado a blocos
especficos da memria
Dessa forma, no necessrio ter circuitos
comparativos em cada linha da cache, j que a
procura ser feita apenas em uma linha especfica
e no mais em todas elas
Com isso, conseguimos baratear a cache
significativamente
Veremos que o esquema bem parecido com o
da cache associativa:
78
Cache com mapeamento direto para blocos de
tamanho 4:
79
1 000 P0 P1 P2 P3
1 001 P0 P1 P2 P3
0 101 P0 P1 P2 P3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
validade
(0 ou 1) tag
contedo do bloco
(Pn a n-sima palavra do bloco)
Antes, armazenvamos blocos vindos da
memria enquanto houvesse linhas disponveis
Agora, as linhas destinam-se a grupos fixos de
blocos. Porm, sabemos que cada linha s pode
armazenar um bloco
Ento, se uma linha destinada aos blocos X e Y,
apenas um deles pode estar na cache ao mesmo
tempo. Se na cache j existir o bloco X, e o bloco
Y for carregado da memria, este bloco ir para a
linha onde j est o bloco X, sobrescrevendo-a
Vamos definir que na nossa cache, cada linha
armazena 4 possveis blocos
80
A arrumao mais bvia seria:





Porm, perceba que, desta forma, dos blocos 0,
1, 2 e 3, nunca poderamos ter mais de um na
cache ao mesmo tempo. O mesmo vale para os
outros quartetos de blocos
Isto significa que, se as palavras nesses blocos
fossem buscadas sequencialmente, perderamos
sempre o bloco anterior
81
0
1
2
validade tag contedo do bloco
.
.
.
0, 1, 2, 3
4, 5, 6, 7
8, 9, 10, 11
Vamos focar na linha 0 para entender melhor:
82
0
bloco 0
bloco 1
bloco 2
bloco 3
palavras nos
endereos 0 a 15,
consultadas
sequencialmente
Vamos focar na linha 0 para entender melhor:
83
0
bloco 0
bloco 1
bloco 2
bloco 3
Ao buscar a palavra no endereo 0, o
bloco 0 carregado para a linha 0 da
cache
0
Vamos focar na linha 0 para entender melhor:
84
0
bloco 0
bloco 1
bloco 2
bloco 3
Na busca da palavra no endereo 4, o
bloco 1 carregado para a linha 0 da
cache. A cache perde, assim, o bloco 0
4
Vamos focar na linha 0 para entender melhor:
85
0
bloco 0
bloco 1
bloco 2
bloco 3
O mesmo acontece para as buscas das
palavras nos endereos 8...
8
Vamos focar na linha 0 para entender melhor:
86
0
bloco 0
bloco 1
bloco 2
bloco 3
...e 12!
12
Note que, aps todas essas bucas, teramos os 4
blocos armazenados na cache associativa
Na cache por mapeamento direto, porm,
ficamos apenas com o ltimo bloco da sequncia
Nesse caso, se as palavras desses 4 blocos
fossem instrues internas a um loop, teramos
que consultar a memria a cada mudana de
bloco. J na cache associativa, nenhum acesso
memria teria de ser feito depois que os 4 blocos
j estivessem na cache
Mas nem tudo est perdido. Basta fazermos com
que cada linha destine-se a blocos distantes uns
dos outros:
87





Com isso, o problema do loop que acabamos de ver
ser mais difcil de acontecer
Agora, quando carregarmos o bloco 0 na cache, ele
s ser sobrescrito quando os blocos 8, 16 ou 24
forem carregados da memria
Supondo uma execuo sem excessivos desvios, isto
, um programa com razovel localidade,
perfeitamente possvel que no precisemos mais do
bloco 0 quando carregarmos um dos outros 3
88
0
1
2
.
.
.
0, 8, 16, 24
1, 9, 17, 25
2, 10, 18, 26
Outro ganho que temos com este arranjo a
diminuio da largura da cache, substituindo a
antiga coluna que guardava o n do bloco por
uma coluna tag
A linha 0 destina-se aos blocos 0 (00000), 8
(01000), 16 (10000) e 24 (11000). A linha 1
destina-se aos blocos 1 (00001), 9 (01001), 17
(10001) e 25 (11001), e assim por diante
Repare na semelhana: para cada linha, os 3
ltimos bits dos seus possveis blocos so iguais
Isto significa que possvel identificar qual bloco
aquela linha est armazenando apenas pelos bits
que diferem entre os blocos
89
Assim, se o valor da tag na linha 0 for 000, sabemos
que nela est o bloco 0; se for 010, sabemos que l
est o bloco 8; j o valor 100 indica que ela guarda o
bloco 16; e 110 indica o bloco 24
Na linha 1, estes mesmos valores acusam,
respectivamente, os blocos 1, 9, 17 e 25
Resumindo: quando o processador precisa de uma
palavra que j est na cache, a consulta
imediatamente direcionada para a linha onde o bloco
daquela palavra deveria estar. Por exemplo, se o
processador pede uma palavra do bloco 8, a consulta
feita diretamente na linha 0
Porm, se l estiver o bloco 16, o bloco 8 carregado
da memria e salvo na linha 0, sobrescrevendo o 16
90
Supondo uma memria principal com 32 blocos,
teramos a cache disposta dessa forma:






Repare que a altura da cache precisa sempre ser
uma potncia de 2, para que possamos identificar
o bloco armazenado atravs da tag
91
0 0, 8, 16, 24
1 1, 9, 17, 25
2 2, 10, 18, 26
3 3, 11, 19, 27
4 4, 12, 20, 28
5 5, 13, 21, 29
6 6, 14, 22, 30
7 7, 15, 23, 31
Se tirssemos a ltima linha da cache, por
exemplo, no teria como redistribuir os blocos 7,
15, 23 e 31 sem que todos os blocos destinados a
uma mesma linha possussem bits em comum.
Logo, seria impossvel identific-los atravs da tag
Em alguns casos, esta restrio de tamanho pode
ser bastante inconveniente: suponha que temos
dinheiro para construir at 1023 linhas de uma
cache por mapeamento direto
A potncia de 2 mais prxima 1024 (2), mas
no conseguimos atingir esse nmero. Logo,
nossa cache ser forada a ter apenas 512 linhas
J a cache associativa poderia sem problemas ter
tantas linhas quanto pudssemos pagar
92
Uma forma de unir os benefcios desses dois
tipos de cache literalmente unir as duas caches
Se grudarmos vrias caches com mapeamento
direto, lado a lado, teremos na horizontal uma
espcie de cache associativa
93
.
.
.
.
.
.
.
.
.
.
.
.
V tag cont. do bloco
.
.
.
.
.
.
.
.
.
.
.
.
V tag cont. do bloco
.
.
.
.
.
.
.
.
.
.
.
.
V tag cont. do bloco
. . .
Isso consiste em um terceiro tipo de cache,
chamado cache associativa por conjunto
A altura continua sendo necessariamente uma
potncia de 2, mas a largura arbitrria
Portanto, se temos dinheiro para 1536 linhas de
cache, basta juntar 3 caches com mapeamento
direto de 512 linhas cada
Com isso, no precisamos sobrescrever uma
linha sempre sempre que um novo bloco
destinado a ela for carregado da memria; basta
pass-lo para o lado
94
J que temos mais de um bloco por linha,
precisamos de portas lgicas para identificar em
qual deles est a palavra pedida pelo
processador, exatamente como fazamos na
cache associativa
S que desta vez, o nmero de portas lgicas de
que precisamos no equivale ao nmero de
linhas da cache, e sim ao nmero de caches por
mapeamento direto unidas lado a lado
Temos com isso uma significativa
reduo de preo, sem uma
significativa perda de eficincia
95

Anda mungkin juga menyukai