Qu'est-ce que Modèle de cohérence mémoire ?

Ensemble de règles définissant dans quel ordre les lectures et écritures d'un cœur à plusieurs adresses peuvent être observées par les autres cœurs. Exemples : cohérence séquentielle, TSO de x86, modèles faibles d'ARM et de RISC-V.

Nom japonais: メモリ一貫性モデル

« Modèle de cohérence mémoire » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Multicœur et synchronisation.

Domaine: Multicœur et synchronisation

Pourquoi le matériel réordonne les accès mémoire

Les cœurs modernes n'effectuent pas les chargements et les écritures strictement dans l'ordre du programme. Une écriture est souvent mise en attente dans un tampon d'écriture (store buffer) pendant que le cœur poursuit, et les chargements peuvent être émis en avance ou dans le désordre pour masquer la latence du cache. Ces optimisations sont invisibles au sein d'un seul thread, car le cœur transmet toujours ses propres écritures en attente et préserve ses propres résultats. Un autre cœur, en revanche, peut voir les mêmes opérations dans un ordre différent. Un modèle de cohérence mémoire est le contrat qui précise exactement lesquels de ces réordonnancements peuvent devenir visibles, afin que programmeurs et compilateurs sachent quand une synchronisation est nécessaire.

Cohérence séquentielle, TSO et modèles faibles

La cohérence séquentielle (SC) est le modèle le plus strict : toutes les opérations semblent se produire dans un ordre global unique qui respecte l'ordre du programme de chaque cœur. x86 utilise l'ordre total des écritures (TSO), presque aussi fort : le seul réordonnancement visible est un chargement ultérieur vers une adresse différente qui s'achève avant une écriture antérieure, exactement ce que produit un tampon d'écriture FIFO. Arm et RISC-V utilisent des modèles faibles qui autorisent le réordonnancement des chargements et écritures vers des adresses différentes dans la plupart des combinaisons. L'ordre doit alors être demandé explicitement avec des instructions fence ou barrière, ou avec des opérations acquire et release.

Un exemple classique : le test du tampon d'écriture

Le cœur 0 exécute x = 1 puis lit y, tandis que le cœur 1 exécute y = 1 puis lit x, avec x et y initialement à 0. Sous cohérence séquentielle, au moins un cœur doit lire 1. Sous TSO, les deux peuvent lire 0, car chaque écriture peut encore se trouver dans le tampon d'écriture de son cœur lorsque le chargement de l'autre cœur s'exécute. Les algorithmes de verrouillage comme ceux de Dekker et de Peterson échouent exactement de cette manière, sauf si une barrière complète est placée entre l'écriture et le chargement. Sur un modèle faible, même la transmission de données au moyen d'un drapeau peut échouer si des barrières n'ordonnent pas les accès.

Cohérence mémoire et cohérence de cache

La cohérence de cache est une garantie portant sur une seule adresse : tous les cœurs s'accordent sur l'ordre des écritures à cet emplacement et finissent par voir la dernière valeur. Un modèle de cohérence mémoire couvre l'ordre entre adresses différentes, par exemple si une écriture dans x devient visible avant une écriture ultérieure dans y. Un système peut être entièrement cohérent au sens du cache et montrer pourtant de tels réordonnancements ; c'est pourquoi les barrières existent à côté des protocoles de cohérence. Les langages de haut niveau définissent leurs propres modèles, comme les atomiques de C11 et C++11, et les compilateurs les traduisent dans les instructions de barrière qu'exige le modèle matériel.

S'entraîner : questions sur Modèle de cohérence mémoire

Que définit un modèle de cohérence mémoire (memory consistency model) ?

  1. ALa taille des lignes et le nombre d’ensembles du cache
  2. BLe type de transistor utilisé pour la DRAM de la mémoire principale
  3. CDans quel ordre les lectures et écritures d’un cœur sur plusieurs adresses peuvent être vues par les autres cœurs
Afficher la réponse et l'explication

Réponse : C. Dans quel ordre les lectures et écritures d’un cœur sur plusieurs adresses peuvent être vues par les autres cœurs

Pour les performances, le CPU peut réordonner les opérations mémoire, par exemple en accumulant les écritures dans un tampon d’écriture (store buffer) ou en anticipant les lectures. Il est conçu pour que le résultat ne change pas au sein d’un cœur, mais les autres cœurs peuvent voir l’ordre modifié. Le modèle de cohérence mémoire définit quels réordonnancements peuvent survenir et constitue le contrat qui permet au programmeur d’écrire une synchronisation correcte.

Quelle est la caractéristique du modèle de cohérence mémoire de x86 (TSO, Total Store Order) ?

  1. AC’est le modèle le plus faible, qui autorise tous les réordonnancements de lectures et écritures
  2. BC’est la cohérence séquentielle elle-même, qui n’autorise aucun réordonnancement
  3. CC’est un modèle relativement fort, qui autorise uniquement qu’une lecture d’une autre adresse suivant une écriture soit vue avant celle-ci
Afficher la réponse et l'explication

Réponse : C. C’est un modèle relativement fort, qui autorise uniquement qu’une lecture d’une autre adresse suivant une écriture soit vue avant celle-ci

En TSO, l’ordre entre écritures, l’ordre entre lectures et l’ordre d’une écriture suivant une lecture sont préservés ; seule une lecture d’une autre adresse suivant une écriture peut la devancer. Ce modèle traduit directement l’existence du tampon d’écriture. Dans ce cadre, la plupart des programmes se comportent de façon intuitive, si bien que les barrières sont relativement rarement nécessaires sur x86.

Questions fréquentes

Quelle est la différence entre cohérence de cache et cohérence mémoire ?

La cohérence de cache garantit que tous les cœurs voient les écritures vers une même adresse dans le même ordre et finissent par lire la dernière valeur. La cohérence mémoire définit l'ordre dans lequel les accès à des adresses différentes peuvent être observés par les autres cœurs.

Que signifie TSO ?

TSO signifie total store order (ordre total des écritures), le modèle mémoire utilisé par les processeurs x86. Il autorise seulement qu'un chargement ultérieur vers une adresse différente soit observé avant une écriture antérieure, un effet du tampon d'écriture.

Pourquoi les programmes Arm et RISC-V ont-ils besoin de plus de barrières mémoire que les programmes x86 ?

Arm et RISC-V utilisent des modèles mémoire faibles qui permettent la plupart des réordonnancements de chargements et d'écritures vers des adresses différentes ; l'ordre doit donc être demandé explicitement. Le TSO de x86 conserve déjà la plupart des ordres, si bien que les barrières ne sont nécessaires que dans des cas comme une écriture suivie d'un chargement vers une autre adresse.

« Modèle de cohérence mémoire » dans les explications

Questions mentionnant « Modèle de cohérence mémoire » (3)

  1. Que définit un modèle de cohérence mémoire (memory consistency model) ?
  2. Quelle est la caractéristique du modèle de cohérence mémoire de x86 (TSO, Total Store Order) ?
  3. Quelle est la différence entre cohérence de cache et modèle de cohérence mémoire ?

Termes associés

Tampon d'écriture (store buffer) TSO (Total Store Order) Cohérence de cache Acquisition-libération (acquire-release) Barrière mémoire Cohérence séquentielle Compare-and-swap Course aux données (data race) Espionnage de bus (snooping) Faux partage (false sharing)

Retour au glossaire