Cache Ezequiel Conde [email protected] Como funciona? Read Hit Write Hit Read Miss Write Miss Porque é que a cache resulta? for (i = 0; i < M; ++i) for (j = 0; j < N; ++j) x[i][j] = x[i][j] + K; Código - a instrução assinalada é executada repetidamente M x N vezes x[0][0], x[0][1], x[0][2] , x[0][3] Dados - carregamento preditivo ● carregar mais que o necessário no imediato ● o carregamento em bloco é mais eficiente M=1 ● o acesso à memória cache é mais rápido N=3 N=2 M=0 N=1 N=0 Princípio da localidade ● localidade temporal ● uso repetitivo no tempo - código dos ciclos; variáveis muito usadas ● localidade espacial ● execução sequencial - o código executa em endereços crescentes até ao jump ● carregamento preditivo - variáveis localizadas proximamente 30 de maio de 2016 Cache 3 Arquitetura da Cache A cache é uma coleção de linhas. Uma linha contém: ● um bloco de dados (32 ou 64 bytes); ● o endereço de memória desse bloco (tag); ● indicação de ocupada (valid bit). Dado um endereço de memória, como obter a localização na cache? Função de mapeamento(endereço de memória) -> localização na cache ● direct ● associative ● set-associative 30 de maio de 2016 Cache 4 Arquitetura da Cache Encontrada a localização, como saber se está na cache? ● A linha de cache contém o bloco e o endereço de memória - tag ● Os dados procurados estão na cache se a tag for igual ao endereço pretendido. Está na cache! - cache hit, hit rate ● ● Não está na cache! - cache miss, miss rate ● ● ● compulsory miss or could miss conflict miss capacity miss É preciso ler da memória - ler um bloco (32 ou 64 bytes). O bloco é depositado numa linha de cache. Onde colocar o bloco? ● Depende da função de mapeamento. ● Se não existir lugar disponível há que substituir - política de substituição. 30 de maio de 2016 Cache 5 Mapeamento direto A linha de cache é selecionada com uma função direta do endereço. A parte do endereço usada para escolher a linha são os bits de menor peso a seguir ao endereço do byte dentro do bloco. Considerando o caso de uma cache de 1 MByte com blocos de 64 Byte. 1MB / 64B = 16384 linhas (log216384 = 14) tag 31 linha 2019 Endereço pretendido byte 6 5 0 Um dado endereço só pode usar uma dada linha de cache. Isso pode significar uma grande desvantagem se for necessário aceder a dois endereços que correspondem à mesma linha - conflict ou collision misses. 30 de maio de 2016 Cache 6 Mapeamento associativo Qualquer linha de cache pode conter qualquer bloco. É necessário pesquisar em todas as linhas por uma tag igual à do endereço pretendido. Considerando o caso de uma cache de 1 MByte com blocos de 64 Byte: todos os bits a partir do endereço do byte no bloco pertencem à tag. tag 31 byte 6 5 Endereço pretendido 0 Não há conflict misses mas a pesquisa é dispendiosa, em material e em tempo. 30 de maio de 2016 Cache 7 Mapeamento associativo por conjunto tag 31 30 de maio de 2016 set 2019 Endereço pretendido byte 6 5 Cache 0 8 Políticas de substituição Direct map não requer processamento Idealmente deve-se substituir a última a ser necessária no futuro próximo. Como prever as futuras necessidades? aplicar o principio da localidade. ● Escolher a não usada há mais tempo (LRU, pseudo LRU) ● Escolher aleatoriamente (bons resultados para sets grandes) ● Escolher a mais antiga (FIFO, ring buffer) ● Escolher a usada com menos frequência (contador em cada linha) 30 de maio de 2016 Cache 9 Políticas de escrita ● ● Write-through A memória principal é atualizada em simultâneo com a escrita na cache. write-back A escrita é realizada apenas na cache a atualização da memória principal é realizada posteriormente. Quando atualizar a memória em write-back? Na altura da substituição. A substituição da linha será mais demorada. Para evitar escrever o bloco na memória principal, no caso do processador não ter realizado qualquer escrita no bloco, é acrescentado à linha o dirty bit 30 de maio de 2016 Cache 10 Operações de leitura 30 de maio de 2016 Cache 11 Operações de escrita 30 de maio de 2016 Cache 12