Hiérarchie mémoire et caches

Découvre pourquoi un ordinateur associe de petites mémoires rapides à de grandes mémoires lentes, et comment les caches gardent les données nécessaires à un programme près du processeur. Compare les mémoires SRAM, DRAM et flash, retrouve des blocs dans des caches à correspondance directe et associatifs par ensembles, classe les défauts de cache et compare les politiques d’écriture. Calcule les taux de succès, le temps moyen d’accès mémoire et le coût des attentes mémoire, découvre comment la mémoire virtuelle et le TLB traduisent les adresses, et écris des boucles et des structures de données qui utilisent efficacement le cache.

IntermédiaireUnité 5 sur 6 de la formation Formation : Architecture informatique : processeur, mémoire et RISC-V

Ce que tu vas apprendre

  1. Décris comment les programmes réutilisent les données et le code, compare les technologies de mémoire qui les stockent et explique comment les petits niveaux rapides et les grands niveaux lents fonctionnent ensemble.
    • Repère la localité temporelle et la localité spatiale dans les programmes
      Repère les deux formes de localité dans les accès au code et aux données et explique pourquoi elles permettent à une petite mémoire rapide de satisfaire la plupart des accès.
    • Compare les mémoires SRAM, DRAM et flash
      Décris comment les mémoires SRAM, DRAM et flash stockent les bits et compare leur vitesse, leur densité, leur coût par bit, leur volatilité et leur place habituelle dans la hiérarchie.
    • Décris comment les niveaux de la hiérarchie fonctionnent ensemble
      Nomme les niveaux, des registres au stockage, utilise le vocabulaire des succès et des défauts de cache, et explique comment la hiérarchie donne l’illusion d’une grande mémoire rapide.
  2. Utilise les champs d’étiquette, d’index et de déplacement d’une adresse pour localiser un bloc, suis des séquences d’accès et compare les organisations de cache, de la correspondance directe à l’associativité totale.
    • Décompose une adresse en étiquette, index et déplacement
      Détermine la taille des champs d’un cache à correspondance directe à partir de sa capacité et de la taille des blocs, décompose une adresse en champs et calcule le stockage nécessaire au cache.
    • Suis les accès dans un cache à correspondance directe
      Suis une séquence d’adresses dans un petit cache à correspondance directe, consigne chaque succès ou défaut et le contenu du cache, et repère les blocs qui s’évincent mutuellement.
    • Utilise des caches associatifs par ensembles et totalement associatifs
      Localise les blocs dans des caches associatifs par ensembles à n voies et totalement associatifs, choisis une victime selon une politique de remplacement et mets en balance la baisse du taux de défauts avec le coût matériel et le temps d’accès en cas de succès.
  3. Décris ce qui se passe lors d’un défaut, classe les défauts selon leur cause, relie la taille du cache, la taille des blocs et l’associativité au taux de défauts, et compare les façons dont les caches traitent les écritures.
    • Traite les défauts de cache et classe leurs causes
      Décris les étapes d’un défaut de cache, classe les défauts à froid, de capacité et de conflit, et explique comment la taille du cache, la taille des blocs et l’associativité modifient chaque type de défaut.
    • Compare les politiques d’écriture des caches
      Explique comment les caches à écriture simultanée et différée maintiennent la mémoire à jour, le rôle des tampons d’écriture et des bits de modification, et la façon dont l’allocation sur écriture et l’écriture sans allocation traitent les défauts en écriture.
  4. Calcule les taux de succès, le temps moyen d’accès mémoire et les cycles d’attente mémoire, intègre-les dans le CPI et le temps d’exécution, et analyse les systèmes comportant plusieurs niveaux de cache.
    • Calcule le taux de succès et le temps moyen d’accès mémoire
      Calcule les taux de succès et de défauts ainsi que le temps moyen d’accès mémoire d’un cache, en tenant compte des proportions d’accès aux instructions et aux données, et utilise ces mesures pour comparer des conceptions.
    • Intègre les attentes mémoire dans le CPI et le temps d’exécution
      Ajoute les cycles d’attente mémoire à l’équation de performance du processeur, détermine le coût d’un cache pour un programme et explique pourquoi les processeurs plus rapides souffrent davantage d’une mémoire lente.
    • Analyse les caches multiniveaux
      Explique pourquoi les processeurs utilisent plusieurs niveaux de cache, distingue les taux de défauts locaux et globaux, et calcule le temps moyen d’accès mémoire et le CPI pour des hiérarchies à deux et trois niveaux.
  5. Décris comment les adresses virtuelles sont traduites en adresses physiques à l’aide d’une table des pages, pourquoi un défaut de page est un défaut traité par le système d’exploitation et comment le TLB accélère la traduction.
    • Traduis une adresse virtuelle à l’aide d’une table des pages
      Explique ce qu’apporte la mémoire virtuelle, décompose une adresse virtuelle en numéro de page et déplacement, traduis-la à l’aide d’une entrée de table des pages et décris ce qui se passe lors d’un défaut de page.
    • Accélère la traduction des adresses avec un TLB
      Explique comment le tampon de traduction d’adresses met les traductions en cache, suis un accès à travers le TLB, la table des pages et le cache, et découvre comment les accès au cache et la traduction se chevauchent.
  6. Organise les boucles et les structures de données pour que les programmes utilisent bien la hiérarchie mémoire, et applique le traitement par blocs et le préchargement pour réutiliser les données pendant qu’elles sont dans le cache.
    • Organise les boucles et les données pour favoriser la localité
      Ordonne les boucles en fonction du rangement des tableaux, évite les pas d’accès défavorables et choisis une organisation des données qui ne charge dans le cache que des données utiles.
    • Organise les calculs par blocs et utilise le préchargement
      Réorganise les boucles en blocs qui restent dans le cache pendant leur réutilisation, choisis une taille de bloc et explique comment les préchargements matériel et logiciel masquent la latence mémoire.

Hiérarchie mémoire et caches : cours

6 chapitres

1

Explique pourquoi les ordinateurs utilisent une hiérarchie mémoire

Les programmes utilisent à plusieurs reprises une petite partie de leur code et de leurs données. Cette réutilisation explique pourquoi un petit cache peut satisfaire la plupart des accès, même lorsque le programme entier est bien plus grand. Distingue la réutilisation dans le temps des accès à des adresses proches, compare les cellules des mémoires SRAM, DRAM et flash, puis relie ces technologies aux succès, aux défauts et aux transferts dans la hiérarchie. Le même schéma d’accès déterminera plus tard si une conception de cache ou une transformation de boucle est utile.

1.1 Comment les programmes réutilisent des données proches

Un cache fonctionne parce que le prochain accès mémoire est souvent lié à un accès récent. Pendant un court intervalle, la plupart des programmes n’utilisent qu’une petite partie de leur espace d’adressage. Cette propriété est la localité. Un cache garde cette partie active près du processeur, où il peut traiter rapidement les accès.

Réutilisation dans le temps et dans l’espace

La localité temporelle consiste à réutiliser un élément peu après y avoir accédé. Une boucle charge à plusieurs reprises les instructions de son corps. Un total cumulé est lu et mis à jour de nombreuses fois. Garder ces éléments disponibles évite de les chercher à nouveau dans un niveau plus lent.

La localité spatiale consiste à accéder à des éléments situés à des adresses proches. Le parcours d’un tableau lit des éléments adjacents, et un code sans branchement charge des instructions successives. Un cache exploite cette propriété en chargeant un bloc entier, aussi appelé ligne de cache, lors d’un défaut. Les octets voisins arrivent avant que le programme ne les demande.

Ces propriétés peuvent se manifester ensemble. Les instructions d’une boucle sont adjacentes et s’exécutent à plusieurs reprises : le flux d’instructions présente donc une localité spatiale et temporelle. Un élément de tableau lu exactement une fois ne présente aucune réutilisation temporelle, même si le parcours du tableau environnant présente une localité spatiale.

Compter les blocs lors du parcours d’un tableau

Considère cette boucle C avec des entiers de 4 octets et des blocs de cache de 64 octets :

for (int i = 0; i < 1000; i++) {
    sum += a[i];
}

Un bloc contient 64/4=16 entiers. Le tableau occupe 1000×4=4000 octets. Si son premier élément est aligné sur une frontière de bloc, le parcours touche ⌈4000/64⌉=63 blocs : 62 blocs entiers et un bloc partiel.

Dans un cache initialement vide, sans préchargement ni interférence, le premier accès à chaque bloc produit un défaut. Les accès aux autres éléments de ce bloc réussissent. Le tableau provoque donc 63 défauts en 1000 accès, soit environ 6,3 %. Compter un défaut par élément reviendrait à ignorer toutes les données voisines utiles chargées à chaque défaut.

Les variables du code source sum et i sont fréquemment réutilisées. Un compilateur les conserve toutefois généralement dans des registres ; leur réutilisation dans le code source ne produit donc pas nécessairement d’accès au cache de données. Pour estimer le trafic du cache, analyse les accès mémoire exécutés par le programme compilé.

L’ensemble de travail doit tenir et ses blocs doivent coexister

L’ensemble de travail est l’ensemble des blocs utilisés pendant une fenêtre de temps choisie. S’ils tiennent dans le cache et que les règles de placement leur permettent de coexister, les accès répétés réussissent pour la plupart après les chargements initiaux. La fenêtre de temps compte : un programme entier peut être immense alors qu’une boucle active n’utilise que quelques blocs.

La capacité seule ne suffit pas. Deux blocs très utilisés peuvent correspondre à une même entrée d’un cache à correspondance directe et s’évincer mutuellement alors que d’autres entrées restent vides. Un ensemble de travail peut donc tenir dans le cache en nombre d’octets sans pouvoir y rester.

Les nœuds dispersés d’une liste chaînée et les recherches aléatoires dans une grande table de hachage présentent souvent une faible localité spatiale. Un parcours par colonnes d’un tableau rangé par lignes saute également de nombreux éléments voisins. Ces schémas chargent des octets qui risquent de ne pas être utilisés avant leur éviction. Le matériel exploite la localité du schéma d’accès ; modifier l’organisation ou le parcours du programme peut rendre utile une plus grande partie de chaque bloc chargé.

Points clés

  • La localité temporelle réutilise un élément ; la localité spatiale accède à des adresses proches.
  • Le chargement d’un bloc entier permet aux accès ultérieurs à des octets proches de réussir.
  • Un ensemble de travail doit tenir dans le cache et ses blocs doivent pouvoir coexister selon les règles de placement.
  • Les variables du code source conservées dans des registres ne génèrent pas d’accès au cache de données.

1.2 Cellules mémoire, transferts et compromis

Les technologies de mémoire font des compromis entre vitesse, densité, coût et persistance. Le processeur a besoin d’accéder rapidement à une petite quantité de données et de disposer d’un espace abordable pour une quantité bien plus grande. Les mémoires SRAM, DRAM et flash répondent chacune à une partie de ce besoin.

Comparer les cellules
TechnologieStockage d’un bitRafraîchissement et alimentationRôle principal
SRAMUn circuit stable, généralement de six transistorsPas de rafraîchissement ; perd les données sans alimentationCaches intégrés à la puce
DRAMCharge dans un condensateur, accessible par un transistorRafraîchissement périodique ; perd les données sans alimentationMémoire principale
Mémoire flash NANDUne cellule non volatile dont l’état est programmé électriquementConserve les données sans alimentation ; endurance limitée en écritureStockage

Une cellule SRAM est rapide, mais occupe une surface importante, ce qui rend la SRAM relativement coûteuse par bit. Les cellules DRAM sont plus petites, de sorte que la DRAM offre une capacité supérieure à un coût par bit inférieur. Leur charge se dissipe. Le rafraîchissement lit et restaure les lignes dans un délai fixe ; la DDR4 à température normale utilise un délai de 64 ms. Dans SRAM, « statique » signifie que le rafraîchissement est inutile, et non que les données persistent après une coupure d’alimentation.

Pourquoi le temps d’accès à la DRAM varie

La DRAM est organisée en banques, chacune comportant des lignes et des colonnes. L’activation d’une ligne la copie dans un tampon de ligne. Les lectures et les écritures sélectionnent ensuite des colonnes de cette ligne ouverte. Pour ouvrir une autre ligne dans la même banque, celle-ci doit d’abord être préchargée. Un accès à une ligne déjà ouverte évite ce changement de ligne.

Des colonnes consécutives peuvent être transférées en rafale, ce qui convient au chargement d’un bloc de cache. Répartir les demandes entre les banques et les canaux permet aux transferts de se chevaucher. La mémoire DDR transfère des données sur les deux fronts d’horloge. Ces caractéristiques augmentent le débit de livraison des données sans supprimer l’attente des premières données.

Distinguer latence et bande passante

La latence est le délai avant l’arrivée des premières données. La bande passante est la quantité transférée par unité de temps. Une interface à forte bande passante peut malgré tout présenter un long délai initial.

Par exemple, un canal DDR5-4800 doté d’un chemin de données total de 64 bits transporte 8 octets par transfert. Son débit de crête est de 4800×106×8=38,4×109 octets/s, soit 38,4 GB/s. La bande passante soutenue d’une application peut être inférieure, car les commandes, les changements de ligne et d’autres opérations prennent du temps.

Si une requête attend 60 ns puis reçoit un bloc de 64 octets à 16 GB/s, le débit de transfert est de 16 octets/ns. Le transfert prend 64/16=4 ns, soit environ 64 ns au total. Améliorer seulement la bande passante réduit les 4 ns du transfert, pas les 60 ns initiaux.

La mémoire flash conserve les données mais traite différemment les écritures

La mémoire flash NAND lit et programme des pages de plusieurs KiB. Pour réutiliser une page programmée, il faut effacer le bloc d’effacement plus grand qui la contient, composé de nombreuses pages. La lecture d’une page prend généralement des dizaines de microsecondes, sa programmation de quelques centaines de microsecondes à quelques millisecondes, et l’effacement des millisecondes.

Les cycles de programmation et d’effacement usent les cellules. La mémoire flash dense à plusieurs bits supporte souvent quelques milliers de cycles, tandis que les cellules à un bit peuvent en supporter environ 100 000. Les contrôleurs utilisent la répartition de l’usure pour distribuer les écritures entre les blocs.

Pour donner un ordre de grandeur, l’accès à la SRAM prend environ 1 ns, celui à la DRAM environ 50 à 100 ns, la lecture en mémoire flash NAND environ 25 à 100 µs et l’accès au disque environ 5 à 10 ms. Les valeurs varient selon les appareils. La hiérarchie associe ces technologies parce qu’aucune ne peut réunir à elle seule leurs avantages en matière de vitesse, de capacité et de prix.

Points clés

  • Les mémoires SRAM et DRAM sont volatiles ; la mémoire flash conserve les données sans alimentation.
  • Le rafraîchissement de la DRAM restaure la charge qui se dissipe, tandis que les tampons de ligne et les rafales améliorent l’efficacité des accès.
  • La latence mesure le temps d’attente initial ; la bande passante mesure le débit de transfert.
  • La mémoire flash programme des pages et efface des blocs plus grands.
  • La répartition de l’usure distribue l’usure due aux programmations et aux effacements entre les blocs de mémoire flash.

1.3 Suivre un accès dans la hiérarchie

La hiérarchie mémoire place de petits espaces de stockage rapides près du processeur et des espaces de plus en plus grands à mesure que l’on s’en éloigne. La localité permet aux petits niveaux de traiter une grande partie des demandes, tandis que les niveaux inférieurs fournissent la capacité.

Niveaux et unités de transfert

Un parcours typique passe par les registres, L1, L2, L3, la mémoire principale et le stockage. L1 possède généralement des caches séparés pour les instructions et les données, d’environ 32 à 64 KiB chacun par cœur. L2 occupe souvent plusieurs centaines de KiB à quelques MiB par cœur, tandis que L3 est souvent partagé et contient plusieurs à plusieurs dizaines de MiB. La mémoire principale contient de nombreux GiB et le stockage plusieurs centaines de GB ou plus. Les tailles et les modes de partage varient selon les conceptions.

Sur un processeur fonctionnant à près de 3 GHz, les latences de chargement représentatives sont d’environ 4 à 5 cycles pour L1, 12 à 15 pour L2, 30 à 50 pour L3 et 200 à 300 pour la DRAM. Un cache L1 peut accepter une nouvelle demande à chaque cycle même lorsqu’une demande prend plusieurs cycles pour aboutir : le débit et la latence décrivent des propriétés différentes.

Les données circulent dans les caches par blocs, généralement de 64 octets. La mémoire virtuelle utilise des pages, généralement de 4 KiB, pour transférer leur contenu entre la mémoire et le stockage. Une ligne de cache et une page remplissent des fonctions de regroupement similaires à des échelles différentes ; ce ne sont pas les mêmes unités de transfert.

Succès, défauts et durée

Un succès signifie qu’un niveau contient les données demandées. Un défaut signifie qu’il doit obtenir les données du niveau inférieur. Les deux termes concernent le niveau consulté : un défaut de L1 peut encore être un succès dans L2.

