Você está na página 1de 32

Memória Cache

Miguel Leitão, 2016

v20160921
1. Cache
Uma cache é um local de armazenamento temporário de itens que se espera venham a ser
necessários proximamente. Normalmente, as caches são preenchidas com cópias dos itens
usados recentemente, na esperança que estes possam coincidir com os que venham a ser
necessários num futuro próximo.

Funcionalmente, uma cache é um elemento localizado entre o local de armazenamento


principal e o consumidor ou utilizador dos itens armazenados.

O principio de cache aplica-se em muitos domínios com tecnologias muito distintas, sempre
com o objectivo de agilizar a obtenção de itens armazenados num depósito de acesso não
imediato.

Para ser útil, uma cache deve ser implementada com tecnologia e metodologia que
permitam a disponibilidade dos itens requeridos de forma mais rápida do que a sua
transferência do local de armazenamento principal. Uma vez que a cache se destina a dar
guarida temporária apenas a um conjunto selecionado de itens do armazém principal,
admite-se que a dimensão da cache seja muito inferior à dimensão do armazém principal.

Um exemplo simples de cache de produtos é aquele em que uma empresa detentora de um


armazém ou fábrica no estrangeiro decide constituir uma pequena estação de
armazenamento numa zona próxima dos seus clientes de forma a reduzir os tempos de
entrega. Este pequeno armazém constitui uma cache de produtos.

A figura 1 ilustra outras três aplicações distintas de caches.

A cache de páginas Web, frequentemente implementada de forma integrada em proxies,


consiste num elemento intercalado entre o armazém principal de páginas (a Web) e o
dispositivo cliente. Realiza o armazenamento temporário das páginas Web solicitadas
recentemente para que estas possam depois ser fornecidas de forma mais rápida sempre
que novamente solicitadas. O armazenamento temporário das páginas Web é tipicamente
implementado num sistema de ficheiros sobre um disco rígido (hard disk).

1
Figura 1. Diversas aplicações de cache. A implementação de cache de
páginas Web pode ser realizada através de disco. A cache de disco
pode ser implementada recorrendo a memória. Cache de memória
requer um novo tipo de memória designado por memória cache.

Dentro de um sistema computacional, a unidade de disco rígido é frequentemente um dos


elementos mais lentos. De forma a contornar os atrasos impostos por este dispositivo, a
generalidade dos sistemas operativos implementa um processo de cache da informação do
disco, alocando para isso espaço dedicado na memória RAM.

Princípio da proximidade
Os programas tendem a reutilizar dos dados e as instruções
usados recentemente e os colocados em locais próximos.
Existem dois tipos de proximidade:

Proximidade temporal: se um elemento é acedido num


determinado instante, é natural que seja também acedido num
instante próximo.

Proximidade espacial: se um elemento é acedido, é


expectável que os elementos colocados em posições vizinhas
também sejam acedidos.

A Cache de memória será um elemento localizado entre o processador e a memória principal


e que se espera possa fornecer alguns dos dados solicitados pelo processador com um
tempo de entrega inferior. A implementação de um dispositivo deste tipo requer um novo
tipo de memória designado por memória cache.

2
As vantagens oferecidas pela memória cache são potenciadas pela coerência temporal e
posicional dos acessos (Princípio da Proximidade), que se verifica na generalidade dos
programas computacionais.

2. Hierarquia de Memória
Os dispositivos de armazenamento são um dos componentes fundamentais do sistemas
computacionais.

A memória de um sistema computacional é geralmente organizada numa hierarquia de


vários níveis como ilustra a figura seguinte.

Processor

Control Tertiary
Secondary Storage
Second Main Storage (Tape)
Level Memory (Disk)
Registers

On-Chip
Cache

Cache (DRAM)
Datapath
(SRAM)

Speed (ns): 1 10 100 10 000 000 10 000 000 000


(10 ms) (10 s)

Size (Bytes): 100 k M G T

Figura 2. Hierarquia de memória.

Os níveis mais próximos do processador são sempre mais rápidos, mais caros (em preço por
unidade de armazenamento) e de menor dimensão do que os níveis mais afastados. A figura
seguinte ilustra as relações típicas entre a dimensão e o preço com o tempo de acesso
normalmente encontrados nas diversas tecnologias de armazenamento de dados, referentes
ao ano 2000.

3
Figura 3. Variação da dimensão e do preço em função do tempo de
resposta. A dimensão de sistemas de armazenamento cresce com
o tempo de acesso. O custo de um sistema de armazenamento
decresce com o tempo de resposta.

As variações ilustradas nos gráficos podem ser modeladas de forma aproximada pelas
equações:

0.01
price=
√t a

N=1012 ×t 3a /4

Nestas aproximações, ta representa, em segundos, o tempo de acesso ao primeiro Byte da


informação solicitada e N a dimensão total do dispositivo (em Bytes).

Terminologia

Acerto O conjunto de dados solicitado foi encontrado na memória


Hit
Sucesso cache

