Next: Les compatibles Pentium Up: Les microprocesseurs xxx86 Previous: Le jeu d'instructions

Le processeur Pentium

Depuis l'introduction du microprocesseur 8086 en 1978, l'architecture xxx86 a évolué à travers plusieurs implémentations tant au niveau architectural que technologique. Ainsi le i486, introduit en 1989, intègre sur une seule puce, en plus de toutes les fonctionnalités d'un processeur entier, une unité flottante et un cache. Le Pentium intègre deux unités entières, une unité flottante totalement pipelinée ainsi que deux caches séparés.

Avec son architecture superscalaire de degré deux, l'introduction d'une prédiction de branchement et l'amélioration de l'unité flottante qui, selon Intel, accélère de plus de dix fois l'exécution des opérations flottantes courantes, le processeur Pentium constitue une profonde évolution par rapport à son prédécesseur le i486. Il implémente par ailleurs des caches d'instructions et de données séparés de 8 Ko chacun auxquels sont également ajoutés deux TLB.

La largeur du bus de données externe est passée à 64 bits dans le but d'accélérer les transferts de données entre la mémoire et les caches.

Types d'exécution.

Tous les microprocesseurs d'architecture RISC possèdent une unité de contrôle des opérations câblée. Cette technique a pour avantage sa rapidité d'exécution et nécessite une place relativement limitée sur le silicium. Elle permet de pipeliner les exécutions d'instructions consécutives dans le flot d'instructions.

Lorsque le jeu d'instructions est aussi complexe que celui du Pentium, ce type d'implémentation de l'unité de contrôle peut difficilement être envisagé. C'est pourquoi Intel n'a câblé que le contrôle des instructions simples les plus fréquemment utilisées (correspondant en gros au coeur RISC du jeu d'instructions).

Les autres instructions sont contrôlées par un microcode. L'unité de contrôle est intégrée dans un << ordinateur miniature >> (unité arithmétique, mémoire, compteur ordinal, etc.). À chaque exécution d'une micro-instruction, des signaux sont générés pour contrôler le chemin de données et l'adresse de la prochaine micro-instruction est calculée. Cette méthode a pour principal avantage sa grande flexibilité. Elle permet aux concepteurs de modifier facilement le jeu d'instructions du microprocesseur, mais aussi de ne pas se limiter dans les différentes versions d'une même instruction.

Ainsi, en associant deux techniques d'implémentation de l'unité de contrôle, le Pentium présente deux niveaux pour l'exécution des instructions :

Le pipeline.

Le Pentium utilise un pipeline entier de cinq étages similaire à celui du i486. Il est intéressant de développer les diverses étapes de ce pipeline afin d'illustrer les conséquences d'un jeu d'instructions CISC sur l'exécution.

  1. Prefetch. Chargement des instructions du cache (ou de la mémoire) dans les tampons de préchargement.

    Ces tampons permettent de charger jusqu'à 32 octets d'instructions consécutifs. Il est à noter que par rapport à une architecture RISC, du fait de l'irrégularité de la taille des instructions, celles-ci peuvent être placées sur deux lignes de cache consécutives. Les deux ports de lecture implémentés permettent alors d'accéder simultanément à ces deux lignes. Un mécanisme supplémentaire réaligne alors les octets avant de les placer dans l'un des tampons.

    La présence de ce mécanisme dans le Pentium, ainsi que d'autres particularités comme une grande capacité de préchargement des instructions ou la présence de deux caches distincts, témoignent de la difficulté de la gestion des instructions CISC, de tailles variables et non alignées en mémoire.

  2. Decode 1. Décodage en parallèle des deux prochaines instructions dans le flot d'instructions et décision de leur éventuel couplage. Comme on l'a vu, les instructions du Pentium ne sont pas toutes de même taille. Elles peuvent posséder des préfixes qui demandent chacun un cycle supplémentaire de décodage dans le pipeline U.

    Le Pentium implémente deux pipelines entiers indépendants : le pipeline U qui peut exécuter toutes les instructions entières et flottantes, et le pipeline V qui ne peut exécuter que les instructions entières dites << simples >> ainsi que les instructions d'échange de registres flottants (FXCH).

  3. Decode 2. Calcul de l'adresse des opérandes présentes en mémoire. Contrairement au i486, le Pentium permet le décodage d'instructions contenant l'adressage basé ou indexé sans cycle supplémentaire.

  4. Execute. Exécution des instructions et accès à la mémoire. Grâce à ses deux ports de lecture, le cache de données peut être accédé simultanément par les deux pipelines d'exécution. Dans le cas très courant où un des opérandes est en mémoire, cet étage est occupé deux ou trois cycles : un cycle pour accéder l'opérande, un pour l'exécution de l'opération et un pour l'éventuelle écriture du résultat en mémoire. Dans ce cas, l'opération (simple) dans le pipeline V est toujours exécutée en parallèle avec le dernier cycle du pipeline U.

  5. Write Back. Modification de l'état du processeur par l'achèvement de l'exécution des instructions. C'est aussi à cet étage que la prédiction de branchement est vérifiée et validée.