Le taux de succès est le nombre de succès divisé par le nombre d’accès, et le taux de défauts vaut un moins le taux de succès. Le temps d’accès en cas de succès comprend la consultation du niveau et la vérification du succès de la demande. La pénalité de défaut de cache est le temps supplémentaire nécessaire, lors d’un défaut, pour obtenir et fournir le bloc.

Supposons qu’un cache simplifié ait un temps d’accès en cas de succès de 1 cycle, un taux de succès de 97 % et une pénalité supplémentaire de défaut de 100 cycles. Chaque accès paie 1 cycle, tandis que 3 % paient 100 cycles de plus :

1+0,03×100=4 cycles.

Un défaut prend 101 cycles dans cet exemple. Utiliser 100 comme temps total d’un défaut reviendrait à compter la recherche initiale de façon incohérente. Même avec un taux de succès élevé, les défauts coûteux restent visibles dans la moyenne.

Qui gère chaque niveau ?

Le compilateur affecte les valeurs appropriées aux registres. Le matériel du cache déplace automatiquement les blocs lors des chargements, des rangements et des chargements d’instructions. Les programmes désignent des adresses ; ils ne sélectionnent pas les entrées du cache. Le système d’exploitation gère les correspondances de la mémoire virtuelle avec l’aide du matériel et traite les pages qui doivent être chargées en mémoire principale.

Séparer les instructions des données dans L1 permet à un pipeline de charger une instruction et d’accéder à des données en même temps sans se disputer un port de cache. Les caches inférieurs sont généralement unifiés et stockent à la fois des blocs d’instructions et de données.

Certaines hiérarchies sont inclusives : un bloc présent à un niveau supérieur possède aussi une copie à un niveau inférieur. D’autres sont exclusives ou non inclusives ; une copie dans chaque cache inférieur n’est donc pas garantie. Représente la hiérarchie comme un chemin de recherche et de transfert, et non comme une garantie que tous les niveaux contiennent des sous-ensembles identiques.

Agrandir L1 peut réduire les défauts, mais augmenter le délai d’accès et la consommation d’énergie. L’ajout de caches inférieurs plus grands permet de garder L1 rapide tout en traitant un grand nombre de ses défauts avant d’atteindre la DRAM. Évalue ce compromis à l’aide du temps d’accès, pas seulement de la capacité.

Points clés

  • Un succès ou un défaut concerne le niveau consulté.
  • Le temps d’accès en cas de succès est payé à chaque recherche ; la pénalité de défaut s’ajoute en cas de défaut.
  • Les caches transfèrent des blocs, tandis que la mémoire virtuelle utilise des pages.
  • Des caches L1 séparés pour les instructions et les données permettent des accès simultanés du pipeline.
  • L’inclusion des caches est un choix de conception.
  • Une capacité supérieure doit être mise en balance avec le temps d’accès en cas de succès et la consommation d’énergie.
2

Retrouve des données dans des caches à correspondance directe et associatifs par ensembles

Une adresse mémoire doit indiquer au cache où chercher et quels octets renvoyer. Décompose les adresses en champs, suis la manière dont les demandes remplacent les blocs, puis donne à chaque bloc davantage de possibilités de placement grâce aux ensembles et aux voies. De petites traces rendent visibles les règles du matériel : l’accès à un autre octet d’un bloc chargé peut réussir, tandis que l’accès à un bloc utilisé à plusieurs reprises peut échouer après un conflit. Ces règles de recherche déterminent aussi le nombre d’étiquettes et de bits de contrôle que le cache doit stocker.

2.1 Trouver l’étiquette, l’index et le déplacement

Une adresse d’octet désigne un octet en mémoire. Un cache charge un bloc entier : la recherche repère donc d’abord ce bloc, puis sélectionne les octets demandés à l’intérieur. Dans un cache à correspondance directe, chaque bloc ne possède qu’une seule entrée possible.

Décomposer l’adresse selon le rôle des champs

Pour une taille de bloc de 2b octets, les b bits de poids faible de l’adresse forment le déplacement. Diviser l’adresse de l’octet par la taille du bloc et ignorer le reste donne l’adresse du bloc. Le reste est le déplacement.

Si le cache possède E entrées, l’index de l’entrée est

index=adresse du bloc mod E.

Lorsque le nombre d’entrées est une puissance de deux, l’index est le groupe de bits de l’adresse situé immédiatement au-dessus du déplacement. Les bits de poids fort restants forment l’étiquette, qui indique au cache lequel des nombreux blocs partageant un index est présent.

L’ordre des champs, des bits de poids fort aux bits de poids faible, est étiquette | index | déplacement. Pour une adresse de A bits :

b=log⁡2(taille du bloc en octets),s=log⁡2E,t=A−s−b.

Utilise le nombre d’entrées pour calculer l’index. Prendre le logarithme de la capacité en octets reviendrait à compter une seconde fois les bits de déplacement.

Étudier un exemple de 16 KiB

Un cache à correspondance directe de 16 KiB avec des blocs de 64 octets possède 16384/64=256 entrées. Le déplacement occupe 6 bits, l’index 8 bits et l’étiquette 32−8−6=18 bits pour des adresses de 32 bits.

Pour l’adresse d’octet 0x1234ABCD, les 6 bits de poids faible donnent le déplacement 13, soit 0x0D. Retirer ces bits donne l’adresse de bloc 0x48D2AF. Ses 8 bits de poids faible sont 0xAF ; l’index est donc 175. Les bits restants donnent l’étiquette 0x48D2.

L’adresse de l’octet peut être reconstruite à partir de ces champs : concatène l’étiquette, l’index de 8 bits et le déplacement de 6 bits. La largeur des champs compte, car un chiffre hexadécimal représente 4 bits ; les frontières ne tombent pas nécessairement entre deux chiffres hexadécimaux.

Une étiquette correspondante exige une entrée valide

Chaque entrée stocke des données, une étiquette et un bit de validité. L’index sélectionne l’entrée. Un succès exige à la fois un bit de validité activé et l’égalité entre l’étiquette stockée et l’étiquette demandée. Au démarrage, une entrée peut contenir des bits quelconques ; le bit de validité empêche de les prendre pour un bloc chargé.

Une fois le bloc présent, les accès à ses autres octets réussissent aussi. Un succès ne nécessite pas l’adresse exacte de l’octet utilisé pour charger le bloc.

Compter les métadonnées séparément

La capacité indiquée d’un cache ne compte normalement que les données. Ici, chaque entrée contient 512 bits de données, 18 bits d’étiquette et 1 bit de validité, soit 531 bits. Le stockage total est de

256×531=135936 bits.

Les données seules utilisent 131 072 bits. Les étiquettes et la validité ajoutent 4 864 bits, soit environ 3,7 % du stockage des données. Une conception à écriture différée nécessite aussi des bits de modification ; des conceptions plus complexes nécessitent d’autres états de contrôle.

L’index utilise les bits de poids faible de l’adresse du bloc afin que les blocs successifs se répartissent sur des entrées successives. Une adresse plus large ne modifie pas la largeur du déplacement et de l’index lorsque la capacité et la taille des blocs restent fixes ; les bits supplémentaires allongent l’étiquette.

Points clés

  • Calcule le nombre d’entrées en divisant la capacité de données par la taille d’un bloc.
  • Les bits de poids faible de l’adresse sélectionnent le déplacement de l’octet ; les bits suivants sélectionnent l’entrée.
  • Un succès exige une entrée valide et une étiquette correspondante.
  • La capacité de données annoncée exclut les étiquettes et les bits de contrôle.

2.2 Suivre une trace de cache à correspondance directe

Une trace de cache indique comment chaque accès modifie les blocs stockés. Garde un état distinct pour chaque entrée et mets-le à jour immédiatement après chaque défaut. La demande suivante utilise le cache mis à jour, et non son état initial.

Préparer la trace

Prenons un cache à correspondance directe de 64 octets comportant quatre entrées de 16 octets. Il est initialement vide. Pour chaque adresse d’octet, divise par 16 pour trouver le bloc, puis calcule le numéro de bloc modulo 4 pour obtenir l’index. L’étiquette est le numéro de bloc divisé par 4, sans sa partie fractionnaire. Le déplacement occupe 4 bits et l’index 2 bits.

Lors d’une lecture, examine l’entrée sélectionnée. Si elle est valide et que l’étiquette correspond, consigne un succès. Sinon, consigne un défaut, remplace le bloc et l’étiquette de cette entrée, puis active son bit de validité. Dans un cache à correspondance directe, aucun choix de remplacement n’est possible.

Suivre les huit accès
Adresse d’octetBlocIndexÉtiquetteRésultatBloc restant dans l’entrée sélectionnée
0x00000Défaut0
0x04000Succès0
0x40401Défaut4
0x00000Défaut0
0x14110Défaut1
0x44401Défaut4
0x08000Défaut0
0x84802Défaut8

Le premier accès remplit l’entrée 0 avec le bloc 0. L’adresse suivante, 0x04, se trouve toujours dans ce bloc de 16 octets : l’accès réussit donc bien qu’elle désigne un autre octet. 0x40 appartient au bloc 4. Il a le même index que le bloc 0, mais une étiquette différente ; il remplace donc le bloc 0.

Le second accès à 0x00 échoue donc. Une utilisation antérieure ne suffit pas à garantir un succès : le bloc doit encore être présent. La demande à l’adresse 0x14 charge le bloc 1 dans l’entrée 1, sans modifier l’entrée 0.

Ensuite, 0x44 charge à nouveau le bloc 4 dans l’entrée 0. 0x08 nécessite le bloc 0 et évince le bloc 4. Enfin, 0x84 charge le bloc 8 dans cette même entrée. À la fin, l’entrée 0 contient le bloc 8 et l’entrée 1 contient le bloc 1 ; les entrées 2 et 3 restent invalides.

Interpréter le comportement

Il y a un succès et sept défauts ; le taux de succès est donc de 1/8=12,5%. Les blocs 0, 4 et 8 se disputent l’entrée 0. Le cache possède quatre entrées, mais ce schéma d’accès n’en utilise que deux. Les évictions répétées sont dues à des conflits de correspondance, et non à un manque de stockage total pour les quatre blocs distincts.

Le chargement d’un bloc rend tous ses octets disponibles. Lors d’un parcours séquentiel, un défaut peut donc servir de nombreux éléments suivants. Ici, les accès en conflit suppriment à plusieurs reprises cet avantage avant que l’octet voisin suivant ne soit demandé.

Pour obtenir une trace fiable, indique explicitement les adresses d’octets et les numéros de blocs. Appliquer directement le modulo 4 à l’adresse d’octet omet la division par la taille du bloc et envoie les demandes vers les mauvaises entrées. Consigne le remplacement même lorsque le nouveau bloc a déjà été chargé auparavant : chaque défaut installe le bloc demandé et son étiquette dans l’entrée sélectionnée.

Points clés

  • Mets à jour le contenu du cache après chaque défaut.
  • Les accès à différentes adresses d’octets d’un même bloc présent dans le cache réussissent.
  • Un accès à un bloc déjà consulté peut échouer après son éviction.
  • Les conflits de correspondance peuvent provoquer des défauts alors que d’autres entrées restent vides.
  • L’exemple donne un succès en huit accès, soit un taux de succès de 12,5 %.

2.3 Donner aux blocs davantage de possibilités de placement

Un cache associatif par ensembles offre plusieurs entrées possibles à un bloc sans chercher dans tout le cache. L’index sélectionne un ensemble, et le bloc peut occuper n’importe quelle voie de cet ensemble. Cela réduit les conflits entre les blocs qui partagent un index.

Calculer les ensembles et les champs

Pour une capacité de données C, une taille de bloc B et une associativité n :

blocs=C/B,ensembles=C/(Bn).

L’index de l’ensemble est l’adresse du bloc modulo le nombre d’ensembles. Le déplacement dépend toujours uniquement de la taille du bloc. L’étiquette contient les bits de poids fort restants.

Un cache de 32 KiB à 8 voies avec des blocs de 64 octets possède 512 blocs et 64 ensembles. Avec des adresses de 32 bits, le déplacement, l’index et l’étiquette occupent 6, 6 et 20 bits. L’adresse 0x1234ABCD a pour déplacement 13, ensemble 47 et étiquette 0x1234A.

À capacité et taille de bloc constantes, doubler l’associativité divise par deux le nombre d’ensembles. Un bit d’index devient un bit d’étiquette ; aucune capacité de données n’est ajoutée.

OrganisationPlacement autoriséIndex
Correspondance directeUne entréeSélectionne cette entrée
n voiesN’importe laquelle des n voies d’un ensembleSélectionne cet ensemble
Totalement associatifN’importe quelle entrée du cachePas de champ d’index

La recherche compare en parallèle l’étiquette à toutes les étiquettes valides de l’ensemble choisi. Une voie dont l’étiquette correspond fournit les données par l’intermédiaire d’un sélecteur. Davantage de voies exigent davantage de comparaisons et de matériel de sélection, ce qui peut augmenter le temps d’accès en cas de succès et la consommation d’énergie.

Ne remplacer un bloc que lorsque l’ensemble est plein

Utilise d’abord une voie invalide. Lorsque toutes les voies sont occupées, LRU évince le bloc dont l’accès le plus récent est le plus ancien. Mets à jour l’ordre d’utilisation aussi bien lors des succès que des chargements. Un ensemble à 2 voies ne nécessite qu’un bit pour repérer sa voie LRU ; les ensembles plus grands utilisent souvent des approximations pseudo-LRU.

FIFO évince le bloc chargé en premier, même s’il a été utilisé récemment. Le remplacement aléatoire choisit une victime sans conserver l’ordre complet des utilisations. Il est simple et peut offrir des performances proches de LRU dans les grands caches.

Reprendre la petite trace avec deux voies

Le cache de 64 octets avec des blocs de 16 octets possède maintenant deux ensembles de deux voies. Les blocs 0, 4 et 8 correspondent à l’ensemble 0, tandis que le bloc 1 correspond à l’ensemble 1. Pour 0x00, 0x04, 0x40, 0x00, 0x14, 0x44, 0x08, 0x84, les résultats sont défaut, succès, défaut, succès, défaut, succès, succès, défaut.

Les blocs 0 et 4 peuvent coexister ; les accès répétés à ces blocs réussissent donc. Juste avant le dernier accès, le bloc 0 a été utilisé plus récemment que le bloc 4. Avec LRU, le chargement du bloc 8 évince le bloc 4. Quatre accès sur huit réussissent, contre un dans la version à correspondance directe.

L’associativité ne peut ni supprimer les défauts à froid ni faire tenir un ensemble de travail plus grand que la capacité. Elle ne peut pas non plus empêcher les conflits lorsque plus de n blocs très utilisés se disputent un ensemble à n voies. Un cycle répété de n+1 blocs de ce type peut provoquer un défaut LRU à chaque accès. Ajouter du remplissage aux tableaux peut modifier leur correspondance avec les ensembles ; augmenter le nombre de voies n’est qu’une réponse possible à un problème de conflit.

Points clés

  • Le nombre d’ensembles est égal à la capacité de données divisée par la taille des blocs et par le nombre de voies.
  • Une associativité plus élevée assouplit le placement, sans modifier la capacité de données.
  • LRU suit les accès ; FIFO suit l’ordre d’insertion.
  • Remplis les voies invalides avant de remplacer des blocs valides.
  • Les caches totalement associatifs n’ont pas de champ d’index, mais subissent encore des défauts à froid et de capacité.
  • Davantage de voies peuvent réduire les défauts de conflit, au prix d’un coût matériel et d’un délai supplémentaires.
3

Explique les défauts de cache et les politiques d’écriture

Un défaut peut provenir d’une première utilisation, d’une capacité limitée ou de blocs qui se disputent les mêmes emplacements. Déterminer sa cause aide à comprendre quelles modifications de conception peuvent le réduire. Les rangements ajoutent un second problème : la hiérarchie doit décider quand les données modifiées atteignent le niveau suivant et ce qui se passe si le bloc est absent. Suis le traitement des défauts en lecture, les politiques d’écriture, les tampons et les évictions de blocs modifiés pour relier l’état du cache au trafic et aux délais qu’il produit.

3.1 Expliquer la cause d’un défaut

Un défaut de cache est un événement qui possède à la fois un mécanisme et une cause. Le mécanisme décrit comment la demande est traitée. La cause explique pourquoi le bloc nécessaire était absent et quelle modification de conception pourrait aider.

Traiter un défaut en lecture

Dans un pipeline simple à exécution dans l’ordre, le cache détecte une entrée invalide ou une étiquette non correspondante, et le processeur se bloque. Le cache demande le bloc au niveau suivant. Si la victime choisie est modifiée, ses données modifiées doivent être conservées par écriture différée. Le bloc qui arrive est installé avec son étiquette et son bit de validité, puis l’accès en attente se termine. De même, lors d’un défaut du cache d’instructions, le processeur attend le bloc de l’instruction puis charge à nouveau celle-ci.

