Coerência e sincronização de cache
Neste capítulo, discutiremos os protocolos de coerência de cache para lidar com os problemas de inconsistência de multicache.
O problema de coerência do cache
Em um sistema multiprocessador, a inconsistência de dados pode ocorrer entre níveis adjacentes ou dentro do mesmo nível da hierarquia de memória. Por exemplo, o cache e a memória principal podem ter cópias inconsistentes do mesmo objeto.
Como vários processadores operam em paralelo e, de forma independente, vários caches podem possuir diferentes cópias do mesmo bloco de memória, isso cria cache coherence problem. Cache coherence schemes ajudar a evitar esse problema, mantendo um estado uniforme para cada bloco de dados em cache.
Seja X um elemento de dados compartilhados que foi referenciado por dois processadores, P1 e P2. No início, três cópias de X são consistentes. Se o processador P1 grava um novo dado X1 no cache, usandowrite-through policy, a mesma cópia será gravada imediatamente na memória compartilhada. Nesse caso, ocorre inconsistência entre a memória cache e a memória principal. Quando umwrite-back policy for usado, a memória principal será atualizada quando os dados modificados no cache forem substituídos ou invalidados.
Em geral, existem três fontes de problemas de inconsistência -
- Compartilhamento de dados graváveis
- Migração de processo
- Atividade de I / O
Protocolos de Snoopy Bus
Os protocolos Snoopy alcançam consistência de dados entre a memória cache e a memória compartilhada por meio de um sistema de memória baseado em barramento. Write-invalidate e write-update as políticas são usadas para manter a consistência do cache.
Neste caso, temos três processadores P1, P2 e P3 tendo uma cópia consistente do elemento de dados 'X' em sua memória cache local e na memória compartilhada (Figura-a). O processador P1 grava X1 em sua memória cache usandowrite-invalidate protocol. Assim, todas as outras cópias são invalidadas pelo ônibus. É denotado por 'I' (Figura-b). Blocos inválidos também são conhecidos comodirty, ou seja, eles não devem ser usados. owrite-update protocolatualiza todas as cópias de cache por meio do barramento. Usandowrite back cache, a cópia da memória também é atualizada (Figura-c).
Eventos e ações de cache
Os seguintes eventos e ações ocorrem na execução de comandos de acesso à memória e invalidação -
Read-miss- Quando um processador deseja ler um bloco e ele não está no cache, ocorre uma falha de leitura. Isso inicia umbus-readOperação. Se não houver cópia suja, a memória principal que possui uma cópia consistente fornece uma cópia para a memória cache solicitante. Se houver uma cópia suja em uma memória cache remota, esse cache restringirá a memória principal e enviará uma cópia à memória cache solicitante. Em ambos os casos, a cópia do cache entrará no estado válido após uma falha de leitura.
Write-hit - Se a cópia estiver suja ou reservedestado, a gravação é feita localmente e o novo estado está sujo. Se o novo estado for válido, o comando write-invalidate é transmitido para todos os caches, invalidando suas cópias. Quando a memória compartilhada é escrita, o estado resultante é reservado após esta primeira escrita.
Write-miss- Se um processador não consegue gravar na memória cache local, a cópia deve vir da memória principal ou de uma memória cache remota com um bloco sujo. Isso é feito enviando umread-invalidatecomando, o que invalidará todas as cópias de cache. Em seguida, a cópia local é atualizada com o estado incorreto.
Read-hit - O acerto de leitura é sempre executado na memória cache local sem causar uma transição de estado ou usar o barramento snoopy para invalidação.
Block replacement- Quando uma cópia está suja, deve ser gravada de volta na memória principal pelo método de substituição de bloco. No entanto, quando a cópia estiver em estado válido ou reservado ou inválido, nenhuma substituição ocorrerá.
Protocolos baseados em diretório
Ao usar uma rede de vários estágios para construir um grande multiprocessador com centenas de processadores, os protocolos de cache de snoopy precisam ser modificados para se adequar aos recursos da rede. A difusão sendo muito cara para realizar em uma rede de vários estágios, os comandos de consistência são enviados apenas para os caches que mantêm uma cópia do bloco. Esta é a razão para o desenvolvimento de protocolos baseados em diretório para multiprocessadores conectados em rede.
Em um sistema de protocolos baseado em diretório, os dados a serem compartilhados são colocados em um diretório comum que mantém a coerência entre os caches. Aqui, o diretório atua como um filtro onde os processadores pedem permissão para carregar uma entrada da memória primária para sua memória cache. Se uma entrada for alterada, o diretório a atualiza ou invalida os outros caches com essa entrada.
Mecanismos de sincronização de hardware
A sincronização é uma forma especial de comunicação onde, em vez de controle de dados, as informações são trocadas entre processos de comunicação que residem no mesmo ou em processadores diferentes.
Os sistemas multiprocessadores usam mecanismos de hardware para implementar operações de sincronização de baixo nível. A maioria dos multiprocessadores tem mecanismos de hardware para impor operações atômicas, como operações de leitura, gravação ou leitura-modificação-gravação de memória para implementar algumas primitivas de sincronização. Além das operações de memória atômica, algumas interrupções entre processadores também são usadas para fins de sincronização.
Coerência de cache em máquinas de memória compartilhada
Manter a coerência do cache é um problema no sistema multiprocessador quando os processadores contêm memória cache local. A inconsistência de dados entre diferentes caches ocorre facilmente neste sistema.
As principais áreas de preocupação são -
- Compartilhamento de dados graváveis
- Migração de processo
- Atividade de I / O
Compartilhamento de dados graváveis
Quando dois processadores (P1 e P2) têm o mesmo elemento de dados (X) em seus caches locais e um processo (P1) grava no elemento de dados (X), como os caches são gravados no cache local de P1, a memória principal é também atualizado. Agora, quando P2 tenta ler o elemento de dados (X), ele não encontra X porque o elemento de dados no cache de P2 ficou desatualizado.
Migração de processo
No primeiro estágio, o cache de P1 possui elemento de dados X, enquanto P2 não possui nada. Um processo em P2 grava primeiro em X e depois migra para P1. Agora, o processo começa a ler o elemento de dados X, mas como o processador P1 tem dados desatualizados, o processo não pode lê-los. Portanto, um processo em P1 grava no elemento de dados X e migra para P2. Após a migração, um processo em P2 começa a ler o elemento de dados X, mas encontra uma versão desatualizada de X na memória principal.
Atividade de I / O
Conforme ilustrado na figura, um dispositivo de E / S é adicionado ao barramento em uma arquitetura de multiprocessador de dois processadores. No início, ambos os caches contêm o elemento de dados X. Quando o dispositivo de E / S recebe um novo elemento X, ele armazena o novo elemento diretamente na memória principal. Agora, quando P1 ou P2 (suponha que P1) tenta ler o elemento X, ele obtém uma cópia desatualizada. Portanto, P1 escreve no elemento X. Agora, se o dispositivo de E / S tentar transmitir X, ele obtém uma cópia desatualizada.
Acesso uniforme à memória (UMA)
A arquitetura Uniform Memory Access (UMA) significa que a memória compartilhada é a mesma para todos os processadores do sistema. As classes populares de máquinas UMA, que são comumente usadas para servidores (de arquivo), são os chamados Multiprocessadores Simétricos (SMPs). Em um SMP, todos os recursos do sistema como memória, discos, outros dispositivos de E / S, etc. são acessíveis pelos processadores de maneira uniforme.
Acesso não uniforme à memória (NUMA)
Na arquitetura NUMA, existem vários clusters SMP com uma rede indireta / compartilhada interna, que são conectados em uma rede escalonável de passagem de mensagens. Portanto, a arquitetura NUMA é uma arquitetura de memória distribuída fisicamente compartilhada de maneira lógica.
Em uma máquina NUMA, o controlador de cache de um processador determina se uma referência de memória é local para a memória do SMP ou é remota. Para reduzir o número de acessos à memória remota, as arquiteturas NUMA geralmente aplicam processadores de cache que podem armazenar os dados remotos. Mas quando os caches estão envolvidos, a coerência do cache precisa ser mantida. Portanto, esses sistemas também são conhecidos como CC-NUMA (Cache Coherent NUMA).
Arquitetura de memória somente cache (COMA)
As máquinas COMA são semelhantes às máquinas NUMA, com a única diferença de que as memórias principais das máquinas COMA atuam como caches mapeados diretamente ou conjuntos associativos. Os blocos de dados são transferidos para um local no cache DRAM de acordo com seus endereços. Os dados buscados remotamente são, na verdade, armazenados na memória principal local. Além disso, os blocos de dados não têm um local fixo de residência, eles podem se mover livremente por todo o sistema.
A maioria das arquiteturas COMA tem uma rede hierárquica de passagem de mensagens. Um switch em tal árvore contém um diretório com elementos de dados como sua subárvore. Uma vez que os dados não têm localização inicial, eles devem ser procurados explicitamente. Isso significa que um acesso remoto requer uma travessia ao longo dos switches na árvore para pesquisar seus diretórios para os dados necessários. Portanto, se um switch na rede recebe várias solicitações de sua subárvore para os mesmos dados, ele os combina em uma única solicitação que é enviada ao pai do switch. Quando os dados solicitados retornam, o switch envia várias cópias deles por sua subárvore.
COMA versus CC-NUMA
A seguir estão as diferenças entre COMA e CC-NUMA.
O COMA tende a ser mais flexível do que o CC-NUMA porque o COMA oferece suporte transparente à migração e replicação de dados sem a necessidade do sistema operacional.
As máquinas COMA são caras e complexas de construir porque precisam de hardware de gerenciamento de memória não padrão e o protocolo de coerência é mais difícil de implementar.
Os acessos remotos no COMA costumam ser mais lentos do que no CC-NUMA, pois a rede da árvore precisa ser atravessada para encontrar os dados.