Il est intéressant de remarquer que ce pipeline présente la même particularité que celui du MIPS R8000 (calcul de l'adresse de l'opérande suivi de l'exécution de l'instruction dépendante). Intel justifie cette inversion de la même manière que MIPS en déclarant que la séquence << lecture-utilisation de la donnée >> est plus critique que la séquence << opération entière-accès à la mémoire >>.

Il faut toutefois noter que ce type de pipeline augmente la pénalité de branchement d'un cycle. Il est donc préférable de l'accompagner d'un bon mécanisme de prédiction, c'est le cas sur le Pentium.

Le Pentium implémente un tampon d'adresses de branchements (BTB pour Branch Target Buffer) associatif par ensemble à quatre voies, d'une capacité de 256 adresses cibles. Deux tampons de préchargement des instructions cibles viennent compléter ce dispositif. Quand le BTB détecte une instruction de branchement parmi les instructions préchargées, il prédit à partir d'un algorithme à deux bits si le branchement est pris ou non. Dans le cas d'une prédiction positive, le BTB fournit l'adresse cible sous forme d'adresse physique et permet ainsi de précharger les instructions dans l'un des deux tampons. L'implémentation d'une telle technique marque une grande évolution par rapport au i486 totalement dépourvu de tels mécanismes.

À la différence des autres processeurs superscalaires, le Pentium utilise une technique simple de couplage éventuel d'instructions consécutives.

L'émission des instructions dans le Pentium respecte toujours l'ordre du flot d'instructions. Le pipeline U exécute obligatoirement la première instruction de la paire. Le pipeline V ne peut accepter que des instructions entières simples, c'est-à-dire ne nécessitant pas l'appui du microcode pour leur contrôle. Il n'est possible d'émettre deux instructions dans le même cycle que sous certaines conditions définies par les règles de couplage suivantes :

On peut remarquer que, si la technique de groupement des instructions utilisée dans le Pentium est moins élaborée que celle d'autres processeurs superscalaires, elle permet néanmoins d'émettre, dans le même cycle, deux instructions entières. Cette caractéristique du Pentium explique que ses performances sur des codes entiers (par exemple SPECint92) sont du même ordre que celles de microprocesseurs RISC concurrents alors que ce n'est pas le cas pour l'exécution de codes flottants.

Le pipeline flottant du Pentium comporte huit étages dont cinq sont partagés avec le pipeline entier U. Il est possible de coupler l'instruction FXCH avec d'autres instructions flottantes à condition que celle-ci apparaisse en deuxième position (exécution sur le pipeline V) dans le flot d'instructions. C'est le seul cas où une instruction flottante peut être couplée.

Les instructions dites transcendantales du Pentium (telles les fonctions trigonométriques cosinus, sinus, etc.) utilisent, comme dans l'i486, un contrôle microprogrammé et sont d'une durée d'exécution relativement longue.

La hiérarchie mémoire.

Des statistiques sur les codes exécutés par les microprocesseurs xxx86 ont montré qu'un programme fait, en moyenne, 0.6 accès à la mémoire par instruction alors que, dans un code RISC, seulement une instruction sur trois ou quatre est un accès à la mémoire. En effet, la plupart des instructions arithmétiques et logiques du Pentium adressent un de leurs opérandes en mémoire. De plus, comme le banc de registres entiers contient seulement huit éléments, il est nécessaire de recourir souvent à ce type d'instructions. Devant un tel constat, les concepteurs du Pentium ont choisi de permettre un accès à chaque cycle sur le cache de données pour chacun des pipelines U et V.

Le Pentium dispose de deux caches distincts pour les instructions et les données d'une capacité de 8 Ko chacun. Ce choix architectural est différent de celui pris pour le i486 et a compliqué le maintien de la compatibilité avec ses prédécesseurs. En effet, certains codes exécutables sur les architectures xxx86 écrivent dans le champ de la valeur immédiate des instructions (Self modifying code). Dans l'absolu, ceci permet de limiter le nombre d'accès à la mémoire d'une instruction sans encombrer le banc de registres. Cette caractéristique rend obligatoire la possibilité d'accéder en écriture un espace mémoire où se trouvent les instructions. Gérer cette particularité est déjà complexe avec un cache unifié et l'est encore plus quand les caches sont séparés.

La mise en oeuvre d'une architecture superscalaire pouvant émettre simultanément deux instructions, de tailles parfois importantes, ainsi que la possibilité de pouvoir adresser, dans le même cycle, deux emplacements mémoire, ont nécessité la scission du cache commun présent dans le i486.

