Mots clés : prédiction de branchement,
exécution spéculative .
Résumé :
Les pipelines d'exécution des processeurs superscalaires
sont de plus en plus longs. Afin de limiter les ruptures de
charge dans les pipelines dues aux instructions de
branchement, des mécanismes de prédiction de branchement
sont mis en oeuvre dans les processeurs, et les
instructions prédites sont exécutées spéculativement.
Pour atteindre un niveau de performance élevé sur les
processeurs superscalaires de large degré qui apparaissent
aujourd'hui, il est nécessaire de charger des instructions
non-contiguës en mémoire, mais aussi de rompre les chaînes
de dépendances entre instructions par la prédiction de
valeurs.
Les pipelines d'exécution des processeurs sont de plus en
plus longs : 12 cycles sur l'Intel PentiumPro (1995), 20
cycles sur l'Intel Pentium 4 (2000). Les processeurs
sont capables d'exécuter plusieurs instructions par cycle. Le
séquencement des instructions devrait être interrompu à
chaque instruction de branchement en attendant le calcul
effectif de la condition et/ou de la cible : hors sur
beaucoup d'applications, plus d'une instruction sur 5 ou 6
est un branchement.
Sur tous les processeurs superscalaires actuels, des
mécanismes de prédiction de branchement sont mis en oeuvre
pour continuer le séquencement spéculatif des
instructions après un branchement sans attendre sa
résolution : la cible et la direction du branchement
sont prédites. En cas de mauvaise prédiction, les
instructions séquencées (et parfois même déjà exécutées)
doivent être annulées et le séquencement est repris sur le
chemin réellement utilisé par l'application. Étant donnée la
très lourde pénalité payée en cas de mauvaise prédiction de
branchement, la performance effective d'un processeur dépend
de la précision de la prédiction. Des schémas de prédiction
de plus en plus sophistiqués sont donc mis en oeuvre dans les
processeurs. Parmi les informations utilisées pour prédire un
branchement, on peut citer l'adresse du branchement,
l'historique des derniers branchements exécutés, l'historique
des derniers passages dans ce branchement [Yeh93],...
Cependant les recherches continuent dans plusieurs
directions, parmi lesquelles on peut citer, la réduction des
interférences sur les tables de prédiction de branchement
[7] et la prédiction des branchements indirects
[CHP97].
Les processeurs actuels exécutent les instructions de
manière spéculative et dans le désordre. La génération
actuelle de processeurs peut exécuter jusqu'à 4, parfois 6,
instructions par cycle. Il est d'ores et déjà possible
d'implémenter des processeurs pouvant lancer 10 voire 16
instructions par cycle. Cependant l'obtention de telles
performances ne peut pas être envisagée en utilisant les
mécanismes de séquencement actuels : seules des
instructions consécutives sont chargées, alors que sur
beaucoup d'applications, plus d'une instruction sur 5 ou 6
est un branchement. Pour permettre de réduire ce goulÔt
d'étranglement, il est nécessaire de prédire plusieurs
branchements par cycle [11].
Une autre difficulté surgit avec la possibilité d'exécuter
un grand nombre d'instructions indépendantes en parallèle.
Souvent les applications n'exhibent pas ces instructions
indépendantes : or l'exécution d'un programme doit
respecter les dépendances entre les instructions. La
prédiction de branchement est un premier accroc à ce respect
des dépendances : toute instruction postérieure à un
branchement est dépendante de ce branchement ; cette
dépendance est «cassée» par la prédiction, mais les
instructions sont validées dans l'ordre du programme.
Récemment, il a été noté que le même principe pouvait être
appliqué pour aussi «casser» les dépendances de données sur
les programmes : on peut ainsi prédire le résultat d'une
instruction ou d'un calcul d'adresse [LS96a,SVS96].