La technique du mot critique en premier demande en premier le mot nécessaire dans le bloc renvoyé. Le redémarrage anticipé permet à l’exécution de reprendre dès l’arrivée de ce mot. Un cache non bloquant peut traiter d’autres succès et suivre les défauts en attente pendant qu’un processeur à exécution dans le désordre effectue un travail indépendant. Ces mécanismes réduisent l’attente ; ils ne font pas disparaître la dépendance initiale aux données.

Utiliser les trois C
Type de défautPourquoi le bloc est absentTest de diagnostic
À froidC’est son premier accèsIl échouerait même avec une capacité illimitée
De capacitéLes blocs actifs dépassent l’espace disponibleUn cache LRU totalement associatif de même taille subit aussi un défaut
De conflitLes restrictions de placement l’ont évincéUn cache LRU totalement associatif de même taille donne un succès

Applique d’abord le test du premier accès. Le premier accès à un bloc produit un défaut à froid même si son entrée de destination est déjà occupée. Pour les défauts ultérieurs, compare le cache réel à un cache LRU totalement associatif de même capacité de données et de même taille de bloc, les deux recevant le même historique d’accès.

Dans la trace précédente à quatre entrées, les blocs 0, 4, 1 et 8 provoquent chacun un défaut à froid. Le cache à correspondance directe subit aussi des défauts lors des accès répétés aux blocs 0 et 4. Un cache totalement associatif à quatre entrées peut conserver les quatre blocs distincts : ces trois défauts sur des accès répétés sont donc des défauts de conflit. Il n’y a pas de défaut de capacité.

Choisir une modification qui traite la cause

Augmenter la capacité peut permettre de conserver un ensemble de travail plus grand. Augmenter l’associativité peut permettre à des blocs en conflit de coexister. Augmenter la taille des blocs peut exploiter la localité spatiale en chargeant davantage de données voisines utiles à chaque remplissage.

La taille des blocs produit des effets opposés. À capacité de données fixe, des blocs plus grands signifient moins de blocs présents. Les octets inutilisés occupent de l’espace dans le cache, des blocs utiles sans rapport peuvent être évincés et chaque transfert peut prendre plus de temps. Le taux de défauts baisse souvent d’abord lorsque la taille des blocs augmente, puis remonte quand ces coûts dépassent le bénéfice de la localité spatiale.

Un cache plus grand peut aussi avoir un temps de recherche plus long, et des voies supplémentaires nécessitent davantage de matériel de comparaison. Évalue les modifications à partir du temps d’accès moyen, en tenant compte du temps d’accès en cas de succès et de la pénalité de défaut, au lieu de supposer qu’un taux de défauts plus bas garantit une conception plus rapide.

Dans les systèmes multicœurs, l’invalidation consécutive à l’écriture d’un autre cœur peut provoquer des défauts de cohérence. Le préchargement peut charger un bloc avant son premier accès sur demande, masquant un défaut sur demande qu’une capacité supplémentaire seule ne peut pas éviter.

Points clés

  • Classe les premiers accès comme des défauts à froid avant de vérifier les autres causes.
  • Utilise un cache LRU totalement associatif de même taille pour distinguer les défauts de capacité des défauts de conflit.
  • Des blocs plus grands mettent en balance le bénéfice de la localité spatiale avec un nombre réduit de blocs présents et des transferts plus longs.
  • Le redémarrage anticipé, le mot critique en premier et les caches non bloquants réduisent l’attente de différentes façons.
  • Compare le temps d’accès complet pour évaluer une amélioration du taux de défauts.

3.2 Décider quand les rangements atteignent le niveau suivant

Un rangement modifie une valeur ; la hiérarchie a donc besoin d’une règle pour transmettre cette modification vers le niveau inférieur. Deux choix distincts interviennent : que faire lorsque le rangement réussit et que faire lorsqu’il échoue.

Écriture simultanée et écriture différée
PolitiqueAction en cas de succès en écritureEffet sur le niveau suivant
Écriture simultanéeMettre à jour le cache et transmettre le rangement au niveau inférieurChaque rangement génère une mise à jour du niveau inférieur
Écriture différéeMettre à jour le cache et marquer son bloc comme modifiéUn bloc modifié est envoyé au niveau inférieur lors de son éviction

Un bit de modification indique qu’un bloc à écriture différée contient des changements qui n’ont pas encore été écrits au niveau suivant. Une victime non modifiée n’a pas besoin d’être réécrite. Les données modifiées d’une victime doivent être conservées avant que son entrée puisse être réutilisée. Les chargements du processeur obtiennent la nouvelle valeur dans le cache même lorsque la copie du niveau inférieur est plus ancienne.

Pour 100 rangements dans une même variable de 4 octets présente dans le cache, l’écriture simultanée sans regroupement envoie 100 écritures, soit 400 octets de données utiles. L’écriture différée peut réunir ces modifications dans une seule écriture d’un bloc de 64 octets lors de son éviction. Cette comparaison compte les données utiles des mises à jour, sans le chargement initial ni le surcoût du protocole.

Le bénéfice dépend de la réutilisation. Des écritures répétées dans un même bloc donnent à l’écriture différée l’occasion de regrouper les mises à jour ; des écritures dispersées sur de nombreux blocs peuvent entraîner de nombreuses évictions de blocs modifiés. Les caches inférieurs utilisent couramment l’écriture différée pour limiter le trafic vers la DRAM. Les caches de données L1 peuvent utiliser l’une ou l’autre politique.

Un tampon d’écriture masque l’attente, pas le trafic

Un tampon d’écriture met en file les écritures en attente vers le niveau inférieur. Avec l’écriture simultanée, le processeur peut continuer dès qu’un rangement est entré dans le tampon, sans attendre la fin de l’écriture en mémoire inférieure. Le niveau inférieur rattrape son retard à mesure que les écritures quittent le tampon ; il peut temporairement être en retard sur la valeur du cache.

Le tampon a une capacité limitée. Si les rangements arrivent assez longtemps plus vite que le niveau inférieur ne les accepte, il se remplit et le processeur se bloque. Un tampon modifie le moment où le processeur attend, pas la bande passante soutenable de la destination.

Sans tampon ni chevauchement, si 10 % des instructions sont des rangements et que chaque rangement ajoute 100 cycles d’attente, un CPI de base de 1 devient 1+0,1×100=11. Le tampon peut masquer une grande partie de ce délai lorsque la destination suit le rythme en moyenne.

Traiter séparément un défaut en écriture

L’allocation sur écriture charge le bloc absent dans le cache, puis effectue le rangement. Elle s’associe naturellement à l’écriture différée, car les accès et écritures ultérieurs peuvent réutiliser ce bloc. L’écriture sans allocation sur écriture transmet le rangement au niveau inférieur sans remplir ce cache. Elle s’associe naturellement à l’écriture simultanée et peut éviter d’évincer des blocs utiles lors d’un flux de sortie unique.

Ces choix de politique sont indépendants. Savoir qu’un cache utilise l’écriture simultanée ne suffit pas à déterminer si un défaut en écriture alloue une ligne ; une trace doit préciser les deux politiques.

Un défaut dans un cache à écriture différée qui choisit une victime modifiée implique une sortie de données en plus du chargement entrant, ce qui augmente la pénalité, sauf si des tampons ou un chevauchement masquent une partie du travail. Les autres cœurs et les périphériques d’entrée-sortie ont aussi besoin d’une vue cohérente lorsque la mémoire inférieure contient des données périmées. Les mécanismes de cohérence et du système coordonnent cette visibilité ; un bit de modification ne fait qu’enregistrer les changements en attente.

Points clés

  • L’écriture simultanée transmet chaque rangement au niveau inférieur ; l’écriture différée attend la réécriture du bloc modifié.
  • Un bit de modification distingue les blocs modifiés des blocs non modifiés.
  • Les tampons d’écriture masquent la latence jusqu’à ce qu’ils soient pleins ; ils ne créent pas de bande passante.
  • L’allocation sur écriture et l’écriture sans allocation définissent le comportement en cas de défaut en écriture indépendamment de la politique en cas de succès.
  • L’éviction d’un bloc modifié ajoute du trafic sortant au traitement d’un défaut.
  • Avec un tampon d’écriture simultanée, le niveau inférieur peut temporairement être en retard.
4

Calcule la performance d’un cache

Une conception de cache n’est utile que si ses succès et ses défauts améliorent le temps d’exécution. Combine le temps de recherche, la fréquence des défauts et le délai supplémentaire qu’ils entraînent, puis relie les coûts d’accès aux attentes par instruction. Sépare le trafic des instructions de celui des données, garde des unités cohérentes entre cycles et temps d’horloge, et imbrique les coûts des caches inférieurs selon la fraction des demandes qui atteint chaque niveau. Ces calculs montrent pourquoi un taux de défauts plus bas ou une horloge plus rapide peut apporter un bénéfice inférieur aux attentes.

4.1 Calculer le temps moyen d’accès mémoire

Un taux de succès élevé est utile, mais ne constitue pas une mesure complète de la performance. Un petit nombre de défauts coûteux peut dominer la moyenne, et une conception qui évite davantage de défauts peut tout de même être moins performante si sa recherche devient trop lente.

Partir des taux et des définitions de temps
taux de succeˋs=succeˋsacceˋs,taux de deˊfauts=deˊfautsacceˋs.

La somme des deux proportions vaut un. Convertis les pourcentages en proportions avant de multiplier : 5 % correspond à 0,05.

Le temps moyen d’accès mémoire, ou temps attendu par accès, est

temps moyen d’acceˋs meˊmoire=temps d’acceˋs en cas de succeˋs+taux de deˊfauts×peˊnaliteˊ de deˊfaut de cache.

Chaque demande consulte le cache, y compris celles qui échouent. La pénalité est le délai supplémentaire après cette recherche. De manière équivalente, pondère le temps d’accès en cas de succès par la proportion de succès et le temps total en cas de défaut par la proportion de défauts ; le développement donne la même formule.

Avec un temps d’accès en cas de succès de 1 cycle, 5 % de défauts et une pénalité supplémentaire de 100 cycles, le temps moyen d’accès mémoire est de 1+0,05×100=6 cycles. À 2 GHz, chaque cycle dure 0,5 ns, soit 3 ns. Effectue tous les calculs en cycles ou tous en unités de temps, puis convertis le résultat final si nécessaire.

Comparer des conceptions complètes

Le cache A a un temps de recherche de 1,0 ns et 5 % de défauts. Le cache B a un temps de recherche de 1,2 ns et 3,5 % de défauts. Avec une pénalité de 50 ns :

A=1+0,05×50=3,5 ns, B=1,2+0,035×50=2,95 ns.

B l’emporte, car éviter des défauts coûteux compense largement sa recherche plus lente. Si la pénalité tombe à 10 ns, A prend 1,5 ns et B prend 1,55 ns. A l’emporte alors. L’intérêt d’une baisse du taux de défauts dépend de la pénalité qu’elle évite.

Pondérer correctement les accès aux instructions et aux données

Supposons que chaque instruction produise un chargement d’instruction et 0,3 accès aux données en moyenne. Le taux de défauts des instructions est de 2 % et celui des données de 4 %. Pour 100 instructions, il y a 100 chargements d’instructions et 30 accès aux données. Le nombre de défauts attendus est de 100×0,02+30×0,04=3,2 sur 130 accès.

La proportion de défauts combinée est donc 0,02+0,3×0,041,3. Avec des temps d’accès en cas de succès égaux à 1 cycle et des pénalités de 100 cycles, le temps moyen d’accès mémoire est d’environ 3,46 cycles par accès mémoire. Calculer directement la moyenne de 2 % et 4 % donnerait à tort le même poids aux deux types d’accès.

Estimer une pénalité de transfert

Une demande de bloc peut comprendre une latence initiale suivie du temps de transfert. Avec une latence de 60 ns, une ligne de 64 octets et une bande passante de 16 GB/s, le transfert prend 4 ns, ce qui donne une pénalité supplémentaire d’environ 64 ns. À 3 GHz, il y a 3 cycles/ns, soit 192 cycles.

Vérifie ce que comprend le temps indiqué dans un problème. S’il donne le temps complet d’un accès en cas de défaut, soustrais le temps de recherche en cas de succès avant de traiter cette valeur comme une pénalité supplémentaire de défaut. Compter deux fois la recherche surestime le temps moyen d’accès mémoire.

Points clés

  • Le temps moyen d’accès mémoire ajoute le temps de recherche en cas de succès au coût supplémentaire attendu des défauts.
  • Utilise les taux de défauts sous forme décimale et une seule unité de temps cohérente.
  • Pondère les taux des instructions et des données par leurs nombres d’accès.
  • Un taux de défauts plus bas peut être désavantagé par un temps d’accès en cas de succès suffisamment plus long.

4.2 Relier les défauts au temps d’exécution

Le temps moyen d’accès mémoire mesure le temps par accès mémoire. Le CPI mesure les cycles par instruction exécutée. Pour les relier, compte le nombre de demandes d’instructions et de données produites par chaque instruction ainsi que les cycles d’attente qu’elles ajoutent.

Ajouter les termes d’attente

Pour un processeur simple à exécution dans l’ordre dont les succès de cache sont inclus dans le CPI de base, un défaut sans chevauchement ajoute sa pénalité supplémentaire. Avec un taux de défauts des instructions mI, un nombre d’accès aux données par instruction fD, un taux de défauts des données mD et une pénalité P en cycles :

CPI d’attente=mIP+fDmDP, temps processeur=nombre d’instructions exeˊcuteˊes×(CPI de base+CPI d’attente)×dureˊe du cycle.

Dans ce modèle, chaque instruction donne lieu à une demande de chargement d’instruction. Seuls les chargements et les rangements produisent des demandes de données : multiplie donc leur taux de défauts par leur fréquence. Si leurs pénalités diffèrent, utilise une pénalité distincte dans chaque terme.

Passer des demandes aux attentes

Soit un CPI de base de 1,0, un taux de défauts des instructions de 2 %, une fréquence de chargements et de rangements de 30 %, un taux de défauts des données de 4 % et une pénalité de défaut de 100 cycles. Les attentes liées aux instructions sont de 0,02×100=2,0 cycles par instruction. Les attentes liées aux données sont de 0,3×0,04×100=1,2. Le CPI total est de 4,2.

Avec un cache parfait, le CPI reviendrait à 1,0. À fréquence d’horloge et nombre d’instructions égaux, cela représenterait une accélération d’un facteur 4,2. Le taux de défauts des données est le double de celui des instructions, mais les défauts des instructions coûtent davantage de temps au total, car chaque instruction est chargée et seules 30 % accèdent aux données.

N’insère pas directement le temps moyen d’accès mémoire comme CPI. Il est calculé par accès et comprend le temps de service en cas de succès. Le calcul du CPI ici n’ajoute que les attentes au-delà de l’exécution de base déjà comptée.

Une horloge plus rapide augmente le coût en cycles de chaque attente mémoire

La latence de la DRAM en nanosecondes ne diminue pas lorsque la fréquence d’horloge du processeur augmente. Doubler cette fréquence transforme la même attente mémoire de 100 cycles en 200 cycles à la nouvelle fréquence. Le CPI de l’exemple devient

1+0,02×200+0,3×0,04×200=7,4.

Chaque nouveau cycle dure deux fois moins longtemps ; le temps d’exécution relatif passe donc de 4,2 anciens cycles par instruction à l’équivalent de 3,7 anciens cycles. L’accélération est de 4,2/3,7≈1,14, bien inférieure à deux.

Les améliorations déplacent le goulot d’étranglement

Si le CPI de base passe de 1,0 à 0,5 tandis que les attentes mémoire restent à 3,2, le CPI total devient 3,7. Les attentes consomment alors 3,2/3,7≈86% des cycles. Améliorer le cœur augmente la part du temps d’exécution occupée par le délai mémoire inchangé : c’est un exemple de la loi d’Amdahl.

Le modèle simple compte tous les délais de défaut comme des attentes. L’exécution dans le désordre et les caches non bloquants peuvent faire chevaucher les défauts avec du travail utile ou d’autres défauts. Des compteurs matériels et des mesures du temps d’exécution sont nécessaires pour évaluer ce chevauchement sur une machine réelle. Pour comparer des conceptions avec ce modèle, garde le même flux d’instructions et précise quels délais sont déjà inclus dans le CPI de base.

Points clés

  • Compte les défauts d’instruction pour chaque instruction et les défauts de données uniquement pour les accès aux données.
  • Ajoute les attentes supplémentaires dues aux défauts à un CPI de base qui comprend déjà les succès.
  • Convertis à nouveau le temps mémoire en cycles lorsque la fréquence d’horloge change.
  • Compare le temps d’exécution à l’aide du CPI multiplié par la durée du cycle, et non du seul CPI.
  • Le chevauchement peut rendre les attentes réelles inférieures à la simple somme des pénalités de défaut.

4.3 Imbriquer les coûts de plusieurs niveaux de cache

Un cache inférieur réduit la pénalité payée lorsque L1 subit un défaut. Il possède son propre temps de recherche et son propre taux de défauts ; le coût attendu de la hiérarchie doit donc tenir compte de la fraction des demandes qui atteint chaque niveau.

