Fonctionnement d'un ordinateur/Le cache d'instructions

Un livre de Wikilivres.

Le préchargement des instructions[modifier | modifier le wikicode]

Plus haut, nous avions dit que les données ont une moins bonne localité spatiale et temporelle que les instructions. En fait, on peut être plus général et dire que l'accès aux données est plus irrégulier que l'accès aux instructions. Je veux dire par là que les instructions sont généralement accédées dans un ordre assez prédictible : on passe d'une instruction à la suivante, sauf en cas de sauts. Par contre, les données sont généralement accédées dans le désordre, tout dépendant du traitement fait sur les dites données. Tous les programmes exécutent une suite d'instruction, mais tous ne gèrent pas les mêmes types de données, ne font pas les mêmes traitements dessus, ne les gèrent pas de la même manière, n'utilisent pas les mêmes structures de données, etc.

De fait, si les accès sont différents, alors le préchargement doit en tenir compte pour obtenir de bonnes performances. Précharger des instructions est différent de précharger des données et le prefetcher doit en tenir compte. Pour cela, certains processeurs utilisent un prefetcher séparé pour les instructions, chose qui fonctionne à la perfection si le cache d'instruction est séparé des caches de données. Les techniques utilisés par les préfetchers d'instructions sont multiples et nombreux sont ceux qui réutilisent les techniques vues précédemment. Le préchargement séquentiel est notamment utilisé sur certains prefetchers relativement simples, de même que les prefetchers de Markov. Mais certaines techniques sont spécifiques au préchargement des instructions. Il faut dire que les branchements sont une spécificité du flux d'instruction, qui doit être prise en compte par le prefetcher pour obtenir un résultat optimal.

Le préchargement séquentiel, le retour ![modifier | modifier le wikicode]

Le préchargement séquentiel est adapté au préchargement des instructions d'un programme, vu que ses instructions sont placées les unes après les autres en mémoire. Mais un prefetcher purement séquentiel gère mal les branchements.

Branchements et préchargement séquentiel.

Sur certains processeurs, cette technique est utilisée non seulement pour charger des instructions dans le cache, mais aussi pour charger à l'avance certaines instructions dans le séquenceur. Sur ces processeurs, l'unité de chargement et de décodage sont séparées par une petite mémoire tapon de type FIFO : le tampon d’instructions (instruction buffer). En utilisant du préchargement séquentiel, on peut précharger des instructions dans le tampon d’instructions à l'avance, permettant ainsi de masquer certains accès au cache ou à la mémoire assez longs. Lorsqu'un branchement est décodé, ce tampon d’instructions est totalement vidé de son contenu.

Le Target line prefetching[modifier | modifier le wikicode]

Pour gérer au mieux les branchements, il faudrait trouver un moyen de connaître l'adresse de destination. Néanmoins, le processeur peut supposer que l'adresse de destination est fixe : il suffit de s'en souvenir pour la prochaine fois. C'est ce qu'on appelle le target line prefetching.

Target line prefetching.

Pour implémenter cette technique, le prefetcher incorpore un cache pour stocker les adresses de destination des branchements déjà rencontrés. Plus précisément, ce cache contient les correspondances entre une ligne de cache, et la ligne de cache à charger à la suite de celle-ci. Pour plus d'efficacité, certains processeurs ne stockent pas les correspondances entre lignes de cache consécutives. Si deux lignes de cache sont consécutives, on fait face à un défaut de cache dans la mémoire qui stocke nos correspondances. Le prefetcher utilise alors automatiquement un préchargement séquentiel. Ainsi, la table de correspondances est remplie uniquement avec des correspondances utiles.