L'Architecture NetBurst
Le Pentium 4 est un processeur résolument tourné vers le multimédia,
c'est-à-dire qu'il doit être en mesure de traiter rapidement de grosses
quantités d'informations (flux audio, vidéo). Comme nous le verrons en
étudiant son architecture, celle-ci a été pensée pour limiter au maximum
les goulets d'étranglements, tant au niveau de la capacité de calcul que
du transfert des données dans le processeur et entre le processeur et
le reste du système. L'objectif principal du Pentium 4 est donc le débit.
NetBurst a ainsi été créée avec deux lignes directrices :
- Permettre technologiquement l'utilisation de fréquences élevées (avec
les moyens actuels).
- Exploiter cette fréquence, en limitant au maximum les goulets d'étranglements.
La contrainte technologique
pour les hautes fréquences réside dans le découpage du pipeline. Le principe
est le suivant : plus le pipeline comprend d'étapes, plus simples sont
les étapes, et d'un point de vue physique du transistor, plus vite elles
s'effectuent, permettant ainsi une fréquence de fonctionnement élevée.
L'architecture NetBurst repose sur une technologie de pipeline à 20 niveaux
de profondeurs (à comparer avec les pipelines à 5 niveaux du Pentium et
à 10 niveaux des Pentium Pro/II/ !!!) et qui lui vaut le nom Hyper
Pipelined.
Les 20 étapes du pipeline couvrent les quatre grandes étapes du traitement
des instructions :
- Le « in-order front end » charge les instructions et les décode. Elle
nécessite 5 étages du pipeline (1 à 5).
- Le « out-of-order (OOO) execution logic » réordonne les instructions
et les répartit vers les unités de calcul. Il occupe 7 étapes du pipeline
(6 à 12).
- La phase d'exécution fait intervenir les unités de calcul proprement
dites : 5 étapes (13 à 17).
- La phase de « retirement » réordonne les résultats du calcul de façon
cohérente : 3 étapes
(18 à 20).
Le principal défaut d'un pipeline
est qu'il fournit un débit optimal s'il est constamment alimenté en instructions
et jamais interrompu.
Or, en pratique, le pipeline est régulièrement soumis à des conflits qui
interrompent son fonctionnement. Parmi ces conflits, on distingue :
- Les conflits de ressources matérielles. Une instruction nécessite
une ressource du pipeline déjà occupée par une autre instruction.
- Les conflits de dépendances. Une instruction attend le résultat d'une
autre pour poursuivre son exécution.
- Les conflits de branchements.
Les deux premiers types de conflits engendrent des états d'attente dans
le pipeline (ou « bulles »). La méthode utilisée pour pallier à ces conflits
réside dans l'exécution dans le désordre, ou Out-Of-Order
Execution (OOO). Cette solution existe déjà sur le noyau P6.
Le conflit de branchement est en revanche beaucoup plus pénalisant car
en cas d'échec cas il nécessite de vider complètement le pipeline, opération
d'autant plus pénalisante que le pipeline est long, et de le remplir à
nouveau. Afin de limiter les effets néfastes des conflits de branchement,
le Pentium 4 utilise deux mécanismes de prédiction de branchement, tout
comme sur le Pentium !!! :
- un mécanisme dynamique, qui
stocke un historique des branches prises, et dont la capacité de stockage
de branches est passée de 512 entrées sur Pentium !!! à 4096 entrées
sur Pentium 4.
- Un mécanisme statique, utilisé
en cas d'échec du précédent ; il est dit « statique » car il n'utilise
pas un historique de branchement mais fonctionne selon un algorithme
constant.
La prédiction de branchement
est un facteur de performances important, car le remplissage du pipeline
est une opération très coûteuse en cycles processeur ; en effet, le pipeline
n'est capable de traiter que des micro-opérations (µops), elles-mêmes
étant le résultat du décodage des instructions plus complexes arrivant
dans le bus du processeur.
Afin d'accélérer cette phase de décodage, les processeurs modernes multiplient
les unités de décodage. Ainsi le Pentium !!! et l'Athlon sont capables
de décoder jusqu'à trois instructions IA-32 par cycle. Le Pentium 4 quant
à lui utilise une technique différente : il n'est capable de décoder qu'une
seule instruction IA-32 par cycle, mais en revanche il dispose d'une mémoire
tampon permettant de stocker le résultat des décodages ; il s'agit du
Trace Cache.
A la différence d'un cache code classique qui contient des instructions
non décodées, le Trace Cache est inséré dans les premières étapes du pipeline,
il contient donc des µops directement utilisables par les étapes suivantes
du pipeline.
Ce système présente deux intérêts majeurs :
- Réduire les cycles de pénalités
en cas d'échec de branchement. En effet, dans une telle situation, le
pipeline doit être vidé puis remplit à nouveau avec les bonnes instructions,
qui avec un peu de chance sont contenues dans le cache code. Un cache
code classique contient des instructions IA-32 qui doivent alors être
à nouveau décodées pour être utilisables par le pipeline. Le Trace Cache,
contenant des µops déjà décodées, permet d'éviter cette phase de décodage.
- Par rapport à un cache code
classique, le Trace Cache se situe après l'unité de prédiction
de branchement (BPU) ; cela implique que les µops contenues dans le
Trace Cache sont celles prévues par la prédiction de branchement, alors
qu'un cache code classique contient les instructions des deux branches,
dont une seule sera prise.
Cependant le Trace Cache présente
quelques désagréments, liés au fait qu'il est une mémoire insérée dans
le pipeline. En effet, rechercher une information dans une mémoire n'est
pas immédiat, et la latence engendrée dépend directement de sa taille
et de son organisation. Afin de ne pas insérer trop de latences au sein
même du pipeline, le Trace Cache se doit d'avoir une taille limitée. Et
plus la taille est faible, moins les chances d'y trouver l'information
sont grandes, c'est là l'éternel dilemme des mémoires caches.
L'autre désavantage est lié à l'architecture physique de la mémoire qui
occupe une surface assez importante dans la puce. Le fonctionnement optimal
du pipeline nécessite que les unités impliquées dans les étapes successives
soient le plus rapprochées possible d'un point de vue physique, afin de
réduire la distance de parcourt des signaux. A ce titre, le Trace Cache
représente une importante quantité de transistors, et propager une donnée
jusqu'à l'étape suivante du pipeline peut s'avérer problématique en terme
de distance. Le résultat est que le pipeline possède une étape dédiée
à la propagation du signal depuis le Trace Cache vers l'étape suivante,
justement nommée étape Drive. Le pipeline du Pentium 4 possède en tout
deux étapes Drive dédiées à la propagation du signal.
Au final, le Trace Cache s'avère plus efficace qu'un cache code classique,
et Intel prétend qu'un Trace Cache de 12K µops équivaut à un cache code
L1 de 16 à 18Ko.
Les µops fournies par le Trace Cache continuent leur chemin dans le
pipeline du P4 pour arriver dans l'unité de réordonnancement, ou « Out-of-Oder
execution logic ». Le rôle de cette unité, déjà présente dans l'architecture
P6, est d'optimiser l'ordre d'exécution des µops afin d'éviter les conflits
de ressources et de dépendances, nuisibles au pipeline. Les µops sont
alors réparties vers les unités de calcul.
Suite ( Les unités
de calculs )
|