2017-01-27 5 views
1

Je lis What every programmer should know about memory et je suis aux prises avec les notions de étiquettes de cache CPU (page 15.). Si je comprends bien, chaque ligne de cache de l'UC a une étiquette, qui spécifie à quelles données dans la mémoire principale correspond la ligne donnée. C'est-à-dire, si vous écrivez à une ligne particulière, vous utilisez la balise pour savoir où dans la RAM devriez-vous écrire le contenu de cette ligne. Inversement, si vous lisez des données de la RAM dans une ligne de cache L1, vous calculez une balise à partir de l'adresse RAM et la stockez quelque part, de sorte que vous sachiez d'où proviennent les données de la ligne de cache L1. Un tag est quelque chose comme un pointeur.Où est stockée l'étiquette de cache de l'UC L1d?

Je voudrais demander si cette balise elle-même est écrite quelque part dans la ligne de cache, ou y at-il une mémoire spéciale à côté du cache L1 pour stocker la balise?

Dans mon système, la taille de la ligne L1 est de 64 octets et un ponter est de 8 octets. Devrais-je viser à faire des objets fréquemment itérés dans mon programme pour ne pas dépasser 64 octets? Ou, étant donné que la taille de l'étiquette ne doit pas être supérieure à la taille d'un pointeur, devrais-je viser 56 octets?

Répondre

3

Les caches sont plus petits que la mémoire principale. Par conséquent, vous avez besoin d'un mécanisme pour mapper un grand nombre d'entrées de mémoire principale à un plus petit nombre d'entrées de cache. Afin de faire cela efficacement et à peu de frais ce que la plupart des caches je dois utiliser un certain nombre (disons 10) de bits les moins significatifs de l'adresse pour indexer une entrée de cache. Si vous choisissez au moins 10 bits de l'adresse, vous avez 1024 entrées dans votre cache. En outre, il y a de fortes chances que plus d'une adresse mémoire ait le même 10 bits. Par conséquent, vous devez distinguer différentes adresses mémoire avec le même 10 bits. Ainsi, le tag entre en action afin de servir cela. Lorsque vous voulez stocker des données dans le cache, l'entrée est sélectionnée en utilisant au moins 10 bits. Et pensez à une ligne de cache comme une entrée avec deux champs à remplir, le premier est l'étiquette où nous stockons le reste des bits d'adresse et le deuxième champ est où nous stockons des données. Quand quelqu'un dit qu'une ligne de cache est xxx octets (comme dans votre cas 64 octets), ils signifient juste la partie de données. Donc, dans votre cas, si vous voulez que vos données soient alignées sur la ligne de cache, vous devez les remplir à 64 octets, PAS 56!

La même chose vaut pour la taille. Lorsque la taille d'un cache est citée, cela signifie généralement la taille de la partie entière des données, la taille réelle est un peu plus grande en raison de la tenue de livres supplémentaires tels que tag, bit valide, etc

+0

Merci! Donc, vous voulez dire que la taille matérielle réelle de ma ligne de cache est de 64 + la taille d'un tag? –

+0

Et un peu plus pour d'autres choses comme un bit valide, un bit sale, etc –

+0

Encore un peu plus pour les bits de correction d'erreur et d'autres choses pour divers réglages de performance (par exemple - données de récence pour politique de remplacement). Il n'a même pas à résider dans la même structure matérielle, les tags et les données sont souvent partagés car vous n'avez même pas besoin d'accéder aux données sauf si vous frappez – Leeor