Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arquitetura de Computadores Aula Pra´tica Prof. Pedro Carlos da Silva Lara Centro Federal de Educac¸a˜o Tecnolo´gica Celso Suckow da Fonseca Mapeamento da Memo´ria Cache 1 Mapeamento Direto Esta pra´tica tem o objetivo de simular o mapeamento entre a memo´ria principal e a memo´ria cache. Cada bloco da memo´ria principal e´ mapeado em uma linha da cache seguindo a seguinte equac¸a˜o: i = j mod m, onde, • i e´ a i-e´sima linha de cache • j e´ j-e´simo bloco da memo´ria principal • m e´ o nu´mero de blocos da cache. Seja s tal que a memo´ria principal possua 2s blocos de 2w bytes. Enta˜o o mapeamento e´ feito usando a seguinte lo´gica Linha da Cache Poss´ıveis Blocos da Mem. Principal 0 0, 2m, 3m, . . . , 2s −m 1 1, 2m+ 1, 3m+ 1, . . . , 2s −m+ 1 2 2, 2m+ 2, 3m+ 2, . . . , 2s −m+ 2 ... ... m− 1 m− 1, 2m+m− 1, 3m+m− 1, . . . , 2s − 1 Considerando m = 2r enta˜o temos um valor de s − r bits que identifica unicamente um bloco (entre os poss´ıveis) alocado na memo´ria cache. Chamaremos de ro´tulo. Assim a cache armazena em cada linha s− r bits para representar o ro´tulo mais 2w bytes para representar os dados efetivamente. O mapeamento e´ feito usando a seguinte configurac¸a˜o do enderec¸o. s− r bits (ro´tulo) r bits (linha da cache) w bits (palavra no bloco) Exemplo Considere uma memo´ria principal com 16MB (ou seja, 224 bytes) e blocos de 22 bytes. Assim, s = 22 e w = 2. Considere tambe´m uma memo´ria cache com 214 linhas (assim, r = 14). Desta forma o bloco 0x8FB314 da memo´ria principal possui as seguintes caracter´ısticas: Formato Ro´tulo Linha de Cache Palavra no bloco Bina´rio 1000 1111 1011 0011 0001 01 00 Hexadecimal 8F 2CC5 0 Vamos supor que este bloco tenha os seguites 4 bytes armazenados 0xF134CC1A enta˜o a cache ficaria Enderec¸o da Cache (linha) Ro´tulo Bloco 0x2CC5 0x8F 0xF134CC1A 14 bits 1 byte 4 bytes Exerc´ıcio Considerando este exemplo crie um programa para simular o comportamento de uma cache com mape- amento direto. O programa deve ser escrito em linguagem C e deve possuir as seguintes funcionalidades: • Um vetor de 224 bytes para representar a memo´ria principal. • Um vetor de 214 · 5 bytes para representar a memo´ria cache. • Uma func¸a˜o que verifica se um dado esta´ na cache com a seguinte assinatura int acessaCache( byte * cache, int endereco ); Retorna o byte requerido caso ele esteja na cache (cache hit) ou -1 se na˜o esta´ (cache miss). Este enderec¸o possui 24 bits. • Uma func¸a˜o para copiar um bloco da memo´ria principal para a cache. int copiarParaCache( byte * cache, byte * RAM, int endereco ); Neste caso os u´ltimos 2 bits do enderec¸o sera˜o desprezados. O acesso completo a memo´ria devera´ ser implementado da seguinte forma: int valor = acessaCache(cache, endereco); if( valor == -1 ) { cacheMiss++; copiarParaCache(cache, RAM, endereco); } else cacheHit++; • Com estas func¸o˜es implementadas fazer um procedimento para contar a proporc¸a˜o de cache hit PCacheHit = CacheHit CacheHit+ CacheMiss quando: 1. o acesso e´ completamente aleato´rio (use um valor grande de acessos). 2. o acesso e´ em apenas um array de 1024 bytes alocado na posic¸a˜o 0x0F12B8. 3. o acesso e´ em feito alternadamente em dois arrays com 128 bytes. O primeiro esta´ alocado na posic¸a˜o 0x310018 e o segundo esta´ na posic¸a˜o 0x4312BC. 4. o acesso e´ em feito alternadamente em dois arrays com 128 bytes. O primeiro esta´ alocado na posic¸a˜o 0x4A0004 e o segundo esta´ na posic¸a˜o 0xFF0004. • Torne o programa geral. Ou seja, crie as memo´rias principal e cache usando paraˆmetros s, r e w. Sugira um tamanho adequado para uma cache quando a memo´ria principal possui 4MB? Explique os valores obtidos nos itens 1, 2, 3 e 4. 2 Mapeamento Associativo O mapeamento direto executa uma lo´gica simples para mapear a memo´ria principal na memo´ria cache. Pore´m a desvantagem e´ que cada bloco da memo´ria principal e´ mapeado em uma posic¸a˜o fixa na memo´ria cache. O enderec¸o de 24 bits e´ mapeado da seguinte forma: r = 22 bits (ro´tulo) w = 2 bits (palavra no bloco) E a cache fica Linha da Cache Ro´tulo Bloco 14 bits 22 bits 32 bits O problema desta implementac¸a˜o e´ que temos que comparar todas as linhas da cache para, por exemplo, encontrar um cache miss. Exerc´ıcio Implemente a func¸a˜o int acessaCacheAss( byte * cache, int endereco ); usando o mapeamento associativo usando a te´cnica de substituic¸a˜o aleato´ria. 2 2.1 Mapeamento Associativo por Conjuntos Esta organizac¸a˜o diminue a quantidade de comparac¸o˜es executadas no mapeamento associativo. Neste caso, temos v conjuntos com k linhas cada. Temos as seguintes equac¸o˜es m = v · k i = j mod v • v e´ a quantidade de conjuntos. • k e´ a quantidade de linhas por conjunto. • i e´ o nu´mero do conjunto na cache. • j e´ o nu´mero do bloco na memo´ria principal. Assim, um bloco j na memo´ria principal pode ser mapeado em qualquer bloco do conjunto i na cache. Quando temos v = m e k = 1 esta te´cnica se reduz ao mapeamento direto. Para v = 1 e k = m esta te´cnica se reduz ao mapeamento associativo. Exerc´ıcio Implemente a func¸a˜o int acessaCacheAssConj( byte * cache, int endereco ); usando o mapea- mento associativo por conjuntos usando v = m/4 e k = 4. Com m = 214 O enderec¸o da memo´ria principal e´ dividido da seguinte forma: (ro´tulo) 10 bits (conjunto da cache) 12 bits (palavra no bloco) 2 bits Ja´ o armazenamento da cache fica Linha da Cache Ro´tulo Bloco 14 bits 10 bits 32 bits 3
Compartilhar