ORGANIZAÇÃO E
ARQUITETURA DE
COMPUTADORES I
Aula 07
INTRODUÇÃO
Os programas gastam a maior parte do tempo
acessando a memória.
Programadores gostariam de dispor de quantidade
ilimitada de memória com acesso instantâneo.
O projeto do sistema de memória segue alguns
princípios os quais tentam dar a ilusão ao
programador de que ele dispõe de uma grande
quantidade de memória com tempo de acesso
pequeno.
INTRODUÇÃO
Exemplificando...
Suponha que você seja um estudante fazendo um trabalho sobre
os importantes desenvolvimentos históricos no hardware dos computadores.
Você descobre livros falando sobre vários computadores
importantes, mas nenhum fala sobre o EDSAC.
Você precisa voltar as prateleiras e procurar um livro que fale sobre
o EDSAC.
Ao encontrar o livro que precisa, você volta à sua mesa e continua
a pesquisa com os vários livros a sua frente.
Você gasta muito menos tempo com a pesquisa, tendo os livros já
sobre a mesa, do que se tivesse apenas um livro e precisasse voltar constantemente às estantes para devolvê-lo e pegar outro.
INTRODUÇÃO
Podemos agora fazer uma analogia com a memória.
Assim como você não precisou acessar todos os livros
da biblioteca ao mesmo tempo, com igual probabilidade
um programa não acessa todo o seu código ou dados.
Se um programa precisasse acessar todo o seu código
ao mesmo tempo, seria impossível tornar rápido a
maioria dos acessos à memória e ainda ter memória
grande nos computadores.
Assim como seria impossível você colocar todos os
livros da biblioteca em sua mesa e ainda encontrar o
desejado rapidamente.
INTRODUÇÃO
Esse princípio visto é chamado de princípio da localidade.
O princípio da localidade diz que os programas acessam uma
parte relativamente pequena do seu espaço de endereçamento em qualquer instante do tempo.
Há dois tipos diferentes de localidade:
Localidade temporal – se um item é referenciado, ele tenderá a ser
referenciado em breve.
A maioria dos programas contém laços (instruções e dados do laço tendem a ser acessados de maneira repetitiva).
Localidade espacial – se um item é referenciado, os itens cujos
endereços estão próximos tenderão a ser referenciados em breve.
Os itens de uma matriz e de registros nos programas, por exemplo, são armazenados de maneira seqüencial.
INTRODUÇÃO
Tiramos vantagem do princípio da localidade
implementando a memória de um computador como
uma hierarquia de memória.
Consiste em múltiplos níveis de memória com diferentes
velocidades e tamanhos.
As memórias mais rápidas são mais caras por bit do que as
INTRODUÇÃO
Três tecnologias são usadas hoje na construção das
hierarquias de memória:
Memória principal (implementada por meio de DRAM);
Memórias cache (implementadas por meio de SRAM); e
Disco magnético.
INTRODUÇÃO
O tempo de acesso e o preço por bit variam muito
INTRODUÇÃO
Devido a essas diferenças no custo e no tempo de
acesso, é vantajoso construir memória como uma
hierarquia de níveis.
Velocidad
e
Tamanho
Custo
(US$/bit)
Tecnologia
atual
Mais rápida
Menor
Mais alto
SRAM
DRAM
Mais lenta
Maior
Mais baixo
Disco
Magnético
CPU
Memória Memória
INTRODUÇÃO
O sistema de memória é organizado como uma
hierarquia:
Um nível mais próximo do processador em geral é um
subconjunto de qualquer nível mais distante, e todos os dados são armazenados no nível mais baixo.
Além disso, conforme nos afastamos do processador, os
INTRODUÇÃO
Definições:
A princípio, a hierarquia de memória pode ter qualquer
número de níveis.
Os dados são copiados sempre entre dois níveis adjacentes
(i e i + 1, onde i está mais próximo do processador).
Chamaremos i de superior (mais próximo do processador) e i
INTRODUÇÃO
Definições:
Bloco – unidade de informação mínima que pode estar
INTRODUÇÃO
Definições
Se a informação solicitada pelo processador estiver presente
em algum bloco do nível superior, ocorre um acerto.
Se a informação solicitada pelo processador não puder ser
encontrada no nível superior, a tentativa de encontrá-la gera uma falha.
Quando ocorre uma falha, o nível inferior é então acessado
para recuperar o bloco com os dados requisitados.
Exemplificando com a analogia da biblioteca, se você não
encontra o livro que precisa em cima da mesa, você vai até as estantes para encontrá-lo.
INTRODUÇÃO
Definições
A taxa de acertos corresponde à fração dos acessos à
memória encontrados no nível superior (com freqüência é usada como medida de desempenho da hierarquia de memória).
A taxa de falhas (1 – taxa de acertos) é a proporção dos
acessos à memória não encontrados no nível superior.
Tempo de acerto é o tempo necessário para acessar o nível
superior da hierarquia, que inclui o tempo necessário para determinar se o acesso é um acerto ou uma falha (tempo necessário para consultar os livros na mesa).
INTRODUÇÃO
Penalidade por falha é o tempo para substituir um bloco no
nível superior pelo bloco correspondente do nível anterior que contém a informação desejada, mais o tempo para transferir esse bloco para o processador.
Como o nível superior é menor e mais rápido, o tempo de
acerto será muito menor do que o tempo para acessar o próximo nível da hierarquia.
O sistema de memória é um importante fator na
determinação do desempenho de um computador,
pois todos os programas gastam muito do seu tempo
acessando a memória.
PRINCÍPIOS BÁSICOS DE CACHE
Cache – em inglês, lugar seguro para esconder ou
guardar algo.
Nome usado para designar o nível de memória entre o
processador e a memória principal.
Foi usado pela primeira vez pela máquina que
introduziu este nível de memória.
A cache explora o princípio da localidade.
Hoje em dia usa-se o nome cache para designar
qualquer memória que explore o princípio da
localidade.
PRINCÍPIOS BÁSICOS DE CACHE
Assumiremos as seguintes características de um
sistema de memória extremamente simples:
O processador sempre requisita uma única palavra;
Existe apenas um nível de memória cache (L1); e
PRINCÍPIOS BÁSICOS DE CACHE
A figura abaixo mostra essa cache simples, antes e
depois de requisitar um item de dados que não está
inicialmente na cache:
PRINCÍPIOS BÁSICOS DE CACHE
Como sabemos então se o item de dados está na
cache? Se ele estiver, como encontrá-lo?
Cada word pode ficar exatamente em um lugar na cache,
então é fácil encontrá-la se ela estiver lá.
Atribui-se um endereço com base no endereço da palavra na
memória principal.
Mapeamento direto – estrutura da cache onde cada local da
memória é mapeado diretamente para um local exato na cache.
A maioria das caches que usa mapeamento direto o faz usando o
PRINCÍPIOS BÁSICOS DE CACHE
Se o número de entradas da cache for uma potência
de dois, então o módulo pode ser calculado
simplesmente
usando
os
log
2bits
menos
significativos.
A cache pode então ser acessada diretamente com os
bits menos significativos.
Por exemplo, em uma cache com oito words, um
endereço X é mapeado para a word de cache X
módulo 8. Ou seja, os log
2(8) = 3 bits menos
PRINCÍPIOS BÁSICOS DE CACHE
Se uma “entrada” da cache pode armazenar o
conteúdo de diversos endereços da memória, como
identificar se o dado armazenado na cache
corresponde ao solicitado? Como sabermos se o dado
solicitado está na cache ou não?
Solução: atribuir à cache um conjunto de rótulos (tags).
Os rótulos são usados em conjunto com o endereço do
mapeamento, de modo a compor o endereço completo, com relação à memória principal.
O rótulo precisa conter apenas a parte superior do endereço,
correspondente aos bits que não são usados como índice para a cache.
PRINCÍPIOS BÁSICOS DE CACHE
E como reconhecer se um bloco da cache possui uma
informação válida? (Quando um processador é
iniciado, por exemplo, a cache não tem dados válidos
e os campos de tag não terão significado)
Solução: incluir um bit de validade.
Se o bit de validade = 0, a informação contida naquele bloco
PRINCÍPIOS BÁSICOS DE CACHE
Acessando uma cache (para leitura):
PRINCÍPIOS BÁSICOS DE CACHE
2. Referência ao endereço 10110: falhaPRINCÍPIOS BÁSICOS DE CACHE
2. Referência ao endereço 10110: falha: tratamento da falha
Tratamento da falha: buscar no nível inferior (neste caso, a memória principal) o bloco com endereço 10110.
PRINCÍPIOS BÁSICOS DE CACHE
3. Referência ao endereço 11010: falhaPRINCÍPIOS BÁSICOS DE CACHE
3. Referência ao endereço 11010: falha: tratamento da falha
Tratamento da falha: buscar no nível inferior (neste caso, a memória principal) o bloco com endereço 11010.
PRINCÍPIOS BÁSICOS DE CACHE
4. Referência ao endereço 10000: falhaPRINCÍPIOS BÁSICOS DE CACHE
4. Referência ao endereço 10000: falha: tratamento da falha
Tratamento da falha: buscar no nível inferior (neste caso, a memória principal) o bloco com endereço 10000.
PRINCÍPIOS BÁSICOS DE CACHE
5. Referência ao endereço 00011: falhaPRINCÍPIOS BÁSICOS DE CACHE
5. Referência ao endereço 00011: falha: tratamento da falha
Tratamento da falha: buscar no nível inferior (neste caso, a memória principal) o bloco com endereço 00011.
PRINCÍPIOS BÁSICOS DE CACHE
6. Referência ao endereço 10010: falhaPRINCÍPIOS BÁSICOS DE CACHE
6. Referência ao endereço 10010: falha: tratamento da falha
Tratamento da falha: buscar no nível inferior (neste caso, a memória principal) o bloco com endereço 10010, escrevendo-o na posição 010 da cache.
PRINCÍPIOS BÁSICOS DE CACHE
Um endereço referenciado é dividido em:
Um índice de cache, usado para selecionar o bloco;
Um campo tag, usado para ser comparado com o valor do
campo tag da cache.
20 bits podem ser usados para serem comparados com a tag.
Se a tag e esses 20 bits forem iguais e o bit de validade for 1, então a requisição é um acerto, caso contrário, ocorre uma falha.
Os dois campos juntos especificam de modo único o
PRINCÍPIOS BÁSICOS DE CACHE
Tratando falhas de cache
O Bloco de Controle deve tanto detectar quanto processar a
falha (buscando os dados na memória principal ou em outra cache imediatamente abaixo na hierarquia).
Se a cache informar um acerto:
O processamento segue (como se a informação tivesse sido
PRINCÍPIOS BÁSICOS DE CACHE
Se a cache informar uma falha: O processador deve ser parado;
Um controlador separado ajuda no tratamento das falhas geradas
no acesso à cache, comandando a busca da informação (bloco) na memória principal ou na cache de próximo nível.
Uma vez que o dado tenha sido obtido, a execução é reiniciada no
ciclo que gerou a falha no acesso a cache.
O processamento de uma falha cria uma parada no
processamento similar às paradas do pipeline: todos os registradores temporários e visíveis ao programador são congelados, enquanto a informação é transferida da memória.
PRINCÍPIOS BÁSICOS DE CACHE
Tratando escritas
As escritas funcionam um pouco diferente.
Suponha que na execução de uma instrução store o dado
seja escrito somente na cache de dados. Isto causará uma inconsistência, pois após a escrita na cache, a memória principal terá um valor diferente daquele que foi escrito na cache.
Write-trough: uma solução é escrever o dado tanto na cache
quanto na memória principal.
Embora este esquema trate das escritas de maneira muito
PRINCÍPIOS BÁSICOS DE CACHE
Toda escrita faz com que os dados sejam escritos na memória
principal, o que leva muito tempo.
Solução: usar um buffer de escrita:
Ele armazena o dado enquanto ele aguarda para ser escrito na memória.
Após escrever o dado na cache e no buffer de escrita, o processador pode
continuar a execução das instruções.
Quando a escrita na memória principal é concluída, a entrada no buffer de
escrita é liberada.
Se o buffer de escrita estiver cheio quando o processador tiver que
executar uma instrução de escrita, o processador precisa parar, até que haja posição disponível no buffer.
Se a velocidade da memória para completar as escritas for menor que a
taxa à qual o processador está gerando as escritas, nenhum buffer (por maior que seja) conseguirá resolver o problema.
PRINCÍPIOS BÁSICOS DE CACHE
Uma alternativa para um esquema write-trough é um
esquema chamado write-back.
Neste esquema, quando ocorre uma escrita, o novo valor é
escrito apenas no bloco da cache.
O bloco é escrito na memória principal somente quando ele
tiver que ser substituído na cache.
Este esquema pode aumentar o desempenho,
principalmente quando o processador puder gerar escritas tão rapidamente quanto estas puderem ser tratadas pela memória principal.
UMA CACHE DE EXEMPLO: O
PROCESSADOR INTRINSITY FASTMATH
É um microprocessador embutido veloz que usa a
arquitetura MIPS e uma implementação de cache
simples.
Possui um pipeline de 12 estágios.
Quando está operando na velocidade de pico, o
processador pode requisitar uma word de instrução e
uma word de dados em cada clock.
São usadas caches de instruções e de dados
separadas.
UMA CACHE DE EXEMPLO: O
PROCESSADOR INTRINSITY FASTMATH
As requisições de leitura são simples.
As etapas para uma requisição de leitura para
qualquer uma das caches são as seguintes:
1. Enviar o endereço para a cache apropriada;
2. Se a cache sinalizar acerto, a word requisitada estará
disponível nas linhas de dados.
3. Se a cache sinalizar falha, é enviado o endereço para a
memória principal. Quando a memória retorna com os dados, ele é escrito na cache e depois é lido para atender à requisição.
UMA CACHE DE EXEMPLO: O
PROCESSADOR INTRINSITY FASTMATH
Para requisições de escrita ele oferece write-through e
write-back, deixando a cargo do sistema operacional
decidir qual estratégia usar para cada aplicação.
O buffer de escrita tem capacidade para uma entrada
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
As falhas no acesso às caches são resolvidas pela
memória principal, que é construída com DRAMs.
O tempo de acesso nas DRAMs é maior do que nas
SRAMs, logo é difícil reduzir a latência da busca da
primeira palavra da memória principal.
Mas podemos reduzir a penalidade por falha se
aumentarmos a banda passante da memória principal
para a cache.
Essa redução permite que sejam usados blocos
maiores enquanto a penalidade por falha continua
semelhante àquela para um bloco menor.
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
O processador é conectado à memória por meio de um
barramento.
A velocidade do barramento geralmente é muito
menor do que a do processador, o que afeta a
penalidade de falha.
Vamos definir um conjunto hipotético de tempos de
acesso à memória:
1 ciclo de clock para enviar o endereço;
15 ciclos de clock para cada acesso a DRAM (tempo de
latência do acesso);
1 ciclo de clock para a transferência de uma palavra de
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
1ª opção:
Segue o que temos considerado, a memória possui uma word
de largura e todos os acessos são feitos seqüencialmente.
2ª opção:
Aumenta a largura de banda para a memória alargando a
memória e os barramentos entre o processador e a memória; o que permite acessos paralelos a todas as words do bloco.
3ª opção:
Aumenta a largura de banda alargando a memória mas não o
barramento de interconexão, evitando-se assim o custo da latência de acesso mais de uma vez.
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
Vamos calcular então, para cada um dos casos, o
custo da penalidade por falta versus o número de
bytes transferidos por ciclo de clock.
Penalidade por falha é o tempo para substituir um bloco no
nível superior pelo bloco correspondente do nível anterior que contém a informação desejada, mais o tempo para transferir esse bloco para o processador.
Iremos considerar os tempos de acesso dados
anteriormente e supor que a cache possui bloco com
4 palavras.
PROJETANDO O SISTEMA DE
MEMÓRIA PARA SUPORTAR CACHES
O tamanho da DRAM cresce quatro vezes a cada três
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Reduzindo as falhas de cache com um posicionamento
de blocos mais flexível
Mapeamento direto (estudado até agora):
Um bloco só pode ser colocado em exatamente um lugar da
cache.
“Existe um caminho, mapeado previamente, de qualquer
endereço de bloco da memória principal para uma única posição da cache.”
Veremos que existem diversos tipos de mapeamento, o
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Mapeamento totalmente associativo
É o outro extremo dos tipos de mapeamento;
Um bloco da memória principal pode ser colocado em qualquer
posição da cache;
Para encontrar um determinado bloco todas as entradas da cache
precisam ser pesquisadas, pois um bloco pode estar posicionado em qualquer uma delas;
Para reduzir o tempo de pesquisa ela é feita em paralelo, usando
um comparador para cada entrada da cache.
O custo do hardware é alto: tal esquema é atrativo somente para
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Mapeamento associativo por conjunto
Fica entre os dois tipos anteriores;
Existe um número fixo de posições na cache (no mínimo duas) nas
quais cada bloco pode ser colocado;
Cache associativa por conjunto de n vias: uma cache associativa por
conjunto com n locais para um bloco.
Consiste em diversos conjuntos, cada um consistindo em n blocos.
Cada bloco na memória é mapeado para um conjunto único na cache,
determinado pelo campo índice, e um bloco pode ser colocado em qualquer elemento desse conjunto.
O conjunto que contém o bloco da memória é dado por
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Podemos encarar as estratégias de colocação de blocos na cache
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
O aumento do grau de associatividade resulta, em geral,
na redução da taxa de falhas.
A desvantagem é o aumento do tempo de tratamento do
acerto.
Exemplo:
Temos a nossa disposição três pequenas caches, cada qual com
quatro blocos de uma palavra:
Uma mapeada diretamente;
Outra associativa por conjunto de duas posições; Outra associativa por conjunto de quatro posições;
Encontre o número de falhas em cada uma delas, considerando
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Na cache mapeada diretamente, os blocos serão mapeados
para as seguintes entradas na cache:
Acompanhando o comportamento da cache nas referências
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Na cache associativa por conjunto de 2 posições, os blocos
serão mapeados para os seguintes conjuntos da cache:
Acompanhando o comportamento da cache nas referências
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Na cache associativa por conjunto de 4 posições (isto é,
totalmente associativa), os blocos podem ser mapeados para qualquer posição da cache.
Acompanhando o comportamento da cache nas referências
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Localizando um bloco na cache
Vamos considerar a tarefa de encontrar um bloco em uma cache
que é associativa por conjunto.
Cada bloco em uma cache associativa por conjunto inclui uma tag
de endereço que fornece o endereço do bloco. A tag de cada bloco de cache dentro do conjunto apropriado é verificada para ver se corresponde ao endereço de bloco vindo do processador.
O endereço é decomposto em:
O valor de índice é utilizado para selecionar o conjunto contendo o
endereço de interesse e as tags de todos os blocos no conjunto precisam ser pesquisadas. As tags são pesquisadas em paralelo para ganho de velocidade.
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Escolhendo que bloco substituir
Em uma cache diretamente mapeada, quando ocorre uma
falha o bloco requisitado só pode entrar em exatamente uma posição, por isso o bloco que ocupa essa posição é substituído.
Em uma cache associativa, podemos escolher onde colocar
o bloco requisitado.
Em uma cache totalmente associativa, todos os blocos são
candidatos à substituição;
Em uma cache associativa por conjunto, precisamos escolher
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Esquema LRU
Neste esquema o bloco substituído é aquele que não foi usado a
mais tempo.
A substituição é implementada monitorando quando cada
elemento em um conjunto foi usado em relação a outros elementos no conjunto.
Para uma cache associativa por conjunto de duas vias, o controle
pode ser implementado mantendo um único bit em cada conjunto e definindo o bit para indicar um elemento sempre que ele é referenciado.
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Reduzindo a penalidade de falha usando caches multiníveis
Todos os computadores modernos fazem uso de cache.
Para diminuir a diferença entre as rápidas velocidades de clock dos
processadores modernos e o tempo relativamente longo de acesso as DRAMs, muitos processadores suportam um nível adicional de cache.
Essa cache de segundo nível é acessada sempre que ocorre uma
falha na cache primária.
Se a cache de segundo nível contiver os dados desejados, a penalidade
de falha será menor que o tempo de acesso à memória principal;
Se a cache de segundo nível também não tiver os dados, um acesso à
memória principal será necessário e uma penalidade de falha maior será observada.
MEDINDO E MELHORANDO O
DESEMPENHO DA CACHE
Considerações:
Cache 1 – integrada no microprocessador;
Cache 2 – fora do processador, em chips de memória DRAM;
Cacpacidade cache 2 > capacidade cache 1;
PRÓXIMA AULA
Trazer xerox :
Cap. 7 – Grande e rápida: explorando a hierarquia de
memória
Tópicos 7.1, 7.2 e 7.3
Livro:
Organização e Projeto de Computadores – A interface
hardware/software