4
O conjunto de dados solicitado não foi encontrado na
Miss Falha
memória cache
Block Bloco A unidade básica de armazenamento de uma cache.
Zona da memória cache que armazena um bloco e respetiva
Line Linha
informação associada.
Conjunto Grupo de linhas indexadas em simultâneo. Um grupo possui
Set
Grupo sempre arquitetura completamente associativa.

Way Via Uma linha de um conjunto.


Colocação de um novo bloco na cache. Normalmente, esta
Replacement Substituição
operação exige retirar um dos blocos já armazenados.

3. Arquitecturas
Numa cache, os dados são armazenados em blocos de dimensão fixa. A capacidade total de
uma cache (MC) corresponde ao produto do número de blocos (NB) pela dimensão destes
(BS).

M C =NB×BS

Os blocos de dados de uma cache podem ter dimensão igual ou superior aos blocos de dados
que podem ser transferidos da memória principal.

A utilização de blocos de dimensão superior à largura do barramento de dados é habitual nas


caches integradas em microprocessadores, de forma a evitar as limitações impostas pela
largura do barramento externo de dados. A dimensão dos blocos de cache situa-se
normalmente entre 32 e 512 bits. Por facilidade de endereçamento, a dimensão selecionada
para os blocos de uma cache, expresso em unidades de endereçamento, deve ser sempre
uma potência de 2.

BS= AddrUnit ×2BO

Nesta expressão, BO representa o número de bit necessários para endereçar uma unidade
de endereçamento dentro dum bloco e AddrUnit a dimensão da palavra endereçavel.

BS
BO =log 2 ( AddrUnit )
Um endereço de memória pode portanto ser dividido em duas componentes: o endereço do
bloco e o desvio da palavra endereçada dentro do bloco.

5
Address: BA BO

BA BO

Figura 4. Constituição de um endereço de memória. O endereço completo


resulta da concatenação do Endereço do Bloco com o Offset do
Bloco (BO).

O endereço do bloco, identifica de forma inequívoca qualquer bloco. A forma como este
endereço é utilizado para encontrar um bloco presente numa memória cache, depende da
arquitectura da cache.

Cache Completamente Associativa


Se cada bloco de dados pode estar colocado em qualquer posição da cache, esta designa-se
por cache completamente associativa ou Fully-Associative Cache. Os blocos são
identificados através de uma etiqueta (Tag) que tem de corresponder à totalidade do
endereço do bloco.

A figura seguinte apresenta uma cache de completamente associativa com 4 blocos de 32


bits.

6
15 ….……................…….……. 2 1 ….. 0

Address
14 2
Tag Byte offset

Tag Data
V

14 32

Hit
=

14 32

4 lines
Hit
=

14 32

Hit
=

14 32

Hit
= Data

Figura 5. Cache completamente associativa. Cada bloco de dados é


completamente identificado por uma etiqueta, podendo ser
localizado em qualquer linha da cache.

A mesma estrutura pode ser aumentada para um qualquer número de blocos. Este
alargamento não influencia a dimensão das etiquetas. O número de etiquetas que é
necessário manter será sempre igual ao número de blocos.

A figura seguinte apresenta uma cache completamente associativa com 1024 blocos de 32
bits.

7
15 ….……................…….……. 2 1 ….. 0

Address
14 2
Tag Byte offset

Tag Data
V

14 32

Hit
=

14 32

Hit
=

1024 lines
14 32

Hit
=
...

...

...

14 32

Hit
=
Data

Figura 6. Cache completamente associativa. Cada bloco de dados é


completamente identificado por uma etiqueta, podendo ser
localizado em qualquer linha da cache.

Cache de Mapeamento Directo


Se cada bloco de dados tem apenas uma posição possível para ser colocado na cache, esta
designa-se por Cache de Mapeamento Directo ou Direct-Mapped Cache. Uma parte do
endereço é utilizada para endereçar o bloco na cache, os restantes bits do endereço são
comparados com a etiqueta do bloco para confirmar a sua identificação.

A figura seguinte apresenta uma cache de mapeamento directo com 8096 blocos de 128 bits.

Cada bloco de dados é associado a uma etiqueta de 15 bits. Numa tentativa de acesso à
cache, os bits 16-4 do endereço são utilizados para seleccionar um bloco entre os 8096

8
disponíveis. Os restantes 15 bits (31-17) são depois comparados com a etiqueta ( Tag)
associada ao bloco de dados. No caso de sucesso desta comparação ( Hit), são utilizados os
dados do bloco seleccionado. No caso de insucesso da comparação, temos uma situação de
Miss no acesso à cache.

31 ….…….… 17 16 …….……. 4 3 ….. 0


Address
15 13 4
Tag Byte offset
Index

Tag Data
V

8 ki blocks
15

=
Hit
128
Data

Figura 7. Cache de mapeamento direto. A localização admitida para um


dado bloco é determinada pelo seu endereço.

Como acontece em qualquer arquitectura de cache, a dimensão do bloco pode ser superior à
dimensão dos dados a transferir. A figura seguinte apresenta uma cache de mapeamento
directo com 4096 blocos de 128 bits. Neste caso, são utilizados os bits 3-2 para a
identificação da palavra de 32 bits dentro do bloco de 128 bits.