Garder le dénominateur associé au taux

Le taux de défauts local d’un niveau est son nombre de défauts divisé par le nombre de demandes reçues par ce niveau. Son taux de défauts global est son nombre de défauts divisé par toutes les demandes mémoire du processeur.

Si L1 subit des défauts dans 4 % des cas et que L2 échoue pour 25 % de ces demandes, seules 0,04×0,25=0,01, soit 1 % des demandes initiales, atteignent la mémoire. Un taux de défauts local de L2 de 25 % ne dit rien à lui seul de la fraction de toutes les demandes qui atteint la mémoire : L1 a d’abord filtré le flux.

Pour deux niveaux consultés successivement :

temps moyen d’acceˋs meˊmoire=H1+m1(H2+m2P).

Ici, H1 et H2 sont les temps de recherche, m1 et m2 les proportions locales de défauts et P la pénalité supplémentaire d’accès à la mémoire. Seuls les défauts de L1 paient la recherche dans L2. Seuls les défauts dans les deux niveaux paient la pénalité d’accès à la mémoire.

Calculer de l’intérieur vers l’extérieur

Utilise un temps d’accès en cas de succès de L1 de 1 cycle, un taux de défauts de L1 de 4 %, un temps d’accès en cas de succès de L2 de 12 cycles, un taux de défauts local de L2 de 25 % et une pénalité d’accès à la mémoire de 200 cycles. Une demande qui atteint L2 prend en moyenne 12+0,25×200=62 cycles supplémentaires. Ainsi,

temps moyen d’acceˋs meˊmoire=1+0,04×62=3,48 cycles.

Sans L2, le temps moyen d’accès mémoire serait de 1+0,04×200=9 cycles. La recherche dans L2 ajoute du travail à chaque défaut de L1, mais évite à la plupart de ces demandes de payer le délai mémoire bien plus élevé.

Ne remplace pas m2 par le taux de défauts global de L2 de 1 % dans les parenthèses. Cela reviendrait à multiplier deux fois par la proportion de défauts de L1. Une forme développée équivalente utilise directement le taux global :

temps moyen d’acceˋs meˊmoire=H1+m1H2+(m1m2)P.
Ajouter L3 selon la même logique

Avec un temps d’accès en cas de succès de L3 de 40 cycles et un taux de défauts local de 40 %, le terme de service de L3 est de 40+0,4×200=120 cycles. Le terme de L2 devient 12+0,25×120=42 cycles. Le temps moyen d’accès mémoire global est de 1+0,04×42=2,68 cycles.

L’expression complète est H1+m1(H2+m2(H3+m3P)). L3 n’est compté que pour les demandes qui échouent dans les deux niveaux supérieurs. Un niveau dont la recherche est très lente ou qui donne très peu de succès peut ajouter plus de délai qu’il n’en économise.

Utiliser les taux par instruction pour le CPI

Supposons que le CPI de base soit de 1, que L1 produise 0,032 défaut par instruction et que la mémoire ajoute 100 cycles. Sans L2, le CPI est de 1+0,032×100=4,2. Ajoutons un cache L2 de 10 cycles dont le taux de défauts local est de 25 % :

CPI=1+0,032×10+0,032×0,25×100=2,12.

À fréquence d’horloge égale, l’accélération est de 4,2/2,12≈1,98. La valeur 0,032 représente déjà des défauts par instruction ; un facteur supplémentaire de fréquence d’accès compterait donc cette fréquence deux fois.

Points clés

  • Les taux de défauts locaux et globaux ont des dénominateurs différents.
  • Multiplie les proportions locales de défauts pour trouver la fraction qui atteint un niveau inférieur.
  • Calcule les temps de service imbriqués à partir du niveau le plus bas.
  • Ne compte le temps de recherche d’un niveau inférieur que pour les demandes qui l’atteignent.
  • Utilise directement les défauts par instruction pour calculer le CPI dû aux attentes.
  • L’ajout d’un cache n’aide que si le délai évité dépasse le travail de recherche supplémentaire.
5

Explique comment la mémoire virtuelle et les TLB s’intègrent à la hiérarchie

Les programmes émettent des adresses virtuelles, tandis que les caches identifient finalement des données physiques. Les tables des pages fournissent les correspondances et les droits d’accès, et un TLB garde les traductions récemment utilisées près du processeur. Effectue une traduction d’adresse, distingue une traduction absente d’un défaut de page et découvre comment l’indexation du cache peut se chevaucher avec la traduction. Les mêmes principes de hiérarchie s’appliquent ici, mais les entrées de traduction, les blocs de données et les pages ont des rôles différents.

5.1 Traduire les pages et vérifier les autorisations

La mémoire virtuelle sépare les adresses utilisées par un programme des emplacements qui contiennent ses données en mémoire principale. Chaque processus dispose de son propre espace d’adressage virtuel. Le matériel traduit les adresses à l’aide des correspondances du système d’exploitation et vérifie si chaque accès demandé est autorisé.

Remplacer le numéro de page, conserver le déplacement

Une page est une région de taille fixe d’adresses virtuelles. Un cadre de page est un emplacement de la taille d’une page en mémoire physique. Avec des pages de 4 KiB, chaque page contient 4096 octets ; le déplacement dans la page nécessite donc 12 bits. Les bits de poids fort restants de l’adresse virtuelle forment le numéro de page virtuelle.

Une entrée de table des pages fait correspondre un numéro de page virtuelle à un numéro de page physique. La traduction remplace le numéro de page mais conserve le déplacement : la même position d’octet est sélectionnée dans le cadre physique.

Pour l’adresse virtuelle 0x00403A7C, les 12 bits de poids faible donnent le déplacement 0xA7C, et le numéro de page virtuelle est 0x00403. Si ce numéro correspond au numéro de page physique 0x02F1C, l’adresse physique est 0x02F1CA7C. Ajouter à la suite un déplacement de 12 bits revient à multiplier le numéro de page physique par 4096 et à ajouter le déplacement ; ajouter ce numéro sans le décaler donnerait une adresse erronée.

Une correspondance comprend des autorisations

Une entrée de table des pages enregistre la validité, un numéro de page physique et des autorisations telles que la lecture, l’écriture, l’exécution et l’accès utilisateur. Les bits d’accès et de modification enregistrent l’utilisation et la modification. Un registre privilégié du processeur indique la table des pages ; RISC-V utilise satp. Les programmes utilisateur ne peuvent pas réécrire librement ces correspondances.

Des tables des pages séparées permettent à une même adresse virtuelle de désigner des données physiques différentes selon les processus. Elles permettent aussi un partage choisi : deux processus peuvent faire correspondre des pages virtuelles au même cadre physique, par exemple pour partager le code en lecture seule d’une bibliothèque. L’isolation et le partage sont tous deux des conséquences de correspondances contrôlées.

Un défaut de page nécessite l’intervention du système d’exploitation

Un défaut de page est une exception levée lorsque la traduction ou ses vérifications d’autorisation ne peuvent pas se terminer normalement. Un rangement dans une correspondance en lecture seule peut provoquer un défaut même si la page est déjà en mémoire.

Lorsqu’une page nécessaire est absente de la mémoire principale, le système d’exploitation obtient un cadre physique, lit la page depuis le stockage, met à jour la correspondance et relance l’instruction. Une page victime modifiée peut d’abord devoir être réécrite. Certains défauts sont résolus sans accès au stockage, par exemple en établissant une correspondance vers une page existante ou en traitant une copie à l’écriture. Un accès que le système ne peut pas autoriser peut au contraire aboutir à une erreur du processus.

Les défauts nécessitant le stockage sont coûteux. À 3 GHz, un délai de 50 µs coûte 150 000 cycles et 1 ms coûte 3 000 000 cycles. Les grandes pages répartissent les coûts de transfert sur de nombreux octets. Une page virtuelle peut occuper n’importe quel cadre adapté, et les pages modifiées utilisent l’écriture différée, car transmettre chaque rangement au stockage serait trop lent.

Les tables des pages consomment aussi de la mémoire

Une table à un seul niveau pour des adresses virtuelles de 32 bits et des pages de 4 KiB nécessite 232−12=220 entrées. À raison de 4 octets par entrée, cela représente 4 MiB par processus. Les conceptions réelles utilisent des tables multiniveaux pour éviter d’allouer une immense table à un seul niveau pour des espaces d’adressage peu remplis ; RISC-V Sv39 utilise trois niveaux.

La mémoire virtuelle comprend la traduction d’adresses, la protection et le partage même lorsque toutes les pages utilisées tiennent en DRAM. La pagination vers le stockage est une utilisation de ces mécanismes, pas leur seul objectif.

Points clés

  • La traduction modifie le numéro de page et conserve le déplacement dans la page.
  • Les autorisations des entrées de table des pages contrôlent la lecture, l’écriture, l’exécution et l’accès utilisateur.
  • Un défaut de page peut signaler une page absente ou un problème d’autorisation.
  • Certains défauts de page sont résolus sans lecture du stockage.
  • Les tables des pages permettent l’isolation des processus et le partage choisi.
  • Une table à un seul niveau possède une entrée par page virtuelle ; son coût de stockage peut donc être élevé.

5.2 Mettre les traductions en cache avec un TLB

La traduction d’une adresse peut nécessiter plusieurs lectures de la table des pages avant qu’un accès aux données puisse se poursuivre. Les entrées de table des pages peuvent être trouvées dans les caches ordinaires, mais ces lectures ajoutent tout de même du travail. Le tampon de traduction d’adresses, ou TLB, met en cache les traductions récemment utilisées afin que la plupart des accès évitent un parcours de la table des pages.

Suivre un accès autorisé

Le numéro de page virtuelle est recherché dans le TLB. Une entrée correspondante fournit le numéro de page physique et les informations d’autorisation. Après vérification des autorisations, l’adresse physique identifie les données dans la hiérarchie de caches.

En cas de défaut du TLB, un parcours de la table des pages obtient la traduction. Si la correspondance est valide et autorise la demande, la traduction est installée dans le TLB et l’accès se poursuit. RISC-V et x86-64 utilisent normalement des dispositifs matériels de parcours ; certaines architectures utilisent des routines logicielles. Si la correspondance ne permet pas de traiter la demande, le processeur lève un défaut de page pour le système d’exploitation.

Un défaut du TLB peut donc accompagner un succès ou un défaut du cache de données. Il indique que la traduction était absente du TLB, et non que la page était absente de la DRAM. Inversement, un succès dans le TLB peut accompagner un défaut de cache ou un défaut d’autorisation pour un accès interdit. La traduction et la présence des données répondent à des questions différentes.

Compter la mémoire couverte par les traductions

La couverture du TLB est le nombre d’entrées multiplié par la taille de page. Un TLB de 64 entrées avec des pages de 4 KiB couvre 256 KiB à la fois. Avec des pages de 2 MiB, 64 entrées couvrent 128 MiB. Accéder à de nombreuses pages différentes peut épuiser la capacité de traduction même lorsque seuls quelques octets de chaque page sont utilisés.

Les TLB de premier niveau contiennent souvent plusieurs dizaines d’entrées ; les niveaux inférieurs de TLB peuvent en contenir des centaines ou des milliers. Leurs entrées comprennent des étiquettes de numéros de pages, des correspondances physiques, des autorisations et souvent des identifiants d’espace d’adressage. La localité au sein des pages et la réutilisation lors d’accès proches maintiennent les taux de succès de traduction à un niveau élevé.

Par exemple, si 1 % des accès nécessitent un parcours de 30 cycles et que le temps de succès dans le TLB est par ailleurs masqué, les parcours ajoutent en moyenne 0,01×30=0,3 cycle par accès. Cet exemple suppose que les parcours se terminent normalement et exclut le traitement des défauts de page.

Faire chevaucher indexation et traduction

Un cache à index physique et étiquette physique attend une adresse physique avant de sélectionner son ensemble. Un cache à index virtuel et étiquette physique, ou cache VIPT, commence à lire un ensemble pendant que le TLB traduit l’adresse, puis compare les étiquettes physiques.

La conception VIPT simple prend tous les bits d’index et de déplacement dans le bloc à partir du déplacement dans la page, car la traduction conserve ces bits. Cela exige

capaciteˊ du cachevoies≤taille de la page.

Avec des pages de 4 KiB, un cache de 32 KiB à 8 voies possède 4 KiB par voie et respecte cette condition. Un cache de 48 KiB à 12 voies la respecte aussi. Un cache de 64 KiB à 8 voies possède 8 KiB par voie et a besoin d’un bit du numéro de page pour l’indexation ; il nécessite donc davantage de voies ou un traitement supplémentaire.

Maintenir les correspondances en cache à jour

Les traductions appartiennent à des espaces d’adressage. Un changement de contexte peut vider les anciennes entrées ou les distinguer à l’aide d’identifiants d’espace d’adressage, ou ASID. Les modifications des correspondances exigent la mise à jour correspondante du cache de traductions ; RISC-V fournit sfence.vma. Lorsqu’une page est évincée de la mémoire, son ancienne traduction ne doit pas rester utilisable dans le TLB. Le TLB contient les correspondances et les droits d’accès, tandis que les caches ordinaires contiennent les données et les instructions du programme.

Points clés

  • Un TLB stocke des traductions et des autorisations, pas les données du programme.
  • Un parcours réussi de la table des pages résout un défaut du TLB sans défaut de page.
  • La couverture du TLB est égale au nombre d’entrées multiplié par la taille de page.
  • L’indexation VIPT simple place les bits d’index et de déplacement dans le bloc à l’intérieur du déplacement dans la page.
  • Les ASID et l’invalidation des traductions empêchent l’utilisation de correspondances provenant du mauvais espace d’adressage ou d’une ancienne correspondance.
6

Écris des programmes qui tiennent compte du cache

Les boucles et l’organisation des données déterminent les prochains octets demandés par un processeur. Suis ces adresses pour améliorer la localité spatiale, conserver les données utiles grâce au traitement par blocs et comprendre quand le préchargement peut masquer une attente. Compare les parcours par lignes et par colonnes, les organisations des enregistrements et l’empreinte mémoire des blocs avant de mesurer une modification. La capacité, les conflits d’ensembles, la couverture des traductions et la bande passante mémoire contribuent à expliquer pourquoi une transformation fonctionne pour une charge de travail et aide moins pour une autre.

6.1 Choisir des boucles et une organisation qui utilisent chaque ligne

Un code qui tient compte du cache utilise les octets chargés avant que leur bloc soit évincé. Commence par les adresses produites par la boucle interne. Demande-toi ensuite quelles données sont réutilisées, à quelle distance les accès se trouvent et si ces blocs peuvent coexister dans le cache.

Parcourir les tableaux dans leur ordre de stockage

Le C et le C++ stockent les tableaux rectangulaires par lignes. Les colonnes adjacentes d’une même ligne sont adjacentes en mémoire. Fortran, MATLAB et Julia utilisent un rangement par colonnes ; les tableaux NumPy sont rangés par lignes par défaut. Un parcours interne efficace suit l’organisation réelle.

Un tableau C double a[1024][1024] occupe 8 MiB. Chaque ligne occupe 8 192 octets. Avec des lignes de cache de 64 octets, chaque ligne de cache contient huit valeurs de type double. Un parcours par lignes peut utiliser les huit avant de passer à la suite, ce qui donne environ un défaut à froid pour huit accès dans un modèle simple de chargement sur demande.

Un parcours par colonnes avance de 8 192 octets entre deux accès consécutifs. Il touche 1 024 lignes de cache distinctes avant de revenir à des données proches dans la colonne suivante. Ces lignes occupent 64 KiB, ce qui dépasse un cache L1 de 32 KiB. Elles entrent aussi en conflit : dans un cache à 64 ensembles, un pas de 128 lignes de cache conserve le même index d’ensemble. Un ensemble à 8 voies ne peut pas contenir 1 024 lignes concurrentes.

Ajouter du remplissage à une ligne du tableau pour atteindre 1 032 valeurs de type double donne un pas de 8 256 octets, soit 129 lignes de cache. Les lignes successives du tableau avancent alors d’un ensemble modulo 64, ce qui répartit les demandes. Le remplissage traite les conflits de correspondance ; la quantité de données reste néanmoins importante.

Permuter les boucles lorsque le résultat est conservé

La permutation de boucles modifie la boucle exécutée à l’intérieur d’une autre. Pour une multiplication matricielle avec rangement par lignes, l’ordre i, j, k parcourt une ligne de A, mais une colonne de B. Dans un modèle de parcours de grandes matrices avec peu de réutilisation entre les passages, cela coûte environ 1/8+1=1,125 défaut par itération interne.

Avec i, k, j, la boucle interne parcourt des lignes de B et de C, tandis qu’un élément de A est réutilisé. Compter un nouveau parcours pour chacune des deux lignes donne environ 1/8+1/8=0,25 défaut par itération, soit 4,5 fois moins. Si la ligne de C mise à jour à plusieurs reprises reste présente dans le cache, le nombre s’approche de 0,125. La capacité du cache et les conflits déterminent quelles réutilisations restent possibles.

