Est-il vrai que la cohérence séquentielle est une propriété plus forte que la cohérence du cache?
Selon
Sorin, Daniel J; Hill, Mark D; Wood, David A: Une introduction à la cohérence de la mémoire et à la cohérence du cache , Morgan et Claypool, 2011
la cohérence séquentielle peut être décrite comme (non formellement):
Le modèle de mémoire de cohérence séquentielle spécifie que le système doit apparaître pour exécuter toutes les charges des threads et les stocker dans tous les emplacements de mémoire dans un ordre total qui respecte l'ordre des programmes de chaque thread. Chaque chargement obtient la valeur du magasin le plus récent de cette commande totale.
En d'autres termes, le système est séquentiellement cohérent, si on donne des événements de mémoire (charges et magasins) de chaque thread, nous pouvons ordonner tous ces événements de telle sorte que: 1) pour chaque thread, l'ordre de ses événements soit préservé, et 2) l'ordre global soit série (toute charge renvoie la dernière valeur stockée).
Maintenant, ils continuent et décrivent la cohérence:
Une définition de la cohérence qui est analogue à la définition de la cohérence séquentielle est qu'un système cohérent doit apparaître pour exécuter toutes les charges des threads et les stocker dans un seul emplacement de mémoire dans un ordre total qui respecte l'ordre des programmes de chaque thread.
En d'autres termes, le système est cohérent, si on donne des événements de mémoire de chaque thread pour chaque emplacement, nous pouvons ordonner des événements pour cet emplacement, tels que: 1) pour chaque thread, l'ordre de ses événements vers cet emplacement est préservé, et 2) pour chaque l'emplacement de la commande est en série.
Enfin, ils soulignent la différence:
Cette définition met en évidence une distinction importante entre cohérence et cohérence : la cohérence est spécifiée sur une base d'emplacement par mémoire, tandis que la cohérence est spécifiée par rapport à tous les emplacements de mémoire.
Il semble donc que la différence est que pour les systèmes cohérents, nous avons besoin d'un ordre total sur tous les événements pour chaque emplacement (donc l'ordre entre les événements pour un emplacement particulier), tandis que pour les systèmes cohérents, l'ordre total devrait être défini sur tous les événements (et donc le la commande est également entre les événements pour différents endroits)?
Est-ce à dire que la cohérence est moins stricte que la cohérence? (ce qui semble amusant!) Y a-t-il des traces cohérentes mais pas cohérentes?
Réponses:
Comme vous l'avez souligné, la cohérence est une propriété d'un emplacement de mémoire individuel tandis que la cohérence fait référence à l'ordre d'accès à tous les emplacements de mémoire. La cohérence séquentielle est une propriété strictement plus forte que la cohérence. C'est-à-dire: chaque système qui est séquentiellement cohérent l'est également à chaque emplacement de mémoire. L'inverse n'est pas vrai, une mémoire cohérente à chaque emplacement n'est pas nécessairement séquentielle. En fait, il existe de nombreux multiprocesseurs cohérents en cache où le modèle de mémoire n'est que faiblement cohérent (il existe des cas où différents processeurs observent que les accès à différents emplacements se produisent dans des ordres différents.)
La preuve de la cohérence séquentielle implique la cohérence:
Cela peut conduire à des résultats surprenants. Par exemple
Cette trace est cohérente:
proc2 loads A(gets 0)
,proc1 stores A:=1
proc1 stores B:=1
,proc2 loads B(gets 1)
Mais ce n'est pas cohérent! Puisque if
proc2 load B
renvoie 1, alorsproc1 store A := 1
déjà arrivé etproc2 load A
devrait également retourner 1.la source