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 2, 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 10 00 Hexadecimal 8F 2CC6 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 0x2CC6 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 miss quando: – o acesso e´ completamente aleato´rio. – o acesso e´ em apenas um array de 1024 bytes alocado na posic¸a˜o 0x0F12B8. – o acesso e´ em feito em dois arrays com 128 bytes. O primeiro esta´ alocado na posic¸a˜o 0x310018 e o segundo esta´ na posic¸a˜o 0x4312BC. – o acesso e´ em feito 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. Qual seria um tamanho adequado para uma cache quando a memo´ria principal possui 4MB? 2
Compartilhar