« Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 68 :
[[File:Shared cache coherency.png|centre|Cohérence et caches partagés]]
 
On voit donc que la cohérence des caches n'est pas automatiquement maintenue avec des caches dédiés. Pour maintenir cette '''cohérence des caches''', on a inventé de quoi détecter les données périmées et les mettre à jour : des '''protocoles de cohérence des caches. Tout protocole de cohérence des caches doit répondre ce problème : comment les autres caches sont-ils au courant qu'ils ont une donnée périmée ? Pour cela, il existe deux solutions : l'espionnage du bus et l'usage de répertoires. CertainsIl protocoles utilisent un '''répertoire''', uneexiste tablebeaucoup de correspondance qui mémorise, pour chaque ligneprotocoles de cache, toutes les informations nécessaires pour maintenir sa cohérence. Cesdes protocolescaches, sontcomme surtoutvous utilisés sur les architectures distribuées : ils sontpouvez en effetjuger difficilespar àcette implémenter,liste tandisnon-exhaustive que leurs concurrents sont plus simples à implanter sur les machines à mémoire partagée.:
 
* MSI protocol ;
* MESI, aussi appelé Illinois protocol ;
* MOSI ;
* MOESI ;
* MERSI ;
* MESIF ;
* write-once ;
* Synapse ;
* Berkeley ;
* Firefly and Dragon protocol ;
* etc.
 
Tout protocole de cohérence des caches doit répondre ce problème : comment les autres caches sont-ils au courant qu'ils ont une donnée périmée ? Pour cela, il existe deux solutions : l'espionnage du bus et l'usage de répertoires. Certains protocoles utilisent un '''répertoire''', une table de correspondance qui mémorise, pour chaque ligne de cache, toutes les informations nécessaires pour maintenir sa cohérence. Ces protocoles sont surtout utilisés sur les architectures distribuées : ils sont en effet difficiles à implémenter, tandis que leurs concurrents sont plus simples à implanter sur les machines à mémoire partagée.
 
Avec l’'''espionnage du bus''', les caches interceptent les écritures sur le bus (qu'elles proviennent ou non des autres processeurs), afin de lettre à jour la ligne de cache ou de la périmer. Avec ces protocoles, chaque ligne de cache contient des bits qui indique si la donnée contenue est à jour ou périmée. Quand on veut lire une donnée, les circuits chargés de lire dans le cache vont vérifier ces bits. Si ces bits indiquent que la ligne de cache est périmée, le processeur va lire les données depuis la RAM ou les autres caches et mettre à jour la ligne de cache. La mise à jour de ces bits de validité a lieu à chaque écriture (y compris les caches des autres coeurs). Plus précisément, nos caches sont interconnectés entre eux, afin de maintenir la cohérence. Si un cache contient une donnée partagée, ce cache devra prévenir tous les autres caches qu'une donnée a été mise à jour. La mise à jour des données périmées peut être automatique ou basée sur une invalidation. Avec la '''mise à jour sur écriture''', les caches sont mis à jour automatiquement le plus tôt possible, avant même toute tentative de lecture. Avec l''''invalidation sur écriture''', toute écriture invalide les versions de la donnée dans les autres caches. Ces versions seront mises à jour quand le processeur les lira : il détecta que la ligne de cache a été invalidée et la mettra à jour si besoin.