9
Address

Tag Byte offset


Index Block offset

Tag Data
V

= Mux

Data

Hit

Figura 8. Cache de mapeamento direto. A localização admitida para um


dado bloco é determinada pelo seu endereço.

Cache Associativa por Conjuntos


Se cada bloco pode ser colocado num conjunto restrito de posições de uma cache, esta
designa-se por cache associativa por conjuntos (ou grupos) ou Set Associative Cache. Uma
parte do endereço é utilizada para endereçar um conjunto de blocos na cache. A identificação
de um bloco dentro um conjunto é realizada através da comparação dos restantes bits do
endereço com a etiqueta respectiva. O número de posições admitidas para um bloco dentro
de um determinado conjunto designa-se por número de vias ou associatividade da memória
cache. A figura seguinte representa uma cache associativa por conjuntos de 4 vias, com
16384 blocos de 64 bits.

10
31 ….……...… 16 15 ..……......... 3 2 .. 0
Address
15 14 3
Tag Offset
Index

Tag Data Tag Data Tag Data Tag Data


V V V V

4096 sets
15 15 15 15

= = = =
64 Data

Figura 9. Cache associativa por conjuntos de 4 vias. A cache está


organizada em 4096 conjuntos. Cada conjunto integra 4 blocos,
cada um associado à sua etiqueta identificadoras.

Independentemente da arquitetura, uma memória cache pode sempre ser especificada pela
sua associatividade (K), pelo número de conjuntos (NSets) e pela dimensão do bloco de
dados (BS).

Quando K=1, a memória cache em questão possui uma arquitectura de mapeamento direto.

Quando NSets=1, trata-se de uma memória completamente associativa.

Sempre NSets>1 e K>1, a memória cache pode ser identificada como uma memória cache
com associação por conjuntos de K vias (K-way Set Associative Cache).

A capacidade total da memória cache (MC) pode ser determinada por

M C =K×NSets×BS

11
4. Operação

Políticas de Leitura
Durante um ciclo de leitura de dados da memória, a memória cache é consultada para
verificar se o bloco pretendido se encontra ou não presente.

No caso do bloco pretendido ser encontrado na memória cache, designa-se este


acontecimento como um Hit e o bloco é simplesmente transferido da memória cache para o
processador. Neste processo não é necessária a intervenção da memória principal e a
operação é concluída no tempo de resposta da memória cache.

No caso do bloco pretendido não ser encontrado na memória cache, designa-se o


acontecimento como um Miss e torna-se necessária a consulta da memória principal para a
conclusão processo de leitura. Neste caso, pode ser implementado um de dois
procedimentos distintos:

Read-Through ou Forward: O bloco pretendido é lido diretamente da memória principal


para o processador e para a memória cache.

Main
CPU Cache
memory

Figura 10. Processo de Read-Through. A leitura é realizada em simultâneo, da


memória principal para a cache e para o processador.

Este processo é eficiente e bem adapapado às situações em que a largura do barramento de


memória coincide com a dimensão do bloco da cache. As situações em que são necessários
vários ciclos de acesso à memória para preencher um bloco da cache completo não permitem
tirar partido da transferência simultânea para a cache e para o processador.

No-Read-Through: O bloco pretendido é lido da memória principal para a memória cache.


Em seguida, os dados solicitados são transferidos da memória cache para o processador.
Esta polica de leitura em caso de falha pode ser implementada independentemente das
difereças entre as larguras do barrmento de memória, bloco da cache de palavra requerida
pelo processor.

12
Main
CPU Cache
memory

Figura 11. Processo de leitura sem Read-Through. A leitura é realizada da memória


principal para a memória cache e só depois da cache para o processador.

Concorrência
Normalmente, a consulta à memória principal só é iniciada se e quando for verificado o Miss
na memória cache, o que corresponde a um procedimento sequencial de consulta das
memórias cache e principal. No entanto, para acelerar o processo de leitura em caso de Miss,
é possível iniciar a consulta da memória principal de forma concorrente com a consulta da
memória cache.

A implementação concorrente permite concluir o processo de leitura em caso de miss mais


cedo do que as implementações sequenciais. No entanto, a implementação de concorrência
obriga a iniciar o processo de leitura da memória principal antes de ser detetado o miss, o
que leva ao arranque deste processo até para as situações de hit. Esta técnica implica uma
maior complexidade de implementação e um maior congestionamento do barramento de
memória já que este vai ser requisitado em todos os acessos à cache.

13
No Read-Through Sequencial
HT HT
Cache
MP=ML+ HT
ML
Memória

No Read-Through Concorrente
HT HT
Cache
MP=ML
ML
Memória

Read-Through Sequencial
HT
Cache
MP=ML
ML
Memória

Read-Through Concorrente
HT
Cache
MP=ML−HT
ML
Memória

Figura 12. Miss Penalty. A penalização temporal imposta pela ocorrência de um miss
depende da politica de escrita e da sua aplicação.