La permutation doit préserver le comportement requis des calculs. Les dépendances, les pointeurs vers des données qui se chevauchent et l’ordre d’évaluation en virgule flottante peuvent limiter les transformations ; les compilateurs doivent prouver qu’une modification est autorisée.

Charger les champs utilisés

Un tableau de structures regroupe tous les champs d’un objet. Une structure de tableaux regroupe un même champ pour plusieurs objets. Si un enregistrement de particule contient huit valeurs de type double dans une ligne de 64 octets, additionner uniquement x sur un million d’enregistrements alignés charge environ 64 MB. Un tableau x contigu séparé charge environ 8 MB, en utilisant chaque valeur de type double chargée. Un code qui utilise ensemble tous les champs d’une particule peut tirer avantage de l’organisation initiale en structures.

Les nœuds liés peuvent être dispersés et chaque adresse suivante peut dépendre d’un pointeur qui vient d’être chargé. Des tableaux contigus ou des zones de nœuds peuvent améliorer la localité. Des champs fréquemment utilisés et compacts permettent aussi de faire tenir davantage de données actives dans chaque niveau.

Mesure le temps d’exécution et les compteurs matériels pertinents avant et après une modification. Les défauts de cache peuvent expliquer une boucle lente, mais les calculs, la bande passante ou les branchements peuvent constituer le facteur limitant. Garde des entrées et des résultats comparables afin qu’une différence de vitesse reflète la modification évaluée.

Points clés

  • Adapte la boucle interne à l’ordre de stockage du tableau.
  • De grands pas d’accès qui sont des puissances de deux peuvent concentrer les demandes dans un seul ensemble.
  • Le remplissage modifie la correspondance ; une organisation compacte réduit le nombre d’octets chargés.
  • La permutation de boucles doit préserver le comportement requis des calculs.
  • Choisis un tableau de structures ou une structure de tableaux selon les champs utilisés.
  • Mesure le facteur limitant et vérifie les résultats lorsque tu modifies le code.

6.2 Réutiliser les blocs et charger à l’avance

La permutation de boucles améliore l’ordre des accès. Le traitement par blocs, aussi appelé découpage en blocs, va plus loin en gardant une petite région de données active jusqu’à la fin de sa réutilisation utile. Le préchargement avance un transfert futur afin que son délai se chevauche avec du travail utile.

Garder un groupe de blocs dans le cache

Dans la multiplication par blocs de matrices carrées, un bloc de A et un bloc de B contribuent à un bloc de C. Un bloc de côté b contient b2 éléments. Travailler à plusieurs reprises sur ces petits blocs permet de réutiliser les données avant de passer à la région suivante.

Pour des valeurs de type double de 8 octets, trois blocs nécessitent 3b2×8=24b2 octets. Dans un cache de 32 KiB, la limite de capacité est

24b2≤32768,b≤32768/24≈36,9.

Choisir un côté de 32 utilise 24 576 octets, soit 24 KiB, et laisse de la place pour d’autres données. Choisir 36 simplement parce que le calcul le permet laisse beaucoup moins de place et peut entraîner des conflits. La capacité donne une première estimation ; les tailles réelles des blocs sont ajustées par mesure.

Un parcours par blocs fait avancer la boucle externe de la taille d’un bloc. Ses bornes internes s’arrêtent à la plus petite des deux valeurs entre la fin du bloc et la taille de la matrice. Par exemple, si une dimension vaut 70 et que les blocs ont un côté de 32, le dernier bloc ne contient que six éléments selon cette dimension. Un dernier bloc de taille complète accéderait au-delà du tableau.

Estimer les économies dues à la réutilisation

Dans un modèle simplifié de grandes matrices avec des lignes de 64 octets, l’ordre naïf i, j, k produit environ 1,125N3 défauts lorsque les lignes parcourues ne sont plus dans le cache au passage suivant. Une version par blocs peut réduire ce nombre à environ N3/(4b), en supposant que les trois blocs de travail restent dans le cache et en ignorant les conflits.

Pour N=1024 et b=32, ces estimations sont d’environ 1,2 milliard et 8,4 millions de défauts, soit un facteur de 144. Les deux versions effectuent toujours environ 2N3 opérations en virgule flottante. L’économie porte sur les transferts répétés de données, pas sur le nombre d’opérations arithmétiques de la multiplication. Le modèle décrit une réutilisation idéale ; l’accélération mesurée dépend aussi de la bande passante, de l’exécution et d’autres surcoûts.

Précharger assez tôt pour masquer la latence

Les dispositifs matériels de préchargement reconnaissent des suites d’accès séquentiels ou à pas constant. Ils demandent les lignes avant que les accès sur demande en aient besoin. Le logiciel peut aussi demander des chargements à l’avance, par exemple avec __builtin_prefetch de GCC ou Clang.

Le moment compte. Une demande trop tardive laisse l’accès sur demande en attente. Une demande trop précoce peut charger une ligne qui sera évincée avant utilisation. Une demande inexacte consomme de la bande passante et de l’espace de cache sans aider le programme. Le suivi de pointeurs est plus difficile à précharger, car l’adresse suivante n’est souvent connue qu’après l’arrivée du nœud courant.

Un préchargement au bon moment peut transformer les futurs défauts sur demande en succès, mais les lignes circulent toujours dans la hiérarchie. Il masque la latence sans réduire les données utiles nécessaires à un parcours. Le traitement par blocs aide lorsque les valeurs sont réutilisées ; un parcours unique ne contient pas de données répétées à conserver et peut déjà être limité par la bande passante mémoire.

Points clés

  • Le traitement par blocs garde les blocs réutilisés actifs tant que leurs données sont utiles.
  • Estime le stockage des blocs pour tous les tableaux nécessaires simultanément.
  • Traite les blocs partiels aux bords avec des bornes de boucle adaptées.
  • Le traitement par blocs réduit les transferts de données tout en conservant la quantité de calculs.
  • Le préchargement nécessite des adresses utiles et une anticipation suffisante ; les demandes inexactes gaspillent de la bande passante.

Hiérarchie mémoire et caches : exemples

6 Leçons Interactives

1

Du parcours d’un tableau à la hiérarchie mémoire

13 étapes
Relie la localité d’un programme aux technologies de mémoire et aux coûts des succès et des défauts.
  1. 1
    IntroductionPourquoi garder une petite mémoire à proximité ?

    Un processeur peut lancer du travail bien plus vite qu’une grande mémoire ne peut répondre à chaque demande. Un cache aide lorsqu’un programme revient à des données récentes ou utilise des adresses proches ; cette réutilisation est appelée localité. Suis le parcours d’un tableau pour voir ce que peut fournir le chargement d’une seule ligne, puis relie cette réutilisation aux technologies et aux niveaux qui fournissent les données : la hiérarchie mémoire.

  2. 2
    ExplicationDistinguer deux formes de localité

    La localité temporelle réutilise rapidement un élément : le corps d’une boucle s’exécute à plusieurs reprises et un total cumulé est mis à jour à chaque itération. La localité spatiale utilise des adresses proches : un parcours séquentiel de tableau lit des éléments adjacents.

    Une boucle peut présenter les deux dans son flux d’instructions même lorsque chaque élément du tableau n’est lu qu’une fois. Repère l’élément auquel on accède avant de déterminer la forme de localité.

  3. 3
    ExempleQue fournit une ligne ?

    Un tableau aligné sur une frontière de bloc contient 1000 entiers de 4 octets chacun. Les lignes de cache contiennent 64 octets. Chaque chargement fournit 64/4=16 entiers consécutifs. Après le défaut sur le premier entier, les 15 suivants peuvent donner des succès. La dernière ligne n’est pas nécessairement pleine : le tableau de 4000 octets nécessite ⌈4000/64⌉=63 lignes.

  4. 4
    DéfiPrévoir le résultat d’un parcours plus court

    Un tableau aligné contient 320 entiers de quatre octets. Dans un cache initialement vide à chargement sur demande, avec des lignes de 64 octets, sans interférence et disposant d’assez de place pour le tableau, combien de lectures du tableau produisent un défaut ? Quelle localité permet les autres succès ?

    ---reveal---

    Il y a 16 entiers par ligne et 320/16=20 lignes : 20 lectures produisent donc un défaut. Les 300 autres réussissent grâce à la localité spatiale. Chaque élément est utilisé une fois ; ces succès ne nécessitent pas de réutilisation temporelle des éléments.

  5. 5
    Point cléUn ensemble de travail a besoin d’emplacements utilisables

    L’ensemble de travail est constitué des blocs utilisés pendant une fenêtre de temps. Un petit ensemble actif peut rester à proximité même lorsque le programme entier est grand.

    La capacité et le placement comptent tous deux. Si deux blocs actifs ne peuvent utiliser qu’une seule entrée commune, ils peuvent s’évincer mutuellement alors que d’autres entrées restent vides. Les variables de boucle conservées dans des registres n’ont pas non plus besoin de place dans le cache de données, même si le code source les lit à plusieurs reprises.

  6. 6
    ExplicationComparer les cellules mémoire alimentées

    La SRAM conserve un bit dans un circuit stable alimenté, utilisant généralement six transistors. Elle n’a pas besoin de rafraîchissement et elle est rapide, mais elle occupe une surface importante par bit. La DRAM conserve une charge dans un condensateur ; les fuites nécessitent un rafraîchissement. Ses cellules plus denses la rendent adaptée à une mémoire principale de grande capacité.

    Toutes deux sont volatiles. « Statique » décrit la façon dont la SRAM conserve son état lorsqu’elle est alimentée, et non sa capacité à survivre à une coupure d’alimentation.

  7. 7
    ExempleAttendre d’abord, puis transférer

    La DRAM active une ligne dans le tampon de ligne d’une banque et fournit les colonnes sélectionnées à partir de celui-ci. Les rafales et le chevauchement des banques augmentent le débit de livraison des données. Ils ne suppriment pas le délai d’accès initial.

    Avec une latence initiale de 60 ns, une ligne de 64 octets transférée à 16 octets/ns nécessite 4 ns supplémentaires. Le service total prend environ 64 ns. La majeure partie de cette attente précède le transfert, même si l’interface déplace rapidement les octets.

  8. 8
    ExplicationChoisir un stockage qui conserve son contenu

    La mémoire flash NAND conserve les données sans alimentation. Elle lit et programme des pages, mais efface des blocs plus grands avant de pouvoir réutiliser l’espace programmé. Ces opérations prennent bien plus de temps qu’un accès à la SRAM ou à la DRAM.

    L’usure due à la programmation et à l’effacement limite la durée de vie d’un bloc. La répartition de l’usure distribue les mises à jour entre les blocs afin que des données logiques souvent modifiées n’usent pas prématurément un même emplacement physique.

  9. 9
    DéfiDistinguer persistance et rafraîchissement

    Un appareil doit conserver des enregistrements après une coupure d’alimentation. Remplacer la DRAM par de la SRAM satisferait-il cette exigence ? Explique.

    ---reveal---

    Non. La SRAM évite le rafraîchissement, mais perd tout de même ses données sans alimentation, comme la DRAM. Un stockage non volatil comme la mémoire flash satisfait l’exigence de persistance. Ses opérations sur les pages plus lentes et ses besoins d’effacement expliquent pourquoi son rôle diffère de celui de la mémoire cache intégrée à la puce.

  10. 10
    ExplicationPlacer les niveaux dans l’ordre

    Les registres sont les plus proches de l’exécution, suivis de L1, L2, L3, de la DRAM et du stockage. Les caches transfèrent des blocs, généralement de 64 octets, tandis que la mémoire virtuelle utilise des pages, généralement de 4 KiB.

    L1 sépare souvent les caches d’instructions et de données afin que le pipeline puisse accéder aux deux en même temps. Un défaut à un niveau poursuit la recherche au niveau inférieur ; un défaut de L1 peut encore être un succès dans L2.

  11. 11
    ExempleCalculer le coût d’un défaut occasionnel

    Utilise une recherche simplifiée de 1 cycle, 97 % de succès et une pénalité supplémentaire de défaut de 100 cycles. Chaque demande paie la recherche et 3 % paient la pénalité :

    1+0,03×100=4 cycles.

    Un défaut coûte ici 101 cycles. Les 100 cycles représentent un temps supplémentaire : les compter comme le temps total du défaut omettrait la recherche pour les défauts.

  12. 12
    DéfiRelier le programme à son temps moyen

    Deux programmes utilisent le même cache de 1 cycle et la même pénalité supplémentaire de 80 cycles. L’un présente 2 % de défauts ; l’autre, 20 %. Calcule leurs temps moyens et explique pourquoi un matériel identique donne des résultats différents.

    ---reveal---

    Les moyennes sont de 1+0,02×80=2,6 et 1+0,20×80=17 cycles. Des schémas d’accès différents produisent des taux de défauts différents. Le cache exploite la localité offerte par chaque programme ; sa capacité et sa technologie ne déterminent pas seules le résultat.

  13. 13
    RécapitulatifExaminer un accès à trois échelles

    Lorsque tu examines le comportement de la mémoire, repère l’élément réutilisé, le bloc transféré avec lui et le niveau qui le fournit. La localité explique la réutilisation probable, la technologie de mémoire explique le coût et la capacité, et les temps de succès et de défaut transforment ces observations en une estimation du temps d’accès. Pour un programme concret, commence par le flux réel d’adresses.

2

Construire et suivre une recherche dans un cache

15 étapes
Décompose les adresses, suis l’état des remplacements et compare la correspondance directe à une organisation à plusieurs voies.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionUne adresse doit répondre à deux questions
  2. 2
    ExplicationRetirer d’abord le déplacement de l’octet
  3. 3
    ExplicationCompter les entrées avant les bits d’index
  4. 4
    DéfiVérifier une nouvelle décomposition en champs
  5. 5
    ExempleTenir compte de l’étiquette stockée
  6. 6
    ExempleCommencer avec un cache vide
  7. 7
    ExempleObserver le changement de bloc dans une entrée
  8. 8
    ExempleTerminer la séquence de remplacement
  9. 9
    DéfiSuivre la trace sans confondre octets et blocs
  10. 10
    ExplicationOrganiser les entrées en ensembles et en voies
  11. 11
    ExempleSuivre l’ordre d’utilisation à chaque accès
  12. 12
    DéfiDistinguer LRU et FIFO
  13. 13
    Point cléComprendre l’apport de voies supplémentaires
  14. 14
    DéfiComparer des conceptions de même capacité
  15. 15
    RécapitulatifConserver l’état pendant la recherche
3

Diagnostiquer un défaut et conserver les données modifiées

12 étapes
Classe les défauts, suis les victimes modifiées et distingue les politiques en cas de succès en écriture de celles en cas de défaut en écriture.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionUn défaut a une cause et des étapes de traitement
  2. 2
    ExplicationTraiter une lecture en attente
  3. 3
    ExplicationClasser à l’aide de la bonne comparaison
  4. 4
    DéfiDistinguer capacité libre et conflits
  5. 5
    LienChoisir le coût à améliorer
  6. 6
    ExplicationSuivre un bloc à écriture différée
  7. 7
    ExplicationMettre en file les rangements à écriture simultanée
  8. 8
    ExplicationDéfinir une règle distincte pour les défauts en écriture
  9. 9
    DéfiSuivre un rangement puis une lecture
  10. 10
    ExempleCompter le trafic dans les deux sens
  11. 11
    DéfiRelier la classification au trafic d’écriture
  12. 12
    RécapitulatifGarder les décisions distinctes
4

Calculer le coût d’une hiérarchie

16 étapes
Pars d’un cache pour étudier le trafic pondéré, le CPI, les changements d’horloge et plusieurs niveaux de cache.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionAssocier un dénominateur et une unité
  2. 2
    ExempleCalculer le temps moyen d’accès mémoire à un niveau
  3. 3
    ConseilConvertir après le calcul
  4. 4
    DéfiTenir compte d’un temps complet indiqué en cas de défaut
  5. 5
    ExemplePondérer les demandes effectivement émises
  6. 6
    ExemplePasser des accès aux instructions
  7. 7
    ExempleTerminer par le temps d’exécution
  8. 8
    DéfiAugmenter la fréquence d’horloge du processeur
  9. 9
    LienVérifier si les délais se chevauchent
  10. 10
    ExempleDistinguer les taux locaux et globaux
  11. 11
    ExempleCalculer le coût de service au niveau inférieur
  12. 12
    ExempleRevenir au flux initial
  13. 13
    DéfiDiagnostiquer une erreur de dénominateur
  14. 14
    ExempleAjouter un niveau conditionnel
  15. 15
    DéfiCombiner le trafic du cache et le CPI
  16. 16
    RécapitulatifChoisir le bon niveau de calcul
5

Traduire une adresse sans confondre les recherches

