Consistência de memória versus coerência de cache

16

É verdade que a consistência sequencial é uma propriedade mais forte que a coerência do cache?

De acordo com

Daniel Sorin; Hill, Mark D; Wood, David A: Uma cartilha sobre consistência de memória e coerência de cache , Morgan & Claypool, 2011

a consistência sequencial pode ser descrita como (não formalmente):

O modelo de memória de consistência sequencial especifica que o sistema deve parecer executar todas as cargas de encadeamentos e armazenado em todos os locais de memória em uma ordem total que respeite a ordem do programa de cada encadeamento. Cada carga obtém o valor da loja mais recente nesse pedido total.

Em outras palavras, o sistema é sequencialmente consistente, se dados eventos de memória (cargas e armazenamentos) de cada thread, podemos ordenar todos esses eventos de modo que: 1) para cada thread, a ordem de seus eventos seja preservada e 2) a ordem global seja serial (qualquer carga retorna o valor mais recente armazenado).

Agora eles continuam e descrevem a coerência:

Uma definição de coerência análoga à definição de Consistência sequencial é que um sistema coerente deve parecer executar todas as cargas de encadeamentos e armazenar em um único local de memória em uma ordem total que respeite a ordem do programa de cada encadeamento.

Em outras palavras, o sistema é coerente; se dados eventos de memória de cada encadeamento para cada local , podemos solicitar eventos para esse local, de modo que: 1) para cada encadeamento, a ordem de seus eventos para esse local seja preservada e 2) para cada local em que o pedido é serial.

Finalmente, eles apontam a diferença:

Essa definição destaca uma distinção importante entre coerência e consistência : a coerência é especificada em uma localização por memória, enquanto a consistência é especificada em relação a todos os locais da memória.

Portanto, parece que a diferença é que, para sistemas coerentes, precisamos de uma ordem total em todos os eventos para cada local (assim, a ordenação entre eventos para uma localização específica), enquanto que para sistemas consistentes a ordem total deve ser definida em todos os eventos (e, portanto, no o pedido também é entre eventos para locais diferentes)?

Isso significa que a coerência é menos estrita que a consistência? (o que parece divertido!) Existem vestígios coerentes, mas não consistentes?

Ayrat
fonte
2
Observe que não gostamos de perguntas do formulário "verifique minha resposta!". Você pode adicionar uma pergunta mais específica? Onde você acha que poderia estar sua lacuna?
Raphael
@ Rafael, você está certo, e não foi um sentimento muito bom quando eu estava escrevendo a pergunta. Mas o que fazer se eu não conseguir encontrar uma resposta na Internet (exceto afirmações vagas como 'coerência fala sobre um bit, que é diferente da consistência que fala sobre todos os bits'), e tentava encontrar uma resposta, e quando parece para descobrir que não tinha certeza se está correto. Eu deveria ter feito uma pergunta duvidosa? Ou não fornecem uma resposta na pergunta :)?
Ayrat
@Ayrat Eu li a última parte da sua pergunta como uma resposta que você deseja verificar. Se for esse o caso, deve haver alguma dúvida (mais, por que perguntar?) Que você deve identificar para os leitores. Talvez eu tenha interpretado mal?
Raphael
@ Rafael 'a última parte quer ser verificada' - sim. 'porque perguntar?' - o tópico é novo e eu não tinha certeza de que a conclusão está correta. Vou tentar evitar este tipo de perguntas no futuro e, provavelmente, encontrar alguém por perto para verificá-lo).
Ayrat

Respostas:

9

Como você apontou, a coerência é uma propriedade de um local de memória individual, enquanto a consistência se refere à ordem dos acessos a todos os locais de memória. A consistência sequencial é uma propriedade estritamente mais forte que a coerência. Ou seja: todo sistema sequencialmente consistente também é coerente em todos os locais da memória. O oposto não é verdadeiro, uma memória que é coerente em todos os locais não é necessariamente sequencialmente consistente. De fato, existem muitos multiprocessadores reais coerentes com o cache em que o modelo de memória é apenas fracamente consistente (há casos em que diferentes processadores observam acessos a diferentes locais em diferentes ordens).

A prova de consistência sequencial implica coerente:

xx

xyx0 0y0 0xyxyyx

Isso pode levar a resultados surpreendentes. Por exemplo

initially A=B=0
process 1               process 2
store A := 1            load B (gets 1)
store B := 1            load A (gets 0) 

Esse rastreio é coerente:

  • para A ordem é: proc2 loads A(gets 0),proc1 stores A:=1
  • para B a ordem é: proc1 stores B:=1,proc2 loads B(gets 1)

Mas não é consistente! Como se proc2 load Bretorna 1, proc1 store A := 1já aconteceu e proc2 load Atambém deve retornar 1.

Lógica Errante
fonte