Caches Non-Blocking
Normalmente uma cache só trata um pedido de cada vez. Se os dados não são encontrados
na cache (miss), é realizada uma consulta à memória principal. Durante esta consulta, a cache
fica normalmente bloqueada (blocked), indisponível para atender outros pedidos.

Numa cache Non-blocking não se verifica este bloqueio. Após detetado um miss, e durante a
consulta à memória principal, a cache pode atender outros pedidos e satisfazê-los em caso
de hit.

Esta técnica foi introduzida pela Intel para a cache L2 do Pentium Pro e do Pentium II. Exigiu
o desenho do processador com dois barramentos distintos ( DIB - Dual Independent Bus), de
forma a permitir a comunicação direta entre o processador e a cache L2, sem utilizar o
barramento da memória principal.

14
Políticas de Escrita
Durante a execução de um programa típico, as operações de leitura representam cerca de
90% dos ciclos de memória. As memórias cache são essencialmente vocacionadas para a
otimização dos acessos de leitura. No entanto, mesmo que a cache não permita obter
vantagens significativas associadas a operações de escrita, o procedimento utilizado nestas
operações tem de ter a conta a existência da cache.

Com a utilização de memórias cache, alguns dados são temporariamente armazenados em


duplicado, na memória principal e na cache. O procedimento de alteração dos dados, (escrita
para a memória) tem que prever a possibilidade de existência destes duplicados e garantir a
consistência global entre as diversas versões de um bloco.

O processo e escrita é sempre iniciado pela consulta à memória cache de forma a verificar a
presença do bloco sobre o qual se pretende efectuar a operação de escrita. O procedimento a
aplicar no processo de escrita depende da confirmação da presença do bloco de destino na
memória cache (Hit) ou da sua ausência (Miss).

Políticas de Escrita num Hit


Existem dois procedimentos principais (políticas) que podem ser aplicados durante as
operações de escrita para memória, quando se verifica a presença do bloco de destino na
memória cache (Hit): Write-Through e Write-Back

Write-Through
A escrita é realizada simultaneamente para a cache e para a memória principal.

Main
CPU Cache
memory

Figura 13. Processo de escrita Write-Through. A escrita é realizada imediatamente


para a cache e para a memória principal.

Este procedimento é de fácil implementação e garante naturalmente a consistência dos


dados mesmo em sistemas com memória partilhada por vários processadores e
independentemente de se utilizarem caches partilhadas ou caches locais para cada
processador.

A aplicação desta política de escrita não permite tirar partido da existência da memória cache
nem do facto do bloco de destino da escrita se encontrar copiado na cache. O tempo

15
necessário para realizar uma operação de escrita será idêntico ao que se obteria sem
existência da memória cache. Escritas sucessivas do mesmo bloco provocam igual número
de ciclos de escrita para a memória principal, mesmo que desnecessários.

Write-Back
A escrita é realizada apenas para o bloco localizado na memória cache. Simultaneamente é
marcado um bit sinalizador que classifica o bloco como modificado ( dirty). O bloco escrito só
é copiado para a memória principal se e quando for retirado da memória cache.

Main
CPU Cache
memory

Figura 14. Processo de escrita Write-Back. A escrita é realizada imediatamente


apenas para a cache. A copia para a memória principal só acontece
quando se justificar.

Com este procedimento, as operações de escrita são realizadas à velocidade da memória


cache, sem necessidade de espera pela resposta da memória principal. Várias escritas
sucessivas para o mesmo bloco podem resultar em apenas uma escrita para a memória
principal.

A aplicação desta política exige a disponibilidade de um bit de sinalização associado a cada


bloco para a marcação do estado do bloco como modificado ( dirty). Adicionalmente, tem que
ser utilizado um controlador de cache específico, capaz de garantir que todos os blocos
marcados como dirty são adequadamente copiados para a memória principal.

Uma vez que durante o intervalo entre uma escrita para a cache e a respectiva cópia para a
memória principal, não existe coerência entre as duas versões do mesmo bloco, é imperativa
a utilização de protocolos e controladores adicionais para garantir a consistência global em
sistemas em que vários processadores possam partilhar a memória principal sem
partilharem a memória cache.

Políticas de Escrita num Miss


Durante uma operação de escrita, se o bloco a actualizar não for encontrado na memória
cache (Miss), pode ser aplicado o procedimento de Write-Allocate. Quando não se opta pela
aplicação deste procedimento, o funcionamento da cache num Miss pode ser designado
como No-Write-Allocate ou Write-Around.

16
Write-Allocate
É alocado espaço na memória cache para o bloco pretendido. Normalmente, o bloco original
é copiado da memória principal para a memória cache, o que introduz um ciclo de leitura.
Nos casos em que a escrita corresponde à totalidade do bloco, pode ser evitada a cópia da
memória. Depois da alocação, aplica-se o processo de escrita definido para uma situação de
Hit.
A colocação do bloco na memória cache obriga normalmente a retirar um dos blocos
armazenados (substituição). Numa cache que use também Write-Back, esta operação pode
implicar a escrita para memória principal do bloco substituído se este se encontrar
modificado (Dirty).