Les deux caches primaires du Pentium sont associatifs par ensemble de deux et utilisent une politique de remplacement de type LRU. Rappelons que le cache primaire du i486 est unifié et associatif par ensemble de quatre voies.

Le cache d'instructions n'est accessible qu'en lecture, alors que le cache de données est accessible en lecture et écriture. Les deux techniques de mise à jour de la mémoire peuvent être utilisées (écriture simultanée ou différée). Une étiquette indique la stratégie appliquée au niveau de chaque ligne du cache de données.

Dans le cas où un code veut accéder à une instruction en écriture (self modifying code), il ne peut pas, comme c'était le cas avec les prédécesseurs, modifier directement la ligne dans le cache d'instructions. La ligne d'instructions adressée est au préalable invalidée puis l'écriture est effectuée en mémoire.

Par ailleurs, afin de rompre le moins souvent possible le séquencement du flot d'instructions, le Pentium possède deux types de tampons d'écritures :

Les tampons d'écriture du Pentium ne sont pas considérés comme des unités de stockage à part entière, comme le sont les caches, c'est-à-dire qu'ils n'appartiennent pas à l'espace d'adressage. Ils doivent donc être vidés avant chaque lecture sur la mémoire principale.

Les tampons d'écritures ainsi que tous les mécanismes de synchronisation ne sont utilisés que pour les accès à la mémoire. La synchronisation des accès en ce qui concerne les entrées/sorties est laissée à la responsabilité du programmeur.

Le cache secondaire.

Le processeur Pentium ne dispose pas de contrôleur de cache directement implémenté sur la puce. Intel propose deux composants pour implanter un second niveau de cache : le 82496 qui fait office de contrôleur de cache et qui est une amélioration du contrôleur de cache secondaire du processeur i486 DX, et le 82491, un composant de mémoire SRAM spécialement conçu pour cette fonction. L'organisation du cache secondaire étant associative par ensemble à deux voies, il est nécessaire, pour accéder à une ligne du cache, d'effectuer une comparaison des étiquettes des lignes de l'ensemble adressé. Afin de pouvoir répondre, la plupart du temps, en un cycle, le cache secondaire du Pentium utilise la technique dite MRU (Most Recently Used). La donnée adressée le plus récemment dans un ensemble est disponible à la fin du premier cycle. En cas de mauvaise prédiction, la donnée référencée est disponible à la fin du second cycle. À noter que l'information MRU de chaque ensemble doit être répliquée dans chaque composant mémoire. Ceci explique, entre autres, la nécessité de composants mémoire spécifiques.

Le cache secondaire du Pentium utilise la technique des bits de parité pour détecter et corriger les éventuelles erreurs de transmission sur le bus. Le bus mémoire est, en principe, d'une largeur de 64 bits mais peut être étendu à 128 bits.

La technique de mise à jour de la mémoire préconisée pour le cache secondaire est la politique d'écriture différée (Write-back) à laquelle est associé un support aux systèmes multiprocesseurs (protocole de cohérence de type MESI). Toutefois il est possible d'utiliser le cache secondaire comme un cache à écriture simultanée.

La taille du cache secondaire peut être de 256 Ko ou de 512 Ko en associant plusieurs puces 82491 (chaque puce a une capacité de 32 Ko).

Nous ne reviendrons pas sur les mécanismes de segmentation et de pagination mis en oeuvre sur le Pentium. Afin de minimiser le nombre de cycles nécessaire à la traduction des adresses, deux TLB, associatifs par ensemble à quatre voies, sont implémentés pour les instructions et les données. La capacité de chacun d'entre eux pour des pages de 4 Ko est de 64 entrées pour les données et 32 entrées pour les instructions. Un certain nombre d'entrées additionnelles permettent par ailleurs de mapper des pages de 4 Mo.

Le Pentium inclut également des compteurs de performances, au même titre que les architectures POWER et DEC. Cependant, Intel se réservant l'usage de ces compteurs, peu d'informations sont disponibles.
Réalisé initialement en technologie BiCMOS à 0.5 m, le Pentium contient 3.3 millions de transistors. Les dernières annonces mentionnent le passage à une technologie à 0.35 m BiCMOS qui devrait permettre à ce processeur d'atteindre 167 MHz. Une première version de ce processeur (le P54CS), séquencé à la fréquence de 133 MHz, devrait atteindre des performances de l'ordre de 155 SPECint92 et 116 SPECfp92.



Next: Les compatibles Pentium Up: Les microprocesseurs xxx86 Previous: Le jeu d'instructions


flloansi@IRISA.irisa.fr
Fri Jun 7 11:05:24 MET DST 1996