15 étapes
Suis les déplacements dans les pages, les autorisations, les parcours après défaut du TLB et la contrainte d’indexation d’un cache VIPT.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionUne adresse, deux problèmes de recherche
  2. 2
    ExempleTrouver la partie inchangée
  3. 3
    ExempleUtiliser l’entrée de table des pages
  4. 4
    DéfiTraduire l’adresse d’un autre octet
  5. 5
    ExplicationUne page valide possède tout de même des droits d’accès
  6. 6
    ExplicationTraiter une page absente
  7. 7
    ExempleEstimer la taille d’une table à un seul niveau
  8. 8
    ExplicationRéutiliser les traductions dans le TLB
  9. 9
    Point cléSuivre des résultats de recherche indépendants
  10. 10
    DéfiDéterminer si le stockage est nécessaire
  11. 11
    ExempleCalculer la couverture des traductions
  12. 12
    ExplicationCommencer l’indexation du cache pendant la traduction
  13. 13
    DéfiVérifier une conception L1 proposée
  14. 14
    LienInvalider les traductions périmées
  15. 15
    RécapitulatifDistinguer l’état des traductions de celui des données
6

Rendre utile chaque ligne chargée

13 étapes
Analyse les pas d’accès, choisis une organisation des données, dimensionne les blocs réutilisables et détermine ce que le préchargement peut masquer.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionCommencer par les adresses de la boucle interne
  2. 2
    ExempleUtiliser toutes les valeurs de type double d’une ligne
  3. 3
    ExempleExaminer ensemble la capacité et les conflits
  4. 4
    ConseilModifier le pas entre les lignes
  5. 5
    DéfiChoisir une organisation adaptée à l’accès
  6. 6
    ExplicationPermuter les boucles pour obtenir des parcours séquentiels
  7. 7
    ExplicationGarder trois blocs actifs
  8. 8
    ExempleGarder une marge au-delà de l’estimation de capacité
  9. 9
    DéfiArrêter les blocs de bord à la borne du tableau
  10. 10
    Point cléDistinguer la réduction des transferts de celle des calculs
  11. 11
    ExplicationCharger pendant que le travail utile se poursuit
  12. 12
    DéfiExpliquer une accélération inférieure aux attentes
  13. 13
    RécapitulatifTester une modification concrète

Hiérarchie mémoire et caches : QCM

50 Questions Pratiques en 5 séries

Série 1 : Comportement de la mémoire et recherche dans le cache10 Questions Pratiques

Question 1 sur 10

Un programme lit une fois chaque élément d’un tableau contigu, dans l’ordre des adresses. Quelle forme de localité explique pourquoi le chargement d’une ligne entière est utile ?
  1. La localité temporelle de chaque élément
  2. La localité spatiale entre les éléments
  3. La localité temporelle entre les pages
  4. La localité spatiale des valeurs répétées
Afficher la réponseMasquer la réponse
Réponse : B
Les éléments adjacents occupent des adresses proches ; une ligne chargée fournit donc plusieurs lectures à venir. La localité temporelle exige la réutilisation d’un élément ; lire chaque élément une fois ne donne aucune réutilisation temporelle de ces éléments, même si d’autres parties du programme peuvent être réutilisées.

Question 2 sur 10

Quelle propriété rend le rafraîchissement nécessaire pour la DRAM, mais pas pour la SRAM ?
  1. La DRAM transmet les données sur les deux fronts d’horloge.
  2. La DRAM conserve les données lorsque l’alimentation est coupée.
  3. La DRAM stocke chaque bit dans une bascule stable.
  4. La DRAM stocke une charge qui se dissipe progressivement.
Afficher la réponseMasquer la réponse
Réponse : D
Une cellule DRAM stocke une charge dans un condensateur, et les fuites imposent de restaurer périodiquement cette charge. Le transfert sur les deux fronts d’horloge améliore la bande passante de l’interface, mais n’est pas la raison du rafraîchissement. La SRAM conserve son état dans un circuit alimenté sans rafraîchissement périodique.

Question 3 sur 10

Une demande échoue dans L1 et réussit dans L2. Quelle affirmation décrit cet accès ?
  1. L2 fournit un bloc absent de L1.
  2. La DRAM fournit un bloc absent de L2.
  3. L’instruction lève un défaut de page.
  4. Le TLB doit recharger une traduction.
Afficher la réponseMasquer la réponse
Réponse : A
Le succès et le défaut concernent les niveaux effectivement consultés : le bloc était absent de L1, mais présent dans L2. Un défaut de L1 ne nécessite pas d’accès à la DRAM lorsqu’un cache inférieur peut le traiter. Les résultats des accès aux caches ne permettent pas de savoir si la traduction a échoué ou si un défaut de page s’est produit.

Question 4 sur 10

Un cache à correspondance directe possède 8 KiB de données, des blocs de 32 octets et des adresses d’octets de 30 bits. Quelles sont les largeurs de l’étiquette, de l’index et du déplacement ?
  1. 17, 8, 5 bits
  2. 12, 13, 5 bits
  3. 18, 7, 5 bits
  4. 17, 5, 8 bits
Afficher la réponseMasquer la réponse
Réponse : A
Le cache possède 8192/32=256 entrées, ce qui nécessite 8 bits d’index. Un bloc de 32 octets nécessite 5 bits de déplacement, laissant 30−8−5=17 bits d’étiquette. Utiliser 13 bits d’index reviendrait à prendre le logarithme de la capacité en octets et à compter deux fois le déplacement dans le bloc.

Question 5 sur 10

Un cache à correspondance directe possède huit entrées de 16 octets. Pour l’adresse d’octet 0x2B6, quelle paire donne l’index de l’entrée et le déplacement de l’octet ?
  1. Index 6, déplacement 3
  2. Index 2, déplacement 6
  3. Index 3, déplacement 6
  4. Index 3, déplacement 11
Afficher la réponseMasquer la réponse
Réponse : C
Diviser 0x2B6 par 16 donne le bloc 0x2B, soit 43, avec un reste de 6. Le bloc 43 modulo 8 sélectionne l’index 3. Prendre les trois bits de poids faible de l’adresse d’octet sans décalage donnerait l’index 6, car ces bits appartiennent au déplacement de l’octet et non à l’index du bloc.

Question 6 sur 10

Un cache à correspondance directe vide possède deux entrées de 8 octets. Des lectures accèdent aux adresses d’octets 0x00, 0x07, 0x10, 0x04, dans cet ordre. Quel est le taux de succès ?
  1. 0%
  2. 25%
  3. 50%
  4. 75%
Afficher la réponseMasquer la réponse
Réponse : B
Le premier accès charge le bloc 0, et l’accès à 0x07 réussit dans ce bloc. L’adresse 0x10 charge le bloc 2 dans la même entrée et évince le bloc 0 ; l’accès à 0x04 échoue donc ensuite. Un seul accès sur quatre réussit ; compter le dernier comme un succès reviendrait à oublier le remplacement intermédiaire.

Question 7 sur 10

Un tableau aligné contient 192 valeurs de huit octets. Un cache initialement vide utilise des lignes de 64 octets, dispose d’assez de place pour le tableau entier et n’effectue aucun préchargement. Sans autre accès, combien de défauts se produisent lors d’un parcours séquentiel ?
  1. 12
  2. 64
  3. 192
  4. 24
Afficher la réponseMasquer la réponse
Réponse : D
Chaque ligne contient 64/8=8 valeurs, donc le parcours touche 192/8=24 lignes. La première lecture de chaque ligne échoue et les accès aux sept valeurs suivantes réussissent. Compter 192 défauts reviendrait à considérer qu’un chargement de ligne ne fournit que le seul élément demandé.

Question 8 sur 10

Une demande mémoire a une latence initiale de 45 ns, suivie d’un transfert de 128 octets à 32 GB/s. Quel est son temps de service total dans ce modèle ?
  1. 49 ns
  2. 45 ns
  3. 77 ns
  4. 41 ns
Afficher la réponseMasquer la réponse
Réponse : A
À 32 GB/s, l’interface transfère 32 octets par nanoseconde ; 128 octets prennent donc 4 ns. Ajouter les 45 ns initiaux donne 49 ns. Utiliser 77 ns revient à confondre la valeur de la bande passante avec un délai au lieu de diviser la taille du bloc par le débit de transfert.

Question 9 sur 10

Un cache à correspondance directe et à écriture différée de 4 KiB possède des lignes de 32 octets et des adresses d’octets de 24 bits. Compte les données, les étiquettes, un bit de validité et un bit de modification par ligne, sans autre métadonnée. Combien de bits sont stockés ?
  1. 34 304 bits
  2. 34 944 bits
  3. 34 560 bits
  4. 33 024 bits
Afficher la réponseMasquer la réponse
Réponse : C
Il y a 128 lignes ; les largeurs de l’index et du déplacement sont donc de 7 et 5 bits, ce qui laisse une étiquette de 12 bits. Chaque ligne stocke 256 + 12 + 1 + 1 = 270 bits, soit 34 560 bits. Le choix à 34 304 bits omet les deux bits de contrôle de chaque ligne, malgré leur inclusion explicite dans le calcul du stockage.

Question 10 sur 10

Un cache à correspondance directe vide possède quatre entrées de 16 octets. Des lectures accèdent à 0x24, 0x28, 0x64, 0x34, 0x2C, 0x68. Quels sont le taux de succès et le bloc finalement présent à l’index 2 ?
  1. 50 % ; bloc 2
  2. 25 % ; bloc 6
  3. 16,7 % ; bloc 2
  4. 16,7 % ; bloc 6
Afficher la réponseMasquer la réponse
Réponse : D
La séquence des blocs est 2, 2, 6, 3, 2, 6. Seul le deuxième accès réussit ; les blocs 2 et 6 se remplacent mutuellement à l’index 2, qui contient finalement le bloc 6. Le choix de 50 % conserve à tort les deux blocs en conflit, comme si le cache offrait davantage de possibilités de placement.
Série 2 : Placement, défauts et rangements10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un programme accède à un bloc pour la première fois et l’accès sur demande échoue. Comment ce défaut est-il classé dans le modèle des trois C ?
  1. Défaut de conflit
  2. Défaut de capacité
  3. Défaut à froid
  4. Défaut de cohérence
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un cache à écriture différée évince un bloc valide dont le bit de modification est désactivé. Que doit-il arriver à cette victime ?
  1. Elle doit être écrite au niveau inférieur avant son remplacement.
  2. Elle peut être abandonnée sans écriture au niveau inférieur.
  3. Son remplacement doit utiliser l’écriture simultanée.
  4. Son bit de modification doit être activé avant son éviction.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un cache de 12 KiB possède des lignes de 64 octets et trois voies par ensemble. Combien d’ensembles possède-t-il ?
  1. 32
  2. 192
  3. 64
  4. 256
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un ensemble plein à 2 voies utilise LRU et contient initialement P et Q, P étant le moins récemment utilisé. Les accès sont Q, P, R, Q, où R est absent. Quels blocs sont évincés lors des deux défauts ?
  1. Q, puis P
  2. P, puis R
  3. P, puis Q
  4. Q, puis R
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un cache sans allocation sur écriture est initialement vide. Un rangement à l’adresse 0x80 est suivi d’une lecture de 0x80, sans accès intermédiaire. Que se passe-t-il dans ce cache ?
  1. Le rangement échoue ; la lecture réussit.
  2. Le rangement réussit ; la lecture réussit.
  3. Le rangement réussit ; la lecture échoue.
  4. Le rangement échoue ; la lecture échoue.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un accès sur demande répété échoue dans un cache à correspondance directe, mais réussit dans un cache LRU totalement associatif de même taille ayant reçu le même historique. Selon le test des trois C, quelle est la cause du défaut ?
  1. Un premier accès au bloc
  2. Une restriction du placement des blocs
  3. Une capacité totalement associative insuffisante
  4. Un débordement du tampon d’écriture inférieur
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un cache à écriture simultanée possède un tampon d’écriture de capacité limitée. Les rangements arrivent plus vite que le niveau inférieur ne peut les accepter pendant une période prolongée. Que finit-il par se passer ?
  1. Le cache passe à l’écriture différée.
  2. Le niveau inférieur abandonne les écritures en attente.
  3. Le processeur se bloque lorsque le tampon se remplit.
  4. Le tampon supprime la limite de bande passante.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un cache LRU totalement associatif vide à deux lignes reçoit les lectures de blocs 1, 2, 3, 1, 2. Combien de défauts à froid, de capacité et de conflit se produisent ?
  1. 2 à froid, 3 de capacité, 0 de conflit
  2. 3 à froid, 0 de capacité, 2 de conflit
  3. 3 à froid, 1 de capacité, 1 de conflit
  4. 3 à froid, 2 de capacité, 0 de conflit
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un cache vide à une ligne, à écriture différée et avec allocation sur écriture, utilise des lignes de 32 octets. Il reçoit des rangements à 0x00, 0x04, 0x20 et 0x24, puis une lecture de 0x40. En comptant uniquement les chargements et les écritures différées des victimes, combien d’octets circulent entre ce cache et le niveau suivant ?
  1. 160 octets
  2. 96 octets
  3. 128 octets
  4. 192 octets
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un cache vide à 2 voies possède deux ensembles et utilise le remplacement LRU. Les lectures de blocs répètent indéfiniment 0, 2, 4. Quel est le taux de succès après la phase initiale et que ferait un cache totalement associatif à quatre lignes ?
  1. Deux tiers ; il subirait aussi un tiers de défauts.
  2. Zéro ; il réussirait après ses trois premiers défauts.
  3. Un tiers ; il réussirait après quatre défauts.
  4. Zéro ; il échouerait aussi à chaque accès.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Temps d’accès et vitesse des programmes10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un cache donne 184 succès en 200 accès. Quel est son taux de défauts ?
  1. 8%
  2. 16%
  3. 92%
  4. 0,08%
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un rapport indique le nombre de défauts de L2 divisé par toutes les demandes ayant atteint L2. Quel taux est indiqué ?
  1. Taux de défauts global de L2
  2. Taux de défauts global de L1
  3. Taux de défauts local de L2
  4. Taux local d’accès à la mémoire
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un cache a un temps de recherche de 2 cycles, 6 % de défauts et une pénalité supplémentaire de 75 cycles par défaut. À 2,5 GHz, quel est son temps moyen d’accès mémoire ?
  1. 6,5 ns
  2. 1,8 ns
  3. 3,0 ns
  4. 2,6 ns
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Le CPI de base est de 1,2, le taux de défauts des instructions de 1 %, 40 % des instructions effectuent un accès aux données, le taux de défauts des données est de 5 % et tous les défauts ajoutent 80 cycles sans chevauchement. Quel est le CPI total ?
  1. 6,0
  2. 3,6
  3. 2,8
  4. 2,4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

L1 subit des défauts pour 8 % des demandes. Le taux de défauts local de L2 est de 15 %. Quelle fraction des demandes initiales échoue dans les deux caches ?
  1. 1,2%
  2. 15%
  3. 23%
  4. 0,12%
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une recherche dans un cache prend 1 ns. Son taux de défauts est de 10 % et un accès complet en cas de défaut prend 41 ns, recherche comprise. Quel est le temps moyen d’accès mémoire ?
  1. 5,1 ns
  2. 4,1 ns
  3. 5,0 ns
  4. 4,0 ns
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Chaque instruction effectue un chargement d’instruction et en moyenne 0,5 accès aux données. Les taux de défauts des instructions et des données sont de 1 % et 7 %. Les deux caches ont un temps de recherche de 2 cycles et une pénalité supplémentaire de défaut de 60 cycles. Quel est le temps moyen d’accès mémoire par accès ?
  1. 4,7 cycles
  2. 3,8 cycles
  3. 4,4 cycles
  4. 2,7 cycles
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