No-Write-Allocate
A escrita é realizada sobre a memória principal. O bloco a escrever não é copiado para
memória cache, não sendo necessário efectuar substituições nem a eventual escrita do bloco
substituído para a memória principal.

Combinações de Políticas de Escrita


Qualquer política de escrita num Miss pode ser combinada com qualquer política de escrita
num Hit. No entanto, as caches Write-Back utilizam normalmente Write Allocate de forma a
tentar aplicar os benefícios oferecidos pelo Write-Back a possíveis escritas futuras do
mesmo bloco. A maioria das caches Write-Through aplica No-Write-Allocate uma vez que
futuras operações de escrita do mesmo bloco serão sempre realizadas para a memória
principal.

Write Back Write Through

Write Allocate
● ●

No Write Allocate ●

Figura 15. Combinações de políticas de escrita. As caches Write Back utilizam
normalmente Write Allocate. A maioria das caches Write Through aplica No
Write Allocate.

Na ocorrência de uma operação de escrita, é realizada uma consulta à cache para se


determinar a presença ou ausência do bloco de destino na cache. O procedimento aplicado
em seguida, depende da combinação de políticas definida.

17
Write-Through sem Allocation
Um sistema que combina a política Write-Through em caso de hit com a política No-Write-
Allocation em caso de miss, implementa o procedimento descrito no diagrama da figura
seguinte. No caso de ser detetada a presença do bloco de destino na cache (hit), a escrita é
realizada para o bloco presente na cache e para a memória principal. No caso do bloco não
ser encontrado na cache, a escrita é efetuada apenas para a memória principal.

Write

Yes
Hit ?

No

Write new data to


cache block

Write new data to


memory

End

Figura 16. Processo de escrita com Write-Through e No-Allocation. Num caso de


escrita com Hit, um sistema de memória do tipo Write-Thtough com No-
Allocation escreve para a cache e para a memória principal. Em caso de
Miss, o bloco é apenas copiado para a memória principal.

Write-Back com Allocation


As caches que combinam Write-Back com Allocation aplicam um procedimento de escrita
como se ilustra no diagrama seguinte. No caso de set verificado um hit, a escrita é apenas
efetuada para o bloco presente na cache. Em caso de falha, é realizada uma leitura da
memória principal para que o bloco seja carregado para a cache. Simultaneamente, é
selecionada e alocada uma linha da cache para receber o novo bloco. O bloco anteriormente
residente na linha da cache selecionada pode ter de ser copiado para a memória principal, se
se encontrar marcado como modificado (dirty).

18
Write

Yes
Hit ?

Allocation
No

Choose cache block


Write-Back

Yes
Dirty ?

No Save cache block


to memory

Write new data to


cache block

End

Figura 17. Processo de escrita com Write-Back e Allocation. Num caso de Hit, as
caches Write-Back com Allocation escrevem apenas para a cache. Em caso
de Miss, o bloco é transferido da memória principal para a cache
(Allocation). No caso de o bloco substituído neste processo se encontrar
dirty, este é copiado para a memória principal (Write-Back).

Políticas de substituição
Numa situação normal de funcionamento, uma memória cache encontra-se completamente
utilizada.

Quando se decide trazer um novo conjunto de dados para memória cache, é necessário
proceder à remoção de um dos blocos armazenados. A política de substituição define o
processo de seleção do bloco a retirar, de entre aqueles que se encontram em posições
elegíveis para colocação do novo bloco.

As políticas mais populares de substituição de blocos em memórias caches são: Random,


LRU, pLRU e FIFO.

Random
É substituído um bolo escolhido aleatoriamente. É de fácil implementação mas pode resultar
na substituição de blocos muito procurados, reduzindo a eficiência da cache.

19
LRU (Least Recently Used)
É selecionado para substituição o bloco cuja última utilização tenha ocorrido há mais tempo.
Permite normalmente resultados interessantes de eficiência. Requer a utilização de espaço
de armazenamento adicional para manter o estado de utilização de cada bloco. A
implementação natural deste algoritmo utiliza log 2(K) bits de memória adicional para cada
bloco o que corresponde a K*log2(K) bit para cada conjunto (set). Implementações otimizadas
podem utilizar apenas log2(K!) bits de memória adicional para cada conjunto (set).

pLRU (Pseudo Least Recently Used)


Uma vez que a implementação em Hardware da política LRU é dispendiosa, são
frequentemente aplicadas simplificações genericamente designadas por Pseudo LRU. A
simplificação mais vulgar (Tree-pLRU) utiliza uma árvore binária de decisão para eleger o
bloco a substituir. Necessita apenas de K-1 bits para cada conjunto (set).

A figura seguinte apresenta a árvore de decisão utilizada para uma cache de 4 vias. São
utilizados 3 bits para manutenção da informação de estado (h0, h1 e h2).

0 1
h0

0 1 0 1
h1 h2

Line 0 Line 1 Line 2 Line 3

Figura 18. Árvore de decisão Tree-pLRU. A política de substituição Tree-pLRU utiliza


