32 | | 1. Question ? |
33 | | {{{#!protected |
34 | | ''' |
35 | | * réponse |
36 | | ''' |
37 | | }}} |
38 | | |
| 32 | 1. Que signifie taux de MISS ? De quoi dépend-t-il ? Est-il stable ? Quelle est sa valeur typique ? |
| 33 | {{{#!protected |
| 34 | ''' |
| 35 | * Le taux de MISS est le pourcentage d'échec du cache, quand il n'a pas l'information demandé par le processeur. |
| 36 | * Ce taux dépend de la taille du cache, mais aussi du profil d'usage de la mémoire par le programme. |
| 37 | * Il n'est pas stable. Le travail du compilateur est de tenté de le réduire en utilisant mieux le cache. |
| 38 | * < 2% pour le cache des instructions; < 5% pour le cache des données |
| 39 | ''' |
| 40 | }}} |
| 41 | 1. Qu'est ce que le coût d'un MISS ? De quoi dépend-t-il ? Quelle est sa valeur typique ? |
| 42 | {{{#!protected |
| 43 | ''' |
| 44 | * Le coût d'un MISS, c'est le nombre de cycles nécessaire pour que le cache aille chercher la ligne manquante. |
| 45 | * Ce coût dépend du temps pris pour envoyer une requête vers la mémoire, du temps pris par le cache L2 pour rendre la ligne manquante, du temps de transfert de la ligne sur le bus système et de l'enregistrement dans le cache L1. |
| 46 | * Disons de 10 à 50 cycles, c'est très variable. |
| 47 | ''' |
| 48 | }}} |
| 49 | 1. Que signifient CPI et IPC ? Quel est le rapport entre les deux ? |
| 50 | {{{#!protected |
| 51 | ''' |
| 52 | * CPI : Clock Per Instruction. IPC : Instruction Per Clock. IPC = 1/CPI |
| 53 | ''' |
| 54 | }}} |
| 55 | 1. Sur un processeur capable de démarrer une instruction par cycle, pourquoi on n'a pas un CPI de 1 ? |
| 56 | {{{#!protected |
| 57 | ''' |
| 58 | * parce qu'en fait, certaines instruction durent deux cycles et qu'il y a des dépendances entre instructions qui ajoutent des délais d'attente. |
| 59 | ''' |
| 60 | }}} |
| 61 | 1. Finalement, quelle est l'équation définissant le CPI réel en fonction du CPI0 (avec un cache parfait, donc un taux de MISS de 0%) et de taux de MISS réel et des coûts de MISS ? |
| 62 | {{{#!protected |
| 63 | ''' |
| 64 | * CPI = CPI0 + TauxMissIns * CoutMissIns + TauxMissDar * CoutMissIns |
| 65 | ''' |
| 66 | }}} |
| 67 | 1. Qu'est-ce qu'une perte de cohérence pour un cache de niveau 1 ? Est-ce grave ? |
| 68 | {{{#!protected |
| 69 | ''' |
| 70 | * C'est quand les données qu'il contient ne sont pas les mêmes que dans la mémoire. |
| 71 | * Ces données peuvent être obsolètes, si un composant a écrit en mémoire des lignes et que les copies de ces lignes n'ont pas été mises à jour dans le cache. |
| 72 | * Dans certaines conditions la mémoire pourrait aussi contenir des valeurs obsolètes, si le cache modifiait sa copie sans mettre à jour la mémoire, mais cela n'arrive pas dans notre plateforme parce que le cache a une stratégie write through, dans laquelle toutes les écritures demandées par le processeur sont faites en mémoire (et dans le cache si la ligne adressée est présente). |
| 73 | * Oui, c'est grave. C'est même mortel pour l'application. |
| 74 | ''' |
| 75 | }}} |
| 76 | 1. Est-ce qu'il y a un risque de perte de cohérence si on a un seul processeur ? Et s'il y en a plus qu'un ? |
| 77 | {{{#!protected |
| 78 | ''' |
| 79 | * Oui, si on a un autre initiateur dans le SoC capable d'écrire en mémoire dans des lignes dont la copie est dans le cache. |
| 80 | * Oui, aussi si on a deux caches, on a des risques à cause des copies de lignes. |
| 81 | ''' |
| 82 | }}} |
| 83 | 1. Un moyen d'éviter le problème de cohérence, c'est le snooping, qu'est-ce que c'est ? |
| 84 | {{{#!protected |
| 85 | ''' |
| 86 | * C'est l'espionnage, fait par les caches L1, des requêtes transitant par le bus afin de repérer des écritures faites par les autres dans des lignes dont ils ont une copie. Quand il voit des écritures, ils mettent leur copie à jour, ou plus simplement, il invalide leur copie (puisqu'elle est obsolète). |
| 87 | ''' |
| 88 | }}} |
| 89 | 1. Quels autres moyens connaissez-vous pour traiter le problème de cohérence ? |
| 90 | {{{#!protected |
| 91 | ''' |
| 92 | * On peut l'éliminer en utilisant des mémoires non caché. |
| 93 | * On peut demander au cache de flusher les lignes contenant des données partagées avant de les lire afin d'être sûr de lire la version de la mémoire. |
| 94 | * On peut utiliser la stratégie directory-based qui délègue que cache L2, la responsabilité de maintenir la cohérence entre toutes les copies qu'il a distribuées. |
| 95 | ''' |
| 96 | }}} |
| 97 | 1. Qu'est-ce qu'un faux partage ? (Non, ce n'est pas quand votre petit frère coupe un gâteau pour vous en donner une part) |
| 98 | {{{#!protected |
| 99 | ''' |
| 100 | * C'est quand on met deux variables globales dans la même ligne, que ces variables sont utilisées par deux threads s'exécutant sur deux processeurs distincts. La ligne contenant les deux variables peut être copiées dans les deux caches et la modification d'une variable, fait croire à l'autre cache qu'il y a une perte de cohérence par erreur. |
| 101 | ''' |
| 102 | }}} |
| 103 | 1. Est-ce que le faux partage est un problème grave |
| 104 | {{{#!protected |
| 105 | ''' |
| 106 | * Non, ce n'est pas performant quand ça arrive et ça consomme du temps et de l'énergie pour rien, mais ce n'est pas mortel. |
| 107 | ''' |
| 108 | }}} |