La recherche dans L1 prend 2 cycles et son taux de défauts est de 5 %. La recherche dans L2 prend 8 cycles et son taux de défauts local est de 20 %. La recherche dans L3 prend 30 cycles et son taux de défauts local est de 10 %. La mémoire ajoute 150 cycles après un défaut de L3. Quel est le temps moyen d’accès mémoire ?
  1. 2,45 cycles
  2. 4,35 cycles
  3. 3,95 cycles
  4. 2,85 cycles
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un programme a un CPI de base de 1,5 et 2,5 cycles d’attente mémoire sans chevauchement par instruction à 2 GHz. La fréquence d’horloge passe à 4 GHz ; le nombre d’instructions, le CPI de base, le nombre de défauts et les délais mémoire en nanosecondes restent fixes. Quelle est l’accélération ?
  1. Environ 1,23 fois
  2. Environ 2,00 fois
  3. Environ 0,62 fois
  4. Environ 1,60 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Le cache A a un temps de recherche de 0,8 ns et 6 % de défauts. Le cache B a un temps de recherche de 1,1 ns et 4 % de défauts. Les deux utilisent la même pénalité supplémentaire de défaut. Pour quelle pénalité leurs temps moyens d’accès mémoire deviennent-ils égaux ?
  1. 5 ns
  2. 10 ns
  3. 15 ns
  4. 30 ns
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Pages, TLB et indexation du cache10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quelle partie d’une adresse reste inchangée lors d’une traduction de page ordinaire ?
  1. Le numéro de page virtuelle
  2. Le numéro de page physique
  3. L’adresse de base de la table des pages
  4. Le déplacement de l’octet dans la page
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un accès provoque un défaut du TLB, et un parcours de la table des pages trouve une correspondance valide qui autorise l’accès. Quelle est normalement l’étape suivante ?
  1. Lire la page depuis le stockage.
  2. Installer la traduction et continuer.
  3. Arrêter le processus pour adresse invalide.
  4. Invalider la ligne du cache de données.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Avec des pages de 8 KiB, l’adresse virtuelle 0x12345 correspond au numéro de page physique 0x2A. Quelle est l’adresse physique de l’octet ?
  1. 0x54345
  2. 0x2A345
  3. 0x54045
  4. 0x16345
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un TLB totalement associatif contient 96 traductions, toutes pour des pages de 16 KiB. Quelle est sa couverture ?
  1. 96 KiB
  2. 1 536 MiB
  3. 1,5 MiB
  4. 6 MiB
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un processus effectue un rangement dans une page présente en mémoire. L’accès au TLB réussit, mais la correspondance actuelle n’accorde que le droit de lecture. Que se passe-t-il ?
  1. Le rangement réussit parce que la traduction a réussi.
  2. Le TLB doit échouer avant qu’un défaut puisse survenir.
  3. La page doit être rechargée depuis le stockage.
  4. Le processeur lève un défaut de page pour autorisation.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un cache VIPT simple utilise des lignes de 64 octets et des pages de 4 KiB. Sa capacité de données est de 64 KiB. Quelle est la plus petite associativité égale à une puissance de deux qui garde tous les bits d’index d’ensemble et de déplacement dans le bloc à l’intérieur du déplacement dans la page ?
  1. 8 voies
  2. 16 voies
  3. 32 voies
  4. 4 voies
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une table des pages à un seul niveau couvre un espace virtuel de 36 bits adressé par octet, avec des pages de 16 KiB et des entrées de 8 octets. Combien de mémoire une table complète nécessite-t-elle ?
  1. 4 MiB
  2. 16 MiB
  3. 32 MiB
  4. 64 MiB
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un TLB LRU totalement associatif vide à quatre entrées utilise des pages de 4 KiB. Une boucle lit à plusieurs reprises une valeur de 8 octets à chacune des adresses 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, dans cet ordre. Toutes les pages sont présentes en mémoire. Que se passe-t-il après la phase initiale ?
  1. Chaque recherche de traduction échoue ; aucun défaut de page n’est nécessaire.
  2. Seule la première recherche de chaque boucle échoue ; aucun défaut de page n’est nécessaire.
  3. Chaque recherche de traduction échoue ; chacune nécessite une lecture du stockage.
  4. Toutes les recherches de traduction réussissent ; seuls 40 octets sont consultés.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un accès autorisé réussit dans le cache de données en 2 cycles. Une recherche dans le TLB coûte toujours 1 cycle avant la recherche dans le cache. Les défauts du TLB concernent 2 % des accès et ajoutent un parcours de 40 cycles ; les défauts du cache de données concernent 5 % des accès et ajoutent 80 cycles. Aucun coût ne se chevauche et aucun défaut de page ne se produit. Quel est le temps d’accès moyen ?
  1. 6,8 cycles
  2. 4,8 cycles
  3. 7,6 cycles
  4. 7,8 cycles
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Les processus P et Q font correspondre des pages virtuelles différentes au cadre physique 7. P peut écrire ; Q peut seulement lire. P modifie un octet et le système coordonne correctement la visibilité de cette modification. Que se passe-t-il lorsque Q lit ensuite cet octet ou y effectue un rangement ?
  1. Q lit sa propre copie distincte et peut écrire.
  2. Q peut lire la modification, mais un rangement provoque un défaut.
  3. Q subit un défaut pour les deux opérations parce que P a écrit.
  4. Q lit la modification et hérite du droit d’écriture de P.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Modifications du code et compromis de la hiérarchie10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quel parcours visite des éléments adjacents d’un tableau C rectangulaire ordinaire a[i][j] ?
  1. Augmenter i en gardant j fixe.
  2. Diminuer i en gardant j fixe.
  3. Augmenter j en gardant i fixe.
  4. Augmenter i et j simultanément.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un tableau aligné contient 600 enregistrements de 48 octets chacun. Une boucle ne lit qu’un champ de 8 octets par enregistrement. Quelle organisation minimise les données transférées pour ce champ lors d’un parcours avec un cache initialement vide, des lignes de 64 octets et aucun préchargement ?
  1. Un tableau contigu séparé pour le champ.
  2. Les mêmes enregistrements dans leur ordre initial.
  3. Les mêmes enregistrements parcourus en ordre inverse.
  4. Les mêmes enregistrements avec 16 octets de remplissage chacun.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Trois blocs carrés de valeurs de 8 octets doivent tenir dans un cache de 48 KiB. Parmi les côtés proposés, lequel convient tout en laissant au moins 8 KiB inutilisés ?
  1. 48
  2. 44
  3. 42
  4. 40
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Le préchargement logiciel réduit les défauts de cache sur demande lors d’un parcours unique, mais le temps d’exécution reste le même. L’interface mémoire transférait déjà les données à son débit soutenu maximal. Quelle explication convient ?
  1. Seuls les parcours qui réutilisent chaque élément peuvent masquer la latence de transfert.
  2. Le parcours nécessite toujours les mêmes transferts, limités par la bande passante.
  3. Le taux réduit de défauts sur demande prouve que moins d’octets circulent désormais.
  4. Les données préchargées peuvent contourner la limite de bande passante de l’interface.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un cache possède 32 ensembles, des lignes de 64 octets et une capacité totale suffisante pour les données actives. Un parcours par colonnes passe entre des lignes de 256 valeurs de type double, dont les débuts sont tous alignés sur une ligne de cache. Quel remplissage répartit les débuts de lignes successifs entre tous les ensembles ?
  1. Ajouter du remplissage pour atteindre 264 valeurs par ligne.
  2. Ajouter du remplissage pour atteindre 272 valeurs par ligne.
  3. Ajouter du remplissage pour atteindre 288 valeurs par ligne.
  4. Ajouter du remplissage pour atteindre 320 valeurs par ligne.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une matrice a une dimension de 94 et les blocs ont un côté de 24. Chaque coordonnée de bloc désigne une région, y compris les régions partielles sur les bords. Combien y a-t-il de régions et combien d’éléments contient la région inférieure droite ?
  1. 16 régions ; 576 éléments
  2. 9 régions ; 484 éléments
  3. 16 régions ; 484 éléments
  4. 9 régions ; 576 éléments
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un noyau matriciel organisé par blocs utilise trois blocs carrés de valeurs de type double dans un cache de 32 KiB. Une proposition porte le côté des blocs de 16 à 40 et prévoit 2,5 fois moins de défauts à l’aide du modèle où les blocs restent dans le cache. Quelle évaluation est justifiée ?
  1. Trois blocs nécessitent 12,5 KiB ; la réduction prévue est justifiée.
  2. Trois blocs nécessitent 37,5 KiB ; l’hypothèse de présence dans le cache ne tient pas.
  3. Trois blocs nécessitent 37,5 KiB ; les défauts doivent diminuer d’un facteur 6,25.
  4. Trois blocs nécessitent 37,5 KiB ; les calculs inchangés déterminent les défauts.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un programme donné produit 0,04 défaut L1 par instruction, avec un CPI de base de 1 et une pénalité mémoire de 120 cycles sans cache L2. Un cache L2 proposé ajoute une recherche de 12 cycles et présente 10 % de défauts locaux, toutes les attentes étant successives. Quelle est l’accélération à fréquence d’horloge égale ?
  1. Environ 1,25 fois
  2. Environ 3,92 fois
  3. Environ 2,00 fois
  4. Environ 2,96 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une multiplication matricielle avec rangement par lignes passe de l’ordre i-j-k à l’ordre i-k-j. Dans le modèle de parcours séquentiel, le premier ordre produit 1,125 défaut par itération interne. Dans le nouvel ordre, le parcours de B produit un défaut toutes les huit itérations et la ligne de C reste dans le cache après la phase initiale. Sans tenir compte des autres transferts, quel facteur de réduction des défauts obtient-on en régime établi ?
  1. 4,5 fois
  2. 8 fois
  3. 9 fois
  4. 0,25 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un cache contient 128 lignes de données. Une boucle parcourt à répétition cinq blocs qui correspondent tous à un même ensemble. Compare une conception LRU à 4 voies à une conception LRU à 8 voies de même taille de ligne et de même capacité de données ; les cinq blocs partagent un ensemble dans les deux cas. Qu’est-ce qui change après la phase initiale ?
  1. Le cache à 4 voies échoue chaque fois ; celui à 8 voies réussit chaque fois.
  2. Les deux réussissent chaque fois, car cinq est inférieur à 128.
  3. Le cache à 4 voies réussit une fois par cycle ; celui à 8 voies réussit deux fois.
  4. Les deux échouent chaque fois, car l’index d’ensemble est partagé.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

80 Mots-Clés, chacun avec sa définition

A

Adressage par octet
L’adressage par octet attribue une adresse mémoire distincte à chaque octet ; les numéros de blocs sont donc obtenus en retirant les informations de déplacement de l’octet.
Des adresses qui ne diffèrent que par leurs bits de déplacement de poids faible peuvent sélectionner différents octets d’une même ligne présente dans le cache.
Allocation sur écriture
L’allocation sur écriture est une politique en cas de défaut en écriture qui charge le bloc absent dans le cache, puis effectue le rangement dans ce bloc.
Une lecture ultérieure peut réussir dans la ligne installée par un rangement antérieur avec allocation sur un autre octet du même bloc.
ASID
Un identifiant d’espace d’adressage, ou ASID, distingue les traductions appartenant à différents espaces d’adressage lorsque leurs entrées coexistent dans le TLB.
Deux processus peuvent réutiliser un numéro de page virtuelle sans utiliser la traduction de l’autre lorsque les entrées portent les ASID appropriés.

B

Bande passante
La bande passante est la quantité de données qu’un chemin mémoire peut transférer par unité de temps, généralement exprimée en octets par seconde.
Un chemin de transfert à 16 GB/s déplace 64 octets en 4 ns une fois que le flux de données commence après sa latence initiale.
Banque mémoire
Une banque mémoire est un tableau DRAM de lignes et de colonnes commandé séparément, dont les opérations peuvent se chevaucher avec celles d’autres banques.
L’entrelacement des demandes entre les banques peut augmenter la bande passante obtenue pendant qu’une banque attend une opération sur une ligne.
Bit de modification
Un bit de modification indique qu’un bloc présent dans le cache contient des modifications qui n’ont pas encore été propagées au niveau suivant de la hiérarchie.
Une victime valide non modifiée peut être abandonnée, tandis qu’une victime valide modifiée nécessite la conservation de ses données modifiées.
Bit de validité
Un bit de validité est une métadonnée d’entrée qui indique si l’étiquette et les données stockées décrivent un bloc utilisable dans le cache.
Une entrée dont les bits d’étiquette correspondent produit tout de même un défaut si son bit de validité est désactivé après le démarrage ou une invalidation.

C

Cache à correspondance directe
Un cache à correspondance directe permet à chaque bloc mémoire d’occuper exactement une entrée, déterminée par son adresse de bloc et le nombre d’entrées.
Lorsque deux blocs actifs partagent une entrée, le chargement de l’un évince l’autre, même si d’autres entrées sont vides.
Cache à index virtuel et étiquette physique
Un cache à index virtuel et étiquette physique commence la recherche de l’ensemble à l’aide de bits de l’adresse virtuelle et vérifie l’identité du bloc à l’aide d’une étiquette physique traduite.
Un cache L1 de 32 KiB à huit voies peut placer ses bits d’index d’ensemble et de déplacement dans la ligne dans le déplacement d’une page de 4 KiB.
Cache associatif par ensembles
Un cache associatif par ensembles fait correspondre un bloc à un seul ensemble, mais lui permet d’occuper n’importe laquelle des entrées de cet ensemble, appelées voies.
Deux blocs partageant un index peuvent coexister dans un ensemble à deux voies, ce qui évite les évictions imposées par la correspondance directe.
Cache multiniveau
Un cache multiniveau associe un petit cache supérieur rapide à des caches inférieurs plus grands qui traitent de nombreux défauts du niveau supérieur avant la mémoire principale.
Une demande ne paie la recherche dans L2 que si elle échoue dans L1 ; le calcul imbriqué du temps moyen d’accès mémoire pondère donc cette recherche par la proportion de défauts de L1.
Cache non bloquant
Un cache non bloquant permet à d’autres succès ou à d’autres défauts d’être traités pendant qu’une ou plusieurs demandes de blocs restent en attente.
Un processeur à exécution dans le désordre peut traiter un chargement indépendant présent dans le cache pendant qu’un autre chargement attend des données de la DRAM.
Cache totalement associatif
Un cache totalement associatif possède un seul ensemble contenant toutes les entrées, ce qui permet à tout bloc d’occuper n’importe quelle entrée sans champ d’index.
Un cache LRU totalement associatif de même capacité sert de référence pour distinguer les défauts de conflit des défauts de capacité.
Cadre de page
Un cadre de page est un emplacement de la taille d’une page dans la mémoire principale physique, qui peut contenir les données auxquelles une page virtuelle est associée.
Deux processus peuvent partager volontairement des données en faisant correspondre certaines pages virtuelles au même cadre physique.
Couverture du TLB
La couverture du TLB est l’étendue totale d’adresses représentée par les traductions disponibles, calculée en multipliant le nombre d’entrées par la taille de page lorsque les pages ont toutes la même taille.
Un TLB de 64 entrées couvre 256 KiB avec des pages de 4 KiB, même si une boucle ne touche que quelques octets de chaque page.
CPI de base
Le CPI de base est le nombre de cycles par instruction déjà nécessaire avant les attentes mémoire supplémentaires modélisées, y compris les succès de cache normaux.
Un modèle d’attente ajoute les délais de défaut au CPI de base au lieu de compter une seconde fois le temps d’accès en cas de succès.
CPI dû aux attentes mémoire
Le CPI dû aux attentes mémoire est le nombre supplémentaire de cycles par instruction attribué aux attentes mémoire, le chevauchement étant traité selon le modèle temporel.
Un nombre de 0,02 défaut par instruction et une pénalité sans chevauchement de 100 cycles ajoutent deux cycles au CPI total.

D

Défaut à froid
Un défaut à froid est un défaut lors du premier accès à un bloc dans l’historique, qu’une augmentation de la capacité du cache ne peut pas éviter à elle seule.
Sans chargement anticipé, le premier accès sur demande à chaque ligne lors du parcours séquentiel d’un tableau dans un cache initialement vide produit un défaut à froid.
Défaut de cache
Un défaut de cache se produit lorsque le niveau de cache consulté ne possède pas de copie utilisable du bloc demandé et doit l’obtenir d’un niveau inférieur.
Deux blocs consultés en alternance peuvent produire des défauts répétés lorsque la correspondance directe oblige chacun à remplacer l’autre.
Défaut de capacité
Un défaut de capacité est un défaut ultérieur qui se produit aussi dans un cache LRU totalement associatif de même capacité recevant le même historique d’accès.
Un cache totalement associatif à deux lignes subit un défaut lorsqu’un cycle de trois blocs revient au bloc qui vient d’être évincé.
Défaut de cohérence
Un défaut de cohérence se produit lorsqu’un bloc est absent parce que l’écriture d’un autre cœur a entraîné l’invalidation de sa copie dans le cache.
Un cœur peut subir un défaut sur des données partagées récemment utilisées après qu’un autre cœur a modifié la ligne de cache correspondante.
Défaut de conflit
Un défaut de conflit est un défaut ultérieur évité par un cache LRU totalement associatif de même capacité, dont le placement souple permet de conserver le bloc.
Une entrée à correspondance directe peut alterner entre deux étiquettes tandis qu’une référence associative de même taille conserve les deux blocs.
Défaut de page
Un défaut de page est une exception provoquée lorsque la traduction d’une page ou les vérifications d’autorisation ne peuvent pas se terminer normalement pour un accès.
Un rangement interdit peut provoquer un défaut sur une page présente en mémoire, tandis que certaines correspondances absentes sont résolues sans lecture du stockage.
Déplacement dans la page
Un déplacement dans la page est la position d’un octet dans une page, conservée lorsque son numéro de page virtuelle est traduit en numéro de page physique.
Deux adresses d’une même page partagent une traduction, tandis que leurs déplacements différents sélectionnent des octets différents.
Déplacement dans le bloc
Un déplacement dans le bloc est la position d’un octet dans une ligne de cache, représentée par les bits de poids le plus faible de l’adresse lorsque la taille de la ligne est une puissance de deux.
Les six bits de poids faible d’une adresse d’octet sélectionnent l’une des 64 positions d’octets dans une ligne de cache de 64 octets.
DRAM
La DRAM est une mémoire volatile qui stocke les bits sous forme de charge dans des condensateurs nécessitant un rafraîchissement périodique ; elle fournit une mémoire principale dense et abordable.
Un grand programme peut garder ses pages actives en DRAM tandis que des caches plus petits conservent les lignes les plus fréquemment consultées.
Durée du cycle d’horloge
La durée du cycle d’horloge est la durée d’un cycle du processeur, égale à l’inverse de la fréquence d’horloge et utilisée pour convertir le CPI en temps.
Doubler la fréquence d’horloge divise par deux la durée du cycle, mais double le nombre de cycles consommés par un délai DRAM inchangé.