uma árvore de decisão binária com K-1 bits para cada conjunto (set) para
eleger o bloco a substituir.

Sempre que um dos blocos é referido (acedido), é atualizado o conjunto de bits de acordo
com a tabela de atualização apresentada. Apenas são atualizados os bits de estado
relevantes para o bloco referido. Os restantes bits são mantidos com o estado anterior.

Utilização Atualização

20
Estado Bloco a substituir Bloco referido Próximo estado
00x Line 0 Line 0 11_
01x Line 1 Line 1 10_
1x0 Line 2 Line 2 0_1
1x1 Line 3 Line 3 0_0

Figura 19. Tabelas de decisão e de atualização Tree-PLRU. Na tabela de decisão,


“x” indica don’t care. Na tabela de atualização, ”_” significa sem alteração.

FIFO (First In First Out)


Utiliza uma selecção sequencial da posição de colocação de um novo bloco, substituindo
sempre o que se encontra na memória cache há mais tempo. Necessita da manutenção da
informação sobre o último bloco inserido. Para isso são utilizados log2(K) bits para cada
conjunto.

Métricas
A principal métrica para avaliação do desempenho de sistemas de memória é o tempo médio
de acesso à memória (AMAT) que depende dos tempos envolvidos na leitura de dados da
cache e da memória e da taxa de falhas na cache.

AMAT =HT ×HR + MT ×MR=HT + MR×MP

A determinação precisa desta métrica requer o conhecimento prévio sobre a arquitectura do


sistema de cache, os tempos de resposta dos componentes mas também o comportamento
do específico do programa uma vez que a taxa de falhas é influenciada pela proximidade dos
acessos à memória.

O conjunto total de falhas (NM) numa cache pode ser decomposto em 3 componentes (3Cs):
Compulsory (CompM), Capacity (CapM) e Conflit (ConfM).

NM =CompM +CapM +ConfM

Falhas obrigatórias (Compulsory Misses)


Sempre que um dado é solicitado pela primeira vez ocorre uma falha na cache porque o dado
nunca foi transferido previamente para a cache. As falhas deste tipo ocorrem sempre para
todos os dados entrados no sistema e não podem ser reduzidas pelo alargamento da cache.

21
A taxa de falhas obrigatórias é a taxa de falhas que ocorre mesmo com cache de dimensão
exagerada ou até infinita.

Falhas de capacidade (Capacity Misses)


As falhas por falta de capacidade da cache ocorrem devido às limitações impostas pela
dimensão da cache e que não podem ser evitadas com melhoramentos da sua organização.
Numa cache completamente associativa e gerida de forma ideal, apenas ocorrem falhas
obrigatórias e falhas de capacidade. As falhas de capacidade podem ser reduzidas através do
aumento da dimensão da cache.

Falhas por conflito (Conflit Misses)


As falhas por conflito ocorrem devido às restrições impostas pela organização ou arquitetura
da memória cache. Este tipo de falhas pode ser evitado se a organização da cache for
melhorada, mesmo mantendo a sua dimensão.

A tabela seguinte resume as principais variáveis que influenciam o desempenho de uma


cache.

Número de acessos Número de tentativas de leitura da memória


N
Memory accesses desencadeadas pelo processador.

Número de falhas Número de tentativas de acesso que não foram


NM
Misses satisfeitas pela memória cache.

Número de acertos Número de tentativas de acesso satisfeitas pela


NH
Hits memória cache.

Taxa de sucessos
HR Número de hits / número de acessos
Hit Rate
Taxa de falhas número de misses / número de acessos.
MR
Miss Rate MR = 1-HR

Tempo de sucesso
HT tempo de resposta da cache num hit.
Hit time
Tempo de falha
MT tempo de resposta da cache num miss.
Miss time
Latência da memória Tempo de resposta do nível de cache/memória
ML
Memory latency seguinte.

Penalidade por falha


MP Penalização temporal implicada pelo miss
Miss penalty
Tempo médio de acesso AMAT = HT + MR*MP
AMAT
Average memory access time AMAT = HT*HR + MT*MR

22
Figura 20. Métricas básicas de memórias caches.

Figura 21. Componentes da taxa de falhas. A taxa de falhas de uma memória cache
pode ser decomposta em 3 componentes.

5. Caches Multi-nível
Num sistema com apenas um nível de cache, a penalidade por falha (MP) pode ser
determinada a partir da latência da memória principal, num sistema de cache multi-nível, a
penalização em caso de falha de um nível de cache pode ser determinado a partir da latência
do nível seguinte. Assumindo leituras sequenciais por Read-Through, a penalização por falha
na cache nível i pode ser aproximada pelo tempo médio de acesso ao nível seguinte (i+1) da
hierarquia de memória.

MPi = AMATi+1 =HT i+ 1+ MR i+1 ×MPi+1

Nestes casos, MRi+1 representa a taxa local de falhas ocorridas na cache no nível i+1 que
pode ser avaliada como o número de falhas ocorridas sobre o número de tentativas de aceder
a este nível. Uma vez que um nível de cache que não seja o inicial só é consultado quando
ocorre uma falha no nível anterior, o número de tentativas no nível corresponde também ao
número de falhas do nível anterior.

