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

Contenu supprimé Contenu ajouté
Ligne 60 :
[[File:Cohérence des caches.png|centre|vignette|upright=2|Cohérence des caches]]
 
Les caches partagés ne posent aucun problème de cohérence. Aveccar, avec eux, unela donnée n'est pas dupliquée en plusieurs exemplaires, mais n'est présente qu'une seule fois dans tout le cache. Ainsi, si on écrit celle-ci, on peut être sûr que les autres processeurs liront la donnée mise à jour et non une ancienne version. Vous remarquerez que sur le schéma, la mémoire RAM contient encore une autre version de la donnée (du moins, si on utilise un cache Write Back). Mais cela ne pose pas de problème :car les processeurs ne pourrontpeuvent pas accéder à la donnée en RAM, etmais irontseulement toujours chercherà la donnée dans le cache. Le cache est conçu pour. Au final, notre processeur aura donc toujours accès à la dernière valeur écrite par les autres processeurs.
 
[[File:Shared cache coherency.png|centre|vignette|upright=2|Cohérence et caches partagés]]
 
On voit donc que la cohérence des caches n'est pas automatiquement maintenue avec desles 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'''. Il existe beaucoup de protocoles de cohérence des caches, commeet vousnous pouvezne enles jugerverrons parpas cettetous listedans non-exhaustivece :chapitre.
* 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.
 
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 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 mettre à 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 cœurs). 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.
 
Avec l’'''espionnage du bus''', les caches interceptent les écritures sur le bus (qu'elles proviennent ou non des autres processeurs), afin de mettre à 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érifiervérifient ces bits. Si ces bits indiquent que la ligne de cache est périmée, le processeur va lirelit les données depuis la RAM ou les autres caches et mettre à jour la ligne de cache est mise à jour. La mise à jour de ces bits de validité a lieu à chaque écriture (y compris les caches des autres cœurs). Plus précisément, nosLes caches sont interconnectés entre eux, afinet deéchangent des informations pour maintenir la cohérence. Si un cache contient une donnée partagée, ceil cache devra prévenir tousprévient les autres caches qu'unequand la donnée a étéest 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.
 
===Les protocoles sans nouveaux états===
 
Pour commencer, nous allons voir le protocole de cohérence des caches le plus simple : le '''protocole SI'''. Ce protocoleIl ne fonctionne qu'avec un certain type de mémoires caches : lesdes caches ''Write-trough.'', Avec les caches Write Through, toute donnée écrite dans le cache est écrite en même temps dans la mémoire RAM et dans les niveaux de caches inférieurs s'ils existent. Le contenu de la mémoire est donc toujours à jour, mais ce n'est pas le cas pour les caches des autres processeurs.
 
[[File:Cohérence des caches write-through.png|centre|vignette|upright=2.5|Cohérence des caches write-through.]]
 
Dans ces conditions, seulsSeuls deux états suffisent pour décrire l'état d'une ligne de cache : Shared, qui indique que la ligne de cache est cohérente et Invalid, qui indique que la donnée est périmée. On obtient le protocole de cohérence des caches le plus simple qui soit : le protocole SI. Voici décrit en image le fonctionnement de ce protocole :
 
[[File:Diagramme d'état du protocole SI.png|centre|vignette|upright=2|Diagramme d'état du protocole SI.]]