Next: Exceptions et interruptions Up: Séquencement et exécution Previous: Prédiction de branchement

Gestion des dépendances de données et des conflits de ressources

Les dépendances de données et les conflits de ressources influent aussi de manière importante sur les performances. Sur les microprocesseurs superscalaires, en particulier ceux exécutant les instructions dans le désordre, la gestion de ces interblocages est très délicate. Nous présentons chaque type d'interblocage avant d'étudier les solutions apportées sur chacune des architectures.

Généralités

Conflits de ressources


Un conflit de ressource arrive lorsque deux instructions demandent accès à une même ressource (unité fonctionnelle, bus, etc.). Un tel conflit peut être résolu en retardant une des deux instructions d'un certain nombre de cycles. De même, un défaut de cache peut entraîner un interblocage.

Dépendances de données :


On distingue trois types de dépendances : lecture après écriture (Read After Write), écriture après lecture (Write After Read) et écriture après écriture (Write After Write).

L'exemple de la figure illustre ces trois types de dépendance sur les registres.

L'instruction (2) présente une dépendance de type RAW sur l'instruction (1). L'instruction (3), elle, présente une dépendance de type WAR par rapport à l'instruction (2) et est aussi victime d'une dépendance de type WAW par rapport à l'instruction (1).

Renommage de registres


Les dépendances entre les instructions peuvent dégrader les performances des microprocesseurs. Le renommage de registres est une technique utilisée pour supprimer les dépendances de type WAR et WAW entre les instructions et prévoir un traitement précis des exceptions. Cette technique est utilisée par les microprocesseurs qui exécutent les instructions dans le désordre. Un registre logique est mappé dans un nouveau registre physique s'il est un registre de destination. Un registre physique ne peut être libéré que lorsque que la dernière instruction l'utilisant comme opérande à été validée.

La figure présente un exemple de renommage de registres. Le code de gauche est apparemment totalement séquentiel. Après renommage des registres (code de droite), nous voyons deux blocs d'instructions indépendants (1,2 et 3,4). Ces deux blocs pourront être exécutés en parallèle. Les dépendances de type WAW et WAR ont disparues.

Les mécanismes de renommage de registres du MIPS R10000 et du PentiumPro sont présentés aux paragraphes et .

Mécanisme de chaînage


Le résultat d'une instruction est en général écrit dans le fichier de registres, puis lu par une instruction subséquente. Cette instruction doit en théorie attendre l'écriture dans le fichier de registres pour obtenir son opérande. Sur les trois microprocesseurs étudiés, un mécanisme de chaînage des instructions, appelé mécanisme de chaînage (bypass), est mis en oeuvre pour éviter des retards sur les instructions. Le résultat d'une opération ou d'un chargement dans un registre peut ainsi être utilisé comme opérande par une instruction postérieure dès sa sortie de l'unité fonctionnelle et sans attendre son écriture dans le registre destination.

Résolution des interblocages sur le MIPS R10000

Pour réduire le nombre de dépendances sur les registres, les instructions sont renommées avant d'être envoyées vers les trois files d'attente. Pour implémenter le renommage de registres (64 registres entiers physiques et 64 registres physiques flottants), le MIPS R10000 utilise une table de correspondance (Mapping Table), une liste active (Active List) et une liste libre (Free List).

La Mapping Table représente la liste des registres physiques associés aux registres logiques. L'Active List contient toutes les instructions numérotées. Elle peut gérer dans le pipeline jusqu'à 32 instructions. Les instructions des files d'attente peuvent être exécutées dans le désordre. Cependant les instructions sont validées dans l'ordre dans l'Active List. La Free List est la liste des registres physiques libres, c'est-à-dire disponibles pour le renommage.

Résolution des interblocages sur l'UltraSPARC

L'UltraSPARC gère les interblocages au cours de l'étage de groupement. Toutes les dépendances sur les registres (Read After Write) et les conflits de ressources (manque d'unités fonctionnelles) sont résolus durant cet étage. Il est à noter que les dépendances Write After Write et Write After Read sur les registres ne peuvent pas exister sur ce microprocesseur exécutant les instructions dans l'ordre et écrivant les résultats à un étage fixe.

Pour réduire l'impact des défauts du cache de données sur les performances, l'UltraSPARC utilise un cache non bloquant, dont nous détaillerons le fonctionnement au paragraphe . L'UltraSPARC implémente aussi un tampon de lectures et un tampon d'écritures.

Il est à noter que sur les écritures en mémoire, l'UltraSPARC n'a pas à attendre que la donnée à écrire soit connue pour lancer le store. Le store peut même être lancé dans le même groupe que l'instruction qui calcule le résultat à sauvegarder.

Résolution des interblocages sur le PentiumPro

Les dépendances de données de type Write After Read et Write after Write sont résolues par le renommage de registres. Le renommage de registres du PentiumPro s'effectue de la façon suivante : les micro-opérations sortant des trois décodeurs d'instructions entrent dans la Register Alias Table (RAT). Jusqu'à trois instructions au maximum peuvent être traitées par la RAT. Le Reorder Buffer du PentiumPro contient 40 registres qui peuvent être soit des registres entiers soit des registres flottants. La RAT mappe les registres logiques obtenus lors de la traduction des instructions en micro-opérations, sur les 40 registres physiques. Elle détermine si les opérandes source des micro-opérations doivent être pris dans le fichier de registres ou dans le Reorder Buffer.

Au coeur du PentiumPro, les instructions sont exécutées dans le désordre. La gestion des interblocages se fait au niveau de la station de réservation, avant que les micro-opérations ne soient lancées dans les unités fonctionnelles. La station de réservation vérifie les opérandes de chaque micro-opération, et lance les micro-opérations et leurs données quand les opérandes sont valides. C'est au niveau des stations de réservation que les vraies dépendances de données ainsi que les conflits de ressources sont traités.

Le Reorder Buffer permet de maintenir l'ordre du programme, en conservant temporairement les micro-opérations exécutées spéculativement et en les validant dans l'ordre d'exécution du programme.



Next: Exceptions et interruptions Up: Séquencement et exécution Previous: Prédiction de branchement


flloansi@IRISA.irisa.fr
Tue Jun 4 09:57:56 MET DST 1996