23
NM i+1 NM i+1
MRi+1= =
N i+1 NM i

Normalmente, o número de tentativas de aceder a qualquer nível i+1 é sempre diminuído


pelos sucessos dos nível inferiores pelo que a taxa de falhas poderá ser superior à verificada
nos níveis inferiores. É também possível definir uma taxa global de falhas no nível i (MRgi)
como sendo a razão entre o número de falhas ocorridas neste nível e o número total de
tentativas de aceder à hierarquia de memória, desde o seu nível mais baixo.

NM i i
MRgi = =MR 1 ×MR2×...×MRi =∏ MRi
N1 i=1

Define-se também a taxa global de falhas (MRG) de um sistema ou de uma hierarquia de


memória com n níveis de cache como sendo a taxa de falhas global avaliada no seu último
nível de cache (penúltimo nível da hierarquia).

n
MRG=MRg n=∏ MRi
i=1

O tempo médio de acesso a uma hierarquia de memória com n níveis de cache pode ser
determinado a partir das taxas de falhas e das latências de cada um dos níveis.

AMAT =HT 1 + MR1×MP 1=HT 1 + MR 1×( HT 2+ MR 2×MP 2)


=HT 1 + MR1×( HT 2 + MR 2×(HT 3+ MR 3×MP 3))
=HT 1 + MR1×( HT 2 + MR 2×HT 3 + MR 2×MR3 ×MP3 )
=HT 1 + MR1×HT 2+ MR 1×MR 2×HT 3 + MR 1×MR 2×MR3 ×MP3
n+1 i−1 n +1

i=1
[ k=1
]
=∑ HT i×∏ MR k =∑ [ HT i×MRgi−1 ]
i =1

6. Caches Auxiliares

Buffer de Escrita (Write Buffer)


Para agilizar as operações de escrita em ambientes com caches geridas por Write Through, é
conveniente utilizar uma pequena memória auxiliar designada por Buffer de Escrita ( Write
buffer).

24
Cache
Processor DRAM

Write Buffer
Figura 22. Buffer de Escrita. A escrita é efectuada do processador para a cache e
para o buffer escrita. A cópia do buffer de escrita para a memória principal
é efetuada pela ordem de chegada.

Nesta situação, a escrita é realizada, por Write-Through, do processador para a cache e para
o buffer de escrita em simultâneo. O controlador de memória efetua depois a escrita dos
conteúdos guardados no buffer de escrita para a memória principal.

O buffer de escrita é gerido por uma política do tipo FIFO. As escritas para a memória
principal são efetuadas pela ordem de chegada.

Uma vez que o buffer de escrita necessita de guardar os dados associados ao endereço
respetivo completo, o buffer de escrita pode ser implementado com uma memória
completamente associativa.

Cache de Falhas
A Cache de Falhas ou Miss-Cache é uma pequena memória associativa que colabora coma a
cache principal tentando reduzir as falhas devidas a conflitos da cache principal. Justifica-se
sobretudo para acompanhar caches de mapeamento direto e poder ser muito menor do que
a cache principal.

Em cada ciclo de leitura, ambas as caches são consultadas em paralelo. Se ocorrer um


sucesso em qualquer das caches, a leitura é feita da cache e posição vencedora.

Se ocorrerem falhas em ambas as caches, considera-se que se verificou uma falha ( Miss) no
conjunto das duas caches. Nesta situação, bloco é lido da memória para a cache principal e
para a Miss-cache.

25
Address Data
from processor to processor

Direct-mapped
cache (D-M cache)
tag data
Data
from Memory
MRU entry
tag and comparator Data block
tag and comparator Data block Fully-associative
tag and comparator Data block miss-cache
tag and comparator Data block
LRU entry

Figura 23. Cache de Falhas. O bloco solicitado é procurado na cache de falhas e na


cache principal simultaneamente. No caso de não ser encontrado, é
transferido da memória principal para ambas as caches.

Cache de Vítimas
Tal como a Cache de Falhas, a Cache de Vítimas ou Victim-Cache é uma pequena memória
associativa que colabora coma a cache principal tentando reduzir as falhas devidas a conflitos
da cache principal. Justifica-se sobretudo para acompanhar caches de mapeamento direto e
poder ser muito menor do que a cache principal.

Em cada ciclo de leitura, ambas as caches são consultadas em paralelo. Se ocorrer um


sucesso em qualquer das caches, a leitura é feita do bloco encontrado.

Se ocorrerem falhas em ambas as caches, considera-se que se verificou uma falha ( Miss) no
conjunto das duas caches. Nesta situação, bloco é lido da memória para a cache principal. A
alocação de um novo bloco na cache pode exigir a substituição de blocos. Os blocos
substituídos da cache principal (vítimas da cache) são transferidos para a Victim-cache. Os
blocos substituídos na Victim-cache são eliminados.

26
Address Data
from processor to processor