E

Empreinte mémoire des blocs
L’empreinte mémoire des blocs est le stockage occupé par tous les blocs qui doivent coexister pour qu’un calcul organisé par blocs conserve la réutilisation prévue.
Trois blocs de 32 × 32 valeurs de type double occupent 24 KiB, laissant de la place dans un cache de 32 KiB pour d’autres données actives.
Ensemble de travail
Un ensemble de travail est l’ensemble des blocs ou des pages qu’un programme utilise activement pendant une fenêtre de temps donnée.
Deux blocs d’un ensemble de travail peuvent entrer en conflit dans une même entrée, même si leur taille totale est inférieure à la capacité du cache.
Entrée de table des pages
Une entrée de table des pages enregistre des informations de traduction telles qu’un numéro de page physique, la validité, les autorisations et l’état d’accès ou de modification.
Une page présente en mémoire peut tout de même refuser un rangement lorsque son entrée de table des pages autorise la lecture mais pas l’écriture.

É

Écriture différée
L’écriture différée est une politique de cache qui enregistre les rangements dans un bloc modifié du cache et transmet ce bloc au niveau inférieur lorsqu’il est évincé.
De nombreux rangements dans une ligne présente peuvent être regroupés en un seul transfert de bloc sortant lorsque la ligne est remplacée.
Écriture simultanée
L’écriture simultanée est une politique de cache qui transmet chaque rangement au niveau suivant tout en mettant à jour la copie présente dans le cache en cas de succès, souvent à l’aide d’un tampon d’écriture.
Un tampon d’écriture peut conserver temporairement la mise à jour destinée au niveau inférieur alors que le rangement a déjà modifié la valeur dans le cache.
Écroulement
L’écroulement est l’éviction et le rechargement répétés de blocs activement nécessaires, ce qui produit de nombreux défauts parce qu’ils ne peuvent pas rester ensemble dans le cache.
Parcourir cycliquement trois blocs dans un ensemble LRU à deux voies peut évincer chaque bloc juste avant sa prochaine utilisation.
Étiquette
Une étiquette est l’information de poids fort de l’adresse stockée avec une entrée de cache pour identifier le bloc qui occupe l’entrée ou l’ensemble sélectionné.
Un même index peut correspondre à de nombreux blocs mémoire ; la comparaison des étiquettes distingue donc celui qui est actuellement dans le cache.

H

Hiérarchie mémoire
Une hiérarchie mémoire est un ensemble de niveaux de stockage qui associe de petites mémoires rapides à de plus grandes mémoires plus lentes pour exploiter la localité des programmes.
Un défaut de L1 peut être traité par L2 avant que la demande ne subisse le délai bien plus long d’un accès à la DRAM.

I

Index de cache
Un index de cache est le champ d’adresse qui sélectionne l’entrée ou l’ensemble où un bloc mémoire est autorisé à résider.
Dans un cache à correspondance directe à quatre entrées, les blocs 0 et 4 sélectionnent tous deux l’index 0 malgré leurs étiquettes différentes.
Invalidation des traductions d’adresses
L’invalidation des traductions d’adresses empêche les correspondances en cache de rester utilisables après certaines modifications des tables des pages ou des affectations d’espaces d’adressage.
RISC-V utilise sfence.vma pour coordonner l’état du cache de traductions avec les mises à jour des correspondances.

L

Latence
La latence est le temps écoulé entre l’émission d’une demande mémoire et la disponibilité des premières données demandées.
Une interface mémoire large peut fournir de nombreux octets par seconde alors qu’un chargement dépendant attend encore des dizaines de nanosecondes.
Ligne de cache
Une ligne de cache, aussi appelée bloc, est l’unité de données de taille fixe stockée et transférée par un cache.
Une ligne de 64 octets fournit huit valeurs adjacentes de type double même lorsque l’accès qui a provoqué son chargement n’en demandait qu’une.
Localité
La localité est la tendance d’un programme à concentrer ses accès dans une partie relativement petite de son espace d’adressage pendant une courte durée.
Une boucle peut utiliser à plusieurs reprises une petite région active même lorsque le programme a alloué de nombreux gigaoctets.
Localité spatiale
La localité spatiale est la tendance à accéder à des adresses proches d’une adresse récemment consultée, ce qui rend utiles les octets voisins.
Un parcours séquentiel de tableau peut utiliser les valeurs restantes d’une ligne de cache après que la première valeur a provoqué son chargement.
Localité temporelle
La localité temporelle est la tendance à accéder de nouveau à une même instruction ou donnée peu après un accès précédent.
Les instructions d’une courte boucle sont chargées à plusieurs reprises pendant que la boucle traite des éléments successifs.
Loi d’Amdahl
La loi d’Amdahl limite l’accélération totale en fonction de la fraction du temps d’exécution touchée par une amélioration et du temps qui reste inchangé.
Réduire le coût d’exécution du cœur laisse aux attentes mémoire une plus grande part du temps d’exécution lorsque ces attentes restent fixes.

M

Mémoire flash NAND
La mémoire flash NAND est un stockage non volatil qui lit et programme des pages, efface des blocs plus grands et supporte un nombre limité de cycles de programmation et d’effacement.
Un contrôleur de SSD associe les données logiques mises à jour à de l’espace disponible dans la mémoire flash au lieu de la traiter comme une DRAM inscriptible octet par octet.
Mémoire virtuelle
La mémoire virtuelle fait correspondre les adresses des processus à la mémoire physique tout en permettant la protection, le partage contrôlé et l’utilisation de pages présentes dans le stockage.
Un processus utilise toujours la mémoire virtuelle lorsque toutes ses pages actives tiennent en DRAM et qu’il n’effectue aucun échange avec le stockage.
Mot critique en premier
Le mot critique en premier est une stratégie de chargement qui transfère le mot demandé avant les autres mots du bloc de cache pour réduire son attente.
Une demande portant sur un mot proche de la fin d’une ligne peut recevoir ce mot en premier au lieu d’attendre les mots précédents.

N

Numéro de page physique
Un numéro de page physique identifie le cadre physique utilisé par une correspondance et forme la partie de poids fort de l’adresse d’octet traduite.
L’adresse physique de l’octet est l’adresse de base du cadre plus le déplacement inchangé dans la page, et non le numéro de cadre sans décalage plus le déplacement.
Numéro de page virtuelle
Un numéro de page virtuelle est la partie de poids fort d’une adresse virtuelle qui identifie la page dont la traduction doit obtenir la correspondance.
Avec des pages de 4 KiB, retirer les 12 bits de déplacement de poids faible laisse le numéro de page virtuelle utilisé pour la traduction.

P

Parcours de la table des pages
Un parcours de la table des pages lit les entrées de correspondance nécessaires pour traduire une adresse après un défaut du TLB et vérifie si la correspondance autorise l’accès.
Un parcours réussi remplit à nouveau le TLB, tandis qu’une correspondance absente ou non autorisée peut provoquer un défaut de page.
Pas d’accès
Un pas d’accès est la différence d’adresse entre deux accès successifs d’un parcours, mesurée en octets ou en éléments, l’unité étant précisée.
Un parcours par colonnes dans une matrice rangée par lignes avance de la longueur d’une ligne en octets au lieu de la taille d’un élément.
Pénalité de défaut de cache
Une pénalité de défaut de cache est le délai supplémentaire après la recherche dans le cache nécessaire pour charger, installer et fournir un bloc depuis un niveau inférieur.
Une recherche de 2 cycles avec une pénalité supplémentaire de 80 cycles donne un accès complet en cas de défaut de 82 cycles dans un modèle séquentiel.
Permutation de boucles
La permutation de boucles échange l’ordre d’imbrication des boucles pour modifier le parcours tout en préservant le comportement requis des calculs.
Changer l’indice de matrice qui varie le plus vite peut transformer un parcours par colonnes en parcours par lignes sans réduire les calculs.
Pollution du cache
La pollution du cache est l’éviction de blocs utiles présents dans le cache par des données qui apportent peu de bénéfice, comme celles issues de préchargements inexacts ou prématurés.
Un préchargement trop précoce peut occuper une ligne nécessaire au travail courant et être lui-même évincé avant son utilisation.
Préchargement
Le préchargement demande des données avant qu’un accès sur demande en ait besoin, ce qui permet à la latence de transfert de se chevaucher avec du travail utile lorsque la demande arrive au bon moment.
Un dispositif de préchargement de flux peut préparer les lignes suivantes d’un tableau, mais les demandes inexactes consomment tout de même de la bande passante et de l’espace de cache.
Pseudo-LRU
Le pseudo-LRU est une méthode approximative de remplacement qui conserve moins d’informations d’état que LRU exact tout en cherchant à favoriser les blocs récemment utilisés.
Les caches fortement associatifs utilisent souvent une approximation de l’ordre d’utilisation, car l’enregistrement d’un ordre complet coûte davantage de matériel.

R

Rafraîchissement
Le rafraîchissement est la restauration périodique de la charge des cellules DRAM afin que les fuites n’effacent pas les valeurs qu’elles stockent.
À température normale, le rafraîchissement de la DDR4 couvre ses lignes dans un délai de 64 ms, avec des délais plus courts à des températures plus élevées.
Rangement par lignes
Le rangement par lignes stocke de façon contiguë les éléments de chaque ligne d’un tableau rectangulaire, en plaçant les lignes consécutives les unes après les autres.
Dans un tableau C a[i][j], faire varier j dans la boucle interne parcourt des éléments adjacents d’une même ligne.
Redémarrage anticipé
Le redémarrage anticipé reprend l’accès en attente lorsque le mot demandé arrive pendant le chargement d’un bloc, avant la réception de la ligne entière.
Le processeur peut continuer avec le mot nécessaire pendant que le reste d’une longue ligne est encore en cours de transfert.
Remplacement FIFO
Le remplacement FIFO évince le bloc qui est entré en premier dans un ensemble, sans modifier l’ordre d’insertion lorsqu’un accès à ce bloc réussit.
Des succès répétés peuvent rendre le bloc chargé depuis le plus longtemps très utile ; FIFO le sélectionne néanmoins avant les blocs arrivés plus récemment.
Remplacement LRU
Le remplacement LRU évince le bloc dont l’accès le plus récent est le plus ancien parmi les entrées valides de l’ensemble sélectionné.
Un succès modifie l’ordre d’utilisation même s’il ne charge aucun nouveau bloc, ce qui peut changer la victime choisie lors du défaut suivant.
Remplissage
Le remplissage ajoute un espace inutilisé entre des régions logiques de données, ce qui peut modifier les pas d’adresse et la correspondance de ces régions avec les ensembles du cache.
Ajouter huit valeurs de type double à une longueur de ligne égale à une puissance de deux peut répartir les débuts de lignes successifs entre différents ensembles.
Répartition de l’usure
La répartition de l’usure est une technique du contrôleur qui distribue les écritures et les effacements de la mémoire flash entre les blocs physiques pour répartir l’usure des cellules.
Les mises à jour répétées d’un enregistrement logique peuvent être placées dans différents blocs physiques pour éviter d’user un même emplacement.

S

Sans allocation sur écriture
L’écriture sans allocation sur écriture est une politique en cas de défaut en écriture qui transmet le rangement au niveau inférieur sans installer son bloc dans le cache consulté.
Un flux de sortie unique peut éviter d’évincer des données réutilisables du cache lorsque ses défauts en écriture sont traités sans allocation.
SRAM
La SRAM est une mémoire volatile qui conserve les bits dans des circuits stables alimentés sans rafraîchissement périodique et qui est couramment utilisée pour les caches rapides.
Un cache intégré à la puce utilise la SRAM pour offrir une faible latence tout en conservant une petite quantité de données fréquemment utilisées.
Structure de tableaux
Une structure de tableaux stocke chaque champ des enregistrements dans son propre tableau contigu, ce qui favorise le parcours de ce champ dans de nombreux enregistrements.
Additionner uniquement les positions horizontales peut charger un tableau compact de positions sans charger les autres champs de chaque particule.
Succès de cache
Un succès de cache se produit lorsque le niveau consulté contient déjà le bloc demandé dans une entrée valide dont l’étiquette correspond.
Une demande peut échouer dans L1 mais réussir dans L2 ; son résultat doit donc être indiqué séparément pour chaque niveau.

T

Tableau de structures
Un tableau de structures stocke les enregistrements de façon contiguë en regroupant les champs de chaque enregistrement, ce qui favorise l’accès à plusieurs champs d’un même enregistrement.
Une mise à jour de particule utilisant ensemble la position et la vitesse peut exploiter une grande partie de la ligne chargée pour une particule.
Tampon d’écriture
Un tampon d’écriture est une file de capacité limitée qui contient les écritures en attente vers un niveau inférieur afin que l’exécution puisse continuer avant leur achèvement.
Une longue rafale de rangements remplit le tampon si la destination ne peut pas traiter les mises à jour aussi vite qu’elles arrivent.
Tampon de ligne
Un tampon de ligne est un circuit qui conserve une ligne DRAM activée afin que les accès puissent sélectionner des colonnes sans rouvrir cette ligne.
Des demandes répétées à une ligne déjà ouverte évitent le préchargement et l’activation nécessaires pour changer de ligne dans cette banque.
Taux de défauts
Un taux de défauts est la proportion d’une population de demandes donnée qui ne trouve pas son bloc dans le cache mesuré.
Un taux de défauts de 4 % s’écrit 0,04 lorsqu’on le multiplie par une pénalité supplémentaire dans un calcul du temps moyen d’accès mémoire.
Taux de défauts global
Un taux de défauts global divise le nombre de défauts d’un niveau de cache par les demandes mémoire initiales du processeur, y compris celles traitées au-dessus de ce niveau.
Un taux de défauts de L1 de 5 % et un taux de défauts local de L2 de 20 % produisent un taux de défauts global de L2 de 1 %.
Taux de défauts local
Un taux de défauts local divise le nombre de défauts d’un niveau de cache par les seuls accès ayant atteint ce niveau après le filtrage des niveaux supérieurs.
Un taux de défauts local de L2 de 20 % décrit son flux de demandes plus difficiles, et non 20 % de tous les accès du processeur.
Taux de défauts pondéré
Un taux de défauts pondéré combine des catégories de demandes en additionnant leurs nombres de défauts attendus puis en divisant par leur nombre total d’accès.
Les taux des instructions et des données doivent être pondérés par leurs nombres d’accès lorsque chaque instruction produit moins d’une demande de données.
Taux de succès
Un taux de succès est le nombre d’accès qui trouvent leur bloc dans le niveau consulté divisé par le nombre total d’accès à ce niveau.
Quatre-vingt-dix succès sur cent demandes au cache donnent un taux de succès de 90 % et un taux de défauts complémentaire de 10 %.
Temps d’accès en cas de succès
Le temps d’accès en cas de succès est le délai nécessaire pour accéder à un niveau de cache et déterminer si l’accès réussit, y compris la recherche effectuée en cas de défaut.
Une recherche de 2 cycles ajoute deux cycles à chaque demande avant que tout délai supplémentaire de défaut ne soit compté.
Temps moyen d’accès mémoire
Le temps moyen d’accès mémoire est le délai attendu par demande mémoire, qui combine le temps de recherche et le coût supplémentaire des défauts pondéré par leur probabilité.
Une recherche plus lente peut annuler le bénéfice d’un nombre réduit de défauts lorsque la pénalité évitée au niveau inférieur est faible.
TLB
Un tampon de traduction d’adresses, ou TLB, met en cache les traductions récentes de pages virtuelles et les autorisations associées afin d’éviter des parcours répétés de la table des pages.
Un succès dans le TLB peut tout de même accompagner un défaut du cache de données, car la présence de la correspondance diffère de celle de la ligne de données.
Trace des accès au cache
Une trace des accès au cache est un relevé ordonné des accès et des changements d’état qui en résultent, utilisé pour déterminer les succès, les défauts et les évictions.
Mettre à jour chaque entrée immédiatement après un chargement permet à la ligne suivante de la trace d’utiliser le bon bloc présent dans le cache.
Traitement par blocs
Le traitement par blocs organise un calcul autour de petites régions de données qui restent dans le cache pendant que leurs valeurs sont réutilisées à plusieurs reprises.
Trois blocs de matrices peuvent être réutilisés pour de nombreuses multiplications-additions avant que l’algorithme ne passe au groupe de blocs suivant.

V

Voie
Une voie est l’une des entrées de cache disponibles dans un ensemble, chacune pouvant contenir un bloc de données avec sa propre étiquette.
Un ensemble à huit voies peut conserver huit blocs concurrents avant qu’un nouveau chargement doive choisir une victime valide.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer