Prévia do material em texto
UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO PROGRAMA DE PÓS-GRADUAÇÃO EM COMPUTAÇÃO DISCIPLINA: ARQUITETURA DE COMPUTADORES PROFESSORES: MARCELO PORTO, LUCIANO AGOSTINI E BRUNO ZATT ALUNO: CARLOS ALEXANDRE SILVA DOS SANTOS DATA: 06/08/2020 RESUMO: TEMA 3: CONCEITOS BÁSICOS DE HIERARQUIA DE MEMÓRIA, CONCEITOS BÁSICOS DE MEMÓRIA CACHE E MAPEAMENTO DE MEMÓRIA CACHE 1 - CONCEITOS BÁSICOS DE HIERARQUIA DE MEMÓRIA Primeiramente, é importante considerar o impacto da memória impacta no desempenho regular de um sistema computacional. No intuito de amenizar este impacto, é fundamental o entendimento sobre a hierarquia de memórias, assim como os detalhes de funcionamento das memórias em seus diferentes níveis, com o propósito de mitigar problemas de leitura e escrita, assim como maximizar a performance do sistema. Parte considerável do tempo de execução gasto para processamento de uma dado ou instrução é proveniente do tempo de acesso à memória. De forma geral, os sistemas computacionais atuais apresentam uma hierarquia de memória, em que existem diversas tecnologias de fabricação e com diferentes características, tais como velocidade de acesso, custo, densidade, capacidade, etc. De acordo com o “gargalo” descrito por von Neumann, constata-se que ao longo do tempo a evolução de desempenho dos processadores, comparado ao desempenho das memórias, é maior. Mesmo com um ganho de desempenho nas memórias, esta diferença de desempenho ou “gap” em relação ao processador tem um aumentando. Com base na informação acima, constata-se uma necessidade de se melhorar o desempenho das memórias de forma que as mesmas não sejam um empecilho no desempenho geral de um sistema computacional. A hierarquia de memória nos sistemas atuais costuma ter de 3 a 4 níveis de níveis diferentes com diferentes tipos de tecnologia de fabricação de memórias. Geralmente, esta hierarquia é representada na forma de pirâmide, em que no topo se tem as memórias mais rápidas, porém com baixa capacidade de armazenamento (com menor número de bits para armazenamento por cm2 em chip) e custo mais elevado. Em contrapartida, nos níveis mais baixos tem-se memórias mais lentas, porém com custo mais baixo e alta capacidade de armazenamento. A Figura 1 apresenta uma ilustração da hierarquia de memória na forma de uma pirâmide. Na Figura 1 observa-se os Registradores no topo, seguido da memória cache, memória principal e memórias secundárias ou de massa (disco rígido, SSD, fita magnética, etc.). Portanto, o propósito é que se tenham memórias mais rápidas mais próximas ao processador, que no caso ilustrado acima são os registradores. Com a utilização dos registradores é possível diminuir o gap entre o processador e a memória. Ocorre que a quantidade e densidade de registradores não é suficiente para “armazenar” todas os dados e instruções que o processador precisará para processar uma informação. Nos processadores atuais observa-se também a hierarquia de memórias, em que se tem além dos registradores, também a memórias cache integradas L1, L2 e L3. Portanto, o objetivo da utilização de uma hierarquia de memória é dar ao sistema a “ilusão” de que se tem uma memória muito rápida e com uma capacidade de armazenamento grande, ou seja, que o sistema tem a velocidade da memória mais rápida (tecnologia mais cara), e a capacidade de armazenamento da memória mais lenta (tecnologia mais barata). O gerenciamento desta hierarquia de memórias é realizada conforme segue: Registadores com memória o gerenciamento é realizado pelo compilador; cache com memória principal, o gerenciamento é realizado pelo hardware; e, memória principal com o disco, o gerenciamento é realizado pelo hardware e pelo sistema operacional (memória virtual), e pelo programador (arquivo). A hierarquia de memória funciona porque explora o princípio da localidade, que pode ser temporal ou espacial, em que se tenta encontrar quais são os dados que se deseja manter na memória mais rápida. A localidade temporal parte da premissa que se um item é referenciado, ele tende a ser referenciado novamente dentro de um espaço curto de tempo. Exemplo: A maioria dos programas contém laços (instruções e dados do laço tendem a ser acessados de maneira repetitiva. Neste caso, é interessante deixar este dado ou instrução na memória mais próxima ao processador, uma vez que este possivelmente precisará deste dado novamente em um curto espaço de tempo. A localidade espacial parte da premissa que se um item é referenciado, itens cujos endereços sejam próximos dele tendem a ser logo referenciados. Exemplo: Nos programas, as instruções estão armazenadas na memória de maneira sequencial; os itens de matrizes e registros também se encontram armazenados de maneira sequencial. Neste caso, quando o processador realizar uma requisição de uma instrução, por exemplo, além desta instrução, convém se levar à memória também as instruções que são subsequentes à instrução requisitada, uma vez que possivelmente o processador precisará destas também em um curto espaço de tempo. 2 - CONCEITOS BÁSICOS DE MEMÓRIA CACHE Cache é a designação do nível de memória que está entre o processador e a memória principal, e este nome foi usado em meados dos anos 60 pela primeira máquina que utilizou este tipo de memória. A memória cache utiliza o princípio da localidade. Atualmente, utiliza-se este nome para qualquer memória que explore o princípio da localidade. Quando o processador solicita um determinado dado e não o encontra no nível hierárquico de memória mais próximo a ele, ou i (nível superior), o que se diz é que este determinado dado será buscado em um nível inferior ou i+1. Outro conceito importante é o de Bloco, que nada mais é do que a unidade mínima de informação, contendo um determinado número de palavras de memória, como por exemplo, com 8 palavras de memória, conforme ilustrado na Figura 2. Detalhe interessante é que o quão maior é o tamanho da palavra maior será a possibilidade de exploração da localidade espacial. Porém, quão maior o tamanho da palavra menos palavras serão possíveis, o que causará uma menor exploração temporal, pois menos palavras estarão disponíveis na cache. Quando uma informação é solicitada pelo processador e esta está presente no nível superior da hierarquia dizemos que ocorreu um hit, ou acerto. Porém, se esta informação não puder ser encontrada no nível superior, a tentativa de encontrá-la irá gerar uma falta (fault ou miss). Quando ocorre esta fala, o nível imediatamente inferior é acessado, com o propósito de se recuperar o bloco com a informação solicitada pelo processador. Ao acessar os níveis inferiores da hierarquia, estas informações serão conduzidas à cache, de forma que o processador possa acessá-las e processá-las. Porém, quando isto ocorre, pode ser necessário que o dado ou instrução que estejam na cache tenham que ser removidos. Convém destacar que, se um determinado dado está em um nível superior, ou i, eletambém está presentes no nível i+1 da hierarquia, de forma a manter a consistência destes dados nos diversos níveis de memória. Exemplo: Se um dado está na memória cache, este dado também está presente na memória principal. A taxa de acertos ou hit ratio é a fração dos acessos à memória que são encontrados no nível superior e a taxa de faltas ou miss ratio é a fração de acessos à memória não encontrados no nível superior. Já o tempo de acerto ou hit time é o tempo para acessar o nível superior da hierarquia, que inclui o tempo necessário para determinar se a tentativa de acesso à informação vai gerar um acerto ou uma falta, enquanto que a penalidade por falta (fault penalty) é o tempo necessário para substituir um dos blocos do nível superior pelo bloco do nível inferior que contém a informação desejada, mais o tempo para enviar a informação ao processador. Com relação à penalidade por falta deve-se levar em conta o nível hierárquico de memória, pois quão mais baixo o nível maior será a penalidade por falta, uma vez que o tempo de acesso em níveis mais baixos é muito maior em relação a níveis superiores. Para verificar se um dado está na cache e em qual posição é necessário o estudo dos modelos básicos de mapeamento, ou seja como se “pega” um bloco da memória e se coloca na cache. O modelo mais básico é o de Mapeamento Direto, em que um bloco só pode ser colocado em exatamente um lugar na cache. Neste modelo, existe um caminho, mapeado previamente, de qualquer endereço de bloco da memória principal para uma única posição da cache, em que esta posição é dada pelo (endereço do bloco) módulo (número de blocos da cache). Neste modelo de mapeamento, portanto, várias posições da memória principal devem ser mapeadas para a mesma posição na memória cache. O mapeamento direto não é flexível, pois o dado só poderá ser colocado naquela posição calculada. Caso haja outro dado já naquela posição da cache este dado será descartado. O outro extremo dos tipos de Mapeamento é o Totalmente Associativo, em que um bloco da memória principal pode ser colocado em qualquer posição da cache. Neste modelo, um bloco de memória pode ser associado a qualquer entrada da cache. Portanto, é necessário pesquisar todas as entradas da cache, a fim de localizar um determinado bloco, uma vez que este pode estar em qualquer uma das entradas. Para reduzir o tempo desta pesquisa é utilizado um comparador para cada entrada da cache, de forma que a pesquisa seja realizada em paralelo, o que acarreta em um custo elevado de hardware. A chance de acerto na busca de um dado aumenta, porém há o custo de hardware associado. Portanto, este tipo de mapeamento torna-se mais atrativo para caches pequenas. Um método de mapeamento que tenta reunir características dos métodos apresentados anteriormente, é o Associativo por Conjunto ou Bloco Associativo. Neste modelo, existe um número fixo de posições na cache (no mínimo duas) nas quais cada bloco pode ser colocado. Cada bloco da memória principal é mapeado para um dos conjuntos da cache, determinado pelo campo de índice do endereço (sendo que o bloco pode ser colocado em qualquer dos elementos deste conjunto). O conjunto que contém o bloco de memória é dado por (número do bloco) módulo (número de conjuntos da cache). Com relação à política de substituição de dados em cache, no mapeamento direto não existe escolha, pois apenas uma posição da cache pode ser substituída, já a substituição no mapeamento associativo pode ser realizada aleatoriamente, com o uso menos recente (LRU), ou por meio de uma fila, em que o primeiro a entrar é o primeiro a sair (FIFO). Estas políticas têm vantagens e desvantagens. Na aleatória o bloco a ser substituído é escolhido aleatoriamente e é uma estratégia simples para implementação em hardware. Já na política de substituição LRU, os acessos aos blocos devem ser registrados e o bloco a ser substituído é aquele que está a mais tempo sem ser solicitado. Esta política explora o princípio da localidade temporal, e sua complexidade aumenta com o aumento do tamanho da cache. É uma política geralmente aproximativa, dada sua complexidade. Por fim, a política FIFO é uma forma simplificada de implementar o LRU, uma vez que o bloco mais antigo é substituído e não o LRU, tornando, por sua vez, o controle menos complexo. Com relação às fontes de perdas (misses), há diferentes causas. Um miss compulsório é ocasionado quando a cache será preenchida pela primeira vez. O miss de conflito ou colisão é aquele que acontece, por exemplo, no mapeamento direto, em que se precisa guardar um dado em uma posição que já é ocupada. Numa cache totalmente associativa este problema não ocorre. Já o conflito de capacidade ocorre quando a cache está cheio e inexoravelmente um dado deverá sair da cache para que o novo dado seja armazenado. Por fim, o miss de invalidação é quando um dispositivo de I/O altera a memória e o processador vai ler esta informação e ela não mais está na cache. A Tabela 1 apresenta uma relação entre os métodos de mapeamento e tamanho da cache com as diferentes fontes de perda (misses). Observe, por exemplo, que há uma incidência alto de misses de conflito no mapeamento direto em relação aos demais mapeamentos, em função da política de substituição de dados. Em contrapartida, há no mapeamento completamente associativa uma quantidade alta de misses de capacidade em relação aos demais mapeamentos, pois neste mapeamento não há misses de conflito. Com relação às escritas na cache, estas representam 7% do tráfego geral da memória e cerca de 28% se for considerado apenas uma cache de dados. Portanto, a maior parte dos acessos à memória por parte do processador são para leituras. Neste sentido, deve-se otimizar o tempo de leitura para aumentar o desempenho médio do sistema. Os processadores tradicionalmente esperam o fim das leituras, mas não das escritas. Nas escritas em cache podem ocorrer inconsistências. Um exemplo seria a execução de uma instrução store em que o dado seja escrito somente na cache, uma vez que a memória principal teria um valor diferente do escrito na cache. Para resolver este tipo de problema existem duas estratégias: Write through e Write Back. No Write Through a informação é escrita no bloco da cache e também na memória principal (ou cache de nível inferior). A vantagem desta abordagem é que os dados sempre estão estáveis nos diferentes níveis de memória, e a desvantagem é que todas as escritas pagam o preço do tempo de escrita na memória mais lenta. No Write Back a informação é escrita no bloco da cache, e só será escrito na memória principal quando for substituído. A vantagem é que esta abordagem pode reduzir o número de acessos que se faz no nível inferior, priorizando o desempenho. Ainda no contexto da escrita tem se o conceito de Write Miss que é quando o processador solicita uma escrita o endereço solicitadonão está armazenado na cache. Neste problemas, existem duas opções: Alocação de escrita, em que as perdas de escrita atuam como perdas de leitura, e a Alocação sem escrita, em que as perdas de escrita não afetam a cache e o bloco é modificado apenas na memória principal. 3 - MEMÓRIA CACHE: MAPEAMENTO DIRETO, TOTALMENTE ASSOCIATIVO E ASSOCIATIVO POR CONJUNTO No Mapeamento Direto para cada palavra na cache é atribuído um endereço com base no endereço da palavra na memória principal. Como um dado de entrada da cache pode armazenar o conteúdo de diversos endereços da memória principal são atribuídos à cache um conjunto de rótulos (tags), de forma a identificar se o dado armazenado na cache corresponde ao solicitado. Estes rótulos são usados em conjunto com o endereço do mapeamento para compor o endereço completo, com relação à memória principal. Em situações em que a cache está vazia é necessário reconhecer se um bloco da cache possui informação válida. Para estes casos é utilizado um bit de validade, em que se o bit de validade for igual a 0, a informação contida naquele bloco da cache não é válida. No mapeamento direto o endereço é dividido em 2 partes. A parte menos significativa é o índice, usado como endereço na cache onde será armazenada a palavra. E a parte mais significativa é a tag, armazenada na cache junto com o conteúdo da posição de memória. Quando o acesso é realizado, o índice é usado para encontrar a palavra na cache. Se o tag armazenado na palavra da cache é igual ao tag do endereço procurado, então houve acerto. Endereços com mesmo índice são mapeados sempre para a mesma palavra da cache. Dentre as vantagens do mapeamento direto está a não necessidade de algoritmo de substituição, hardware mais simples e de custo mais baixo, e alta velocidade de operação. Como desvantagens estão o baixo desempenho se acessos consecutivos são feitos a palavras com mesmo índice e um hit ratio inferior ao de caches com mapeamento associativo. Já no Mapeamento Totalmente Associativo, como já explicado, um bloco da memória principal pode ser colocado em qualquer posição da cache, ou seja, um bloco de memória pode ser associado a qualquer entrada da cache. Neste contexto, este tipo de mapeamento requer que sejam pesquisadas todas as entradas da cache, e, em virtude disto, para reduzir o tempo de pesquisa são usado comparadores para cada entrada da cache. Em função da necessidade de implementação desses comparadores o custo de hardware acaba sendo mais alto. Sendo assim, este tipo de mapeamento é mais adequado para caches pequenas. No Mapeamento Associativo por Conjunto ou Bloco Associativo, existe um número fixo de posições na cache (no mínimo duas), nas quais cada bloco pode ser colocado. A cache associativa n é uma cache associativa por conjunto com n posições possíveis para guardar um bloco. É composta por um determinado número de conjuntos, cada conjunto com m blocos. Nesta modalidade de mapeamento, cada bloco da memória principal é mapeado para um dos conjuntos da cache, determinado pelo campo de índice do endereço, sendo que o bloco pode ser colocado em qualquer dos elementos desse conjunto. No que diz respeito à associatividade nas caches convém destacar que o aumento do grau de associatividade, geralmente, resulta na redução de taxa de faltas, porém há a desvantagem do aumento de tempo para tratamento do acerto e também o custo em hardware. A vantagem do mapeamento completamente associativo é a máxima flexibilidade no posicionamento de qualquer palavra ou linha da memória principal em qualquer palavra ou linha da cache. Dentre as desvantagens estão o custo em hardware e a necessidade da utilização de algoritmo de substituição, em hardware, para selecionar uma linha da cache como consequência de um miss. O Mapeamento Associativo por Conjunto, em comparação ao mapeamento completamente associativo, tem a vantagem de os comparadores serem compartilhados por todos os conjuntos, e, por conseguinte, o algoritmo de substituição só precisa considerar linhas dentro de um conjunto apenas. Convém destacar que o aumento no custo de hardware à medida que se aumenta a associatividade, mencionado anteriormente, se dá porque há também um aumento do número de tags que serão armazenadas na memória Cache. Portanto, se há a necessidade de mais tags, e estas são armazenadas na Cache, terá que ter uma quantidade maior de bits somente para realizar a identificação da posição que estão os dados na Cache. Este custo, por conseguinte, é proporcional, ou seja, quanto maior o associativismo maior será a quantidade de tags para identificar os dados na memória, e maior será a quantidade de bits necessários. Quando se aumenta a associatividade também é necessário a implementação de mais comparadores, que serão utilizados para pode verificar se um determinado dado ou instrução estão em determinado (bloco). A Figura 3 apresenta uma ilustração de uma Cache com Mapeamento Direto à esquerda, e uma Cache com Mapeamento Conjunto Associativo à direita. Verifique que na Figura 3 também estão assinaladas as informações que são armazenadas na Cache, ou seja, os bits de memória que precisam ser implementados na Cache, por exemplo, o val., tag e a informação propriamente dita. Este é um dos motivos da impossibilidade de não se utilizar somente a Cache para armazenar informações, e sim uma Hierarquia de Memória com diferentes níveis, cada nível com um tipo de tecnologia e custos diferentes, uma vez que a Cache necessita, além dos bits para armazenar a informação, também bits adicionais (de controle), para poder referenciar estas informações. A seguir será retomada a explicação sobre o custo de hardware dos diferentes tipos de Mapeamento utilizados em memória Cache. Observe que no Mapeamento Direto (à esquerda) há apenas uma porta AND e um comparador, uma vez que o índice já leva ao bloco, bastando apenas saber se o tag é igual ou não e se o bit de validade é válido ou não. Já no Mapeamento Conjunto Associativo de 4 vias (à direita) há quatro pares de comparador e portas lógica AND, além de uma porta lógica OR para verificar de onde veio o hit, e um MUX de 4 entradas para saber qual dos 4 blocos é o correto (quando o dado sai da memória é necessário que ele passe por este MUX), por este motivo que o aumento da associatividade aumenta o tempo de acerto pois haverá um custo de processamento do MUX, além do custo de hardware já mencionado. Quanto maior o tamanho do cache associativo, mais lento será. Além disso, são necessárias mais tags para identificar onde a informação está, pois esta poderá estar nas 4 diferentes vias do conjunto. De acordo com o exposto, convém destacar que por mais que o método de Mapeamento Conjunto Associativo tenha um desempenho superior ao Mapeamento Direto, é necessário também se levar em conta outros fatores, como por exemplo, o custo em hardwareque estes diferentes métodos de mapeamento de memória Cache possuem, principalmente levando em conta que o tamanho da memória Cache é dada pela quantidade de bits de memória, ou seja, quanto maior a quantidade de tags para identificação de um dado na memória maior será o tamanho da Cache também. É necessário haver um equilíbrio, por exemplo, entre quantos bits são utilizados para a tag e quantos bits são utilizados para informações.