Direct-mapped
cache (D-M cache)
tag data
Data
from Memory
MRU entry
tag and comparator Data block
tag and comparator Data block Fully-associative
tag and comparator Data block victim-cache
tag and comparator Data block
LRU entry

Figura 24. Cache de Vítimas. O bloco solicitado é procurado na cache de vítimas e na


cache principal simultaneamente. No caso de não ser encontrado, é
transferido da memória principal para a cache principal. O bloco substituído
é abrigado na cache de vítimas.

27
7. Exercícios

Exercício 1.
Um fabricante de módulos de processamento pretende adicionar à sua linha de
processadores uma memória cache associativa por conjuntos com 4 vias, que permita o
armazenamento de 256 blocos de 128 bits de dados e que possa ser utilizada com escritas
Write-Back com Allocation e substituições pseudo LRU.

Sabendo que os processadores em causa possuem barramentos de endereços de 32 bits,


barramento de dados de 32 bits e que utilizam endereçamento ao Byte, indique qual deverá
ser, para esta cache:

a) A capacidade útil da cache, em Bytes.

b) O número de comparadores.

c) O número de bits utilizados na indexação.

d) A dimensão das etiquetas.

e) A dimensão total da cache.

Exercício 2.
Durante a execução de um programa numa máquina com 2 níveis de cache, verificaram-se
10000 referências à memória, 800 falhas ( misses) na cache de nível 1 e 200 falhas (misses)
na cache de nível 2.

a) Quantos acessos à memória principal foram realizados neste período?

b) Determine as taxas de falhas (miss rate) locais e globais para ambas as caches.

c) Determine o tempo médio de acesso à memória, sabendo que os tempos de leitura da


memória principal e de cada uma das caches em caso de sucesso ( Hit), são os apresentados
na tabela seguinte.

Memória Hit Time /Tclk


Cache Nível 1 1
Cache Nível 2 10
Memória principal 200

28
Exercício 3.
Um sistema computacional com um período de clock de 1.25 ns, utiliza uma memória cache
com resposta em 1 ciclo de clock e uma memória principal com tempo de resposta de 75 ns.

Assumindo uma política de leitura do tipo Read-Through Sequencial e uma taxa de sucesso
(Hit Rate) de 98% na memória cache, qual deverá ser o tempo médio expetável de acesso à
memória?

Exercício 4.
Um sistema computacional com um período de clock de 1.25 ns, utiliza uma memória cache
nível 1 com tempo de resposta de 1.1 ns, uma memória cache nível 2 com tempo de resposta
de 10 ns e uma memória principal com tempo de resposta de 75 ns.

Assumindo políticas de leitura do tipo Read-Through Sequencial e taxas de sucesso (Hit


Rate) de 98% na memória cache nível 1 e de 90% na cache nível 2, qual deverá ser o tempo
médio expectável de acesso à memória?

Soluções
Ex1.
a) MC = NB * BS = 256*128/8 = 4096 Bytes

b) Ncomparadores = K = 4

c)

NB 256
NSets= = =64
K 4

Idx=log 2 ( NSets)=log2 (64)=6 bits

d)

BS
BO=log 2 ( AddrUnit )=log ( 1288 )=4 bits
2

Tag= Addr−Idx−BO=32−6−4=22 bits

29
e)

Tags=Tag×NBlocks=22×256=5120+512=5632 bits=704 Bytes

ValidBits=1×NBlocks=256 bits=32 Bytes

DirtyBits=1×NBlocks=256 bits=32 Bytes

LRUBits=(K−1)×NSets=3×64=192 bits=24 Bytes

TotalSize=M C +Tags+ValidBits+ DirtyBits+ LRUBits=


=4096+704 +32+32+24=4888 Bytes

Ex2.
a)
N mem=NM 2=200
b)
NH 1 =N 1−NM 1=10000−800=9200

NH 2 =N 2−NM 2=NM 1−NM 2=800−200=600

NM 1 800
MR1 =MRg1= = =8 %
N 1 10000

NM 2 NM 2 200
MR2 = = = =25 %
N2 NM 1 800

NM 2 ou
MRg2= =200 /10000=2 %
N1

MRg2=MR 1×MR 2=8 %×25 %=2 %


c)
MP2=T mem =200⋅T clk

MP1=HT 2+ MR 2×MP 2=10+0.25×200=60⋅T clk

AMAT =HT 1+ MR1×MP 1=1+0.08×60=5.8⋅T clk

30
Ex3.

MP=ML=75 ns

HT=1×T clk =1×1.25=1.25 ns

MR=1−HR=1−0.98=0.02

AMAT =HT + MR×MP=1.25+0.02×75=2.75 ns

Ex4.

MP2=ML=75 ns

HT 2=10 ns

MR2 =1−HR 2=1−0.90=0.10

MP1=HT 2+MR 2×MP 2=10+0.1×75=17.5 ns

HT 1=1×T clk =1×1.25=1.25 ns

MR1 =1−HR 1=1−0.98=0.02

AMAT =HT 1 +MR1×MP 1=1.25+0.02×17.5=1.6 ns

31

Você também pode gostar