Nous avons séparé l'étude des processeurs Alpha en trois parties afin de faire ressortir la démarche menée par DEC. Dans une première partie, nous étudions les processeurs DEC 21064 et DEC 21064A qui nous permettent d'introduire les concepts de base de l'implémentation de cette architecture. Puis nous étendons cette étude au domaine des processeurs enfouis, avant d'aborder dans une dernière partie l'étude du tout dernier processeur DEC Alpha, le DEC 21164.
Annoncé en 1992, le DEC 21064 est la première mise en oeuvre matérielle de l'architecture RISC Alpha. Outre sa mise en oeuvre superpipeline, il utilise également la technique du superscalaire (jusqu'à deux instructions par cycle). Tout a été mis en oeuvre dans sa conception pour obtenir une fréquence d'horloge élevée : 200 MHz en 1992 !
Bénéficiant de l'avancée technologique, DEC a annoncé en 1993 le 21064A qui reprend à peu près la même implémentation. C'est pourquoi nous aborderons dans une même partie ces deux processeurs en précisant au moment voulu les quelques différences qui les distinguent.
Le DEC 21064 inclut trois unités fonctionnelles d'exécution entièrement pipelinées :
Par ailleurs, une unité centrale de contrôle, l'IBOX, est responsable du chargement des instructions et de leur lancement dans les différentes unités d'exécution ainsi que de la gestion des conflits de ressources.
Le premier niveau de cache est intégré sur la puce et est composé d'un cache d'instructions et d'un cache de données séparés. Un second cache externe est optionnel.
Il nous parait intéressant de développer les mécanismes d'émission d'instructions de cette architecture dans la mesure où le DEC 21064 est l'un des premiers processeurs (avec l'IBM POWER) à avoir été confronté aux problèmes inhérents à une architecture superscalaire. Pour plus de détails, le lecteur pourra se reporter à [2].
Le chargement des instructions à partir du cache, et leur lancement dans les diverses unités d'exécution est assuré par l'IBOX. Cette unité dispose en outre d'un tampon d'instructions à une seule entrée qui lui permet d'anticiper le chargement des instructions afin de réduire au maximum la pénalité en cas de défaut de cache.
L'IBOX décode deux instructions en parallèle. Si les ressources demandées sont disponibles, les deux instructions sont émises simultanément, sinon, seule la première est exécutée, le séquencement étant alors arrêté en attendant la résolution de l'interblocage. Le séquencement est toujours fait dans l'ordre. Les combinaisons d'instructions possibles sont :
L'IBOX contient également une unité logique de prédiction de branchement. La prédiction de branchement mise en oeuvre a été améliorée entre les deux versions de processeurs DEC 21064 et 21064A.
Le DEC 21064 met en oeuvre deux stratégies de prédiction dynamique : la première consiste à enregistrer le résultat des instructions de branchement dans un bit de la ligne du cache d'instructions. Ce bit indique si lors de la dernière exécution de l'instruction, le branchement a été pris ou non. Ce comportement est enregistré afin de pouvoir prévoir le comportement de l'instruction de branchement lors de la prochaine exécution. La deuxième stratégie de prédiction est basée sur le signe du déplacement du branchement :
Cette seconde stratégie est généralement utilisée lors de la première exécution d'une instruction de branchement, car le bit d'historique n'a pas encore pu être positionné (ou alors lorsque la table d'historique des branchements est invalidée).
Le DEC 21064A utilise quant à lui une technique de prédiction de branchement totalement différente, reprise également sur le DEC 21164. Cette stratégie fait appel à une table de prédiction de branchement basée sur une prédiction à deux bits selon l'algorithme de Smith. Cette table est accédée en parallèle avec le cache d'instructions au premier étage du pipeline d'instructions. Deux bits sont associés à chaque instruction. Cette nouvelle stratégie (identique à celle du Pentium) devrait améliorer la prédiction de 5 à 10%.
Par ailleurs, les deux processeurs implémentent une pile de quatre entrées destinée à conserver les adresses de retour de procédures. Cette pile est sollicitée lors du décodage du code opération de l'instruction et apporte une grande sûreté dans la prédiction de l'adresse de retour.
Comme on l'a dit précédemment, le DEC 21064 utilise la technique du superpipeline avec un pipeline de sept étages. Les quatre premiers servent au chargement des instructions, à leur décodage, à la prédiction de branchement ainsi qu'à la résolution des conflits sur un processeur superscalaire de degré deux. Ces quatre premiers étages sont dit statiques dans la mesure où les instructions peuvent attendre à ce niveau la résolution des conflits de ressources, par opposition aux étages d'exécution dits dynamiques, et dans lesquels la phase d'exécution des instructions ne peut être interrompue. Ces quatre premiers étages sont donc communs aux pipelines entier et flottant. Le pipeline flottant du DEC 21064 a une profondeur de dix étages.
La gestion précise des exceptions est délicate à réaliser sur un processeur superscalaire, c'est pourquoi, le choix d'une gestion imprécise a été retenue dans la définition de l'architecture Alpha. Ces exceptions sont gérées par les routines de la librairie PALcode.
Le 21064 supporte trois sources d'interruption :
Désignée sous le nom de EBOX, cette unité comprend les opérateurs classiques de calcul arithmétique (additionneur, décaleur, etc...). Les 32 registres généraux implantés pour l'unité entière sont de 64 bits (R31 étant cablé à zéro). Il est à noter que la mise en oeuvre superscalaire du DEC 21064 rend nécessaire l'extension des ports d'accès au banc de registres.
Le banc de registres flottants du DEC Alpha est entièrement indépendant du banc de registres entiers : cette mise en oeuvre permet un accès en parallèle aux registres entiers et flottants qui est indispensable dans le cas d'une architecture superscalaire autorisant le lancement simultané d'une opération flottante et d'une opération entière. Cependant, l'absence de chemins de données entre les registres flottants et entiers oblige un passage par la mémoire pour chaque transfert de données entre les deux bancs de registres. Le banc de registres flottants est composé de 32 registres de 64 bits et d'un registre de contrôle.
En plus des deux formats standards de la norme IEEE 754, il existe sur le DEC Alpha un sous-ensemble de formats flottant VAX qui permet d'assurer la compatibilité de résultats pour des applications précédemment développées sous ce format.
Toutes les opérations, mise à part la division, sont entièrement pipelinées et peuvent donc être lancées au taux d'une instruction par cycle.
La latence de la division flottante est de 31 cycles pour des opérations simple précision et de 61 cycles pour les opérations double précision. Toutefois, toutes les opérations indépendantes peuvent continuer de s'exécuter pendant que des instructions de longues latences s'effectuent. Toutes les autres opérations flottantes ont une latence d'au moins six cycles : en effet, étant donné la haute fréquence d'horloge utilisée, il devient difficile de mettre en oeuvre un mécanisme de chaînage.
Sur les deux processeurs, les unités sont identiques à l'exception de la prise en compte de certains flags, améliorée sur le 21064A.
Les processeurs DEC 21064 et 21064A mettent en oeuvre un premier niveau de caches d'instructions et de données séparés. Ces caches ont des caractéristiques communes : ils sont à correspondance directe, physiquement adressés. La taille relativement petite de 8 Ko des caches du DEC 21064 a été étendue à 16 Ko sur le 21064A.
Il est à noter que sur les deux processeurs, le cache d'instructions inclut un identificateur de processus de 6 bits.
Seul le DEC 21064A inclut une protection par parité de ses caches primaires d'instructions et de données.
Le cache de données est à écriture simultanée. Un tampon d'écriture de quatre lignes de 32 octets permet de regrouper les accès vers une même ligne mémoire. Pour être réellement efficace le DEC 21064 est conçu pour être utilisé avec un cache secondaire.
Le cache secondaire du DEC 21064 est un cache externe optionnel dont la taille varie de 128 Ko à 16 Mo. Il est à écriture différée. Le DEC 21064 fournit toute la logique de contrôle nécessaire à la mise en oeuvre de ce cache. On peut remarquer ici que les données n'ont pas à traverser le processeur pour être inscrites dans ce cache. La largeur du bus de données est de 128 bits. Ce bus est utilisé aussi bien entre le processeur et le cache secondaire, qu'entre le cache secondaire et la mémoire principale.
L'architecture Alpha gére la mémoire virtuelle par l'intermédiaire d'une librairie de fonctions appelée PALcode. Plusieurs bibliothèques de PALcode sont proposées pour mettre en oeuvre différents systèmes d'exploitation (VMS, OSF, Windows NT, ...).
Le mécanisme de traduction des adresses virtuelles en adresses physiques est identique à celui implémenté sur l'architecture MIPS. L'architecture Alpha met en oeuvre un espace d'adressage virtuel linéaire paginé.
L'architecture Alpha définit une taille des pages pouvant varier de 8 Ko à 4 Mo. Cependant, le DEC 21064 met en oeuvre des pages de taille constante égale à 8 Ko.
L'adresse virtuelle est étendue par un identificateur de processus nommé ASN sur le DEC 21064 (pour Address Space Identifier). Cet identificateur est codé sur six bits permettant ainsi à 64 processus d'être simultanément résidents en mémoire.
L'architecture Alpha définit une adresse virtuelle sur 64 bits. Cependant, les applications actuelles ne nécessitant pas un tel espace d'adressage, le DEC 21064 n'utilise que 43 bits, les bits de poids fort étant juste validés. L'adresse physique est quant à elle codée sur 34 bits.
Le DEC 21064 possède deux TLB distincts : un TLB d'instructions et un TLB de données. Le choix de TLB distincts provient de la nécessité de disposer de l'adresse physique à chaque accès aux caches (instructions et données). Le TLB d'instructions possède 12 entrées :
Le TLB de données possède 32 entrées et peut manipuler les adresses de pages dont la taille est de 8 Ko pour le processeur 21064 mais qui pourra être de 64 Ko, 512 Ko et 4 Mo dans les futures mises en oeuvre du DEC Alpha. Ces deux caches de traduction d'adresses sont entièrement associatifs et utilisent la stratégie de remplacement de cache de type NLU (Not Last Used). NLU
Ces deux TLBs sont gérés logiciellement grâce à des fonctions du PALcode. La taille des TLBs (en particulier instructions) est particulièrement faible pour un processeur haut de gamme. Ceci explique en grande partie les performances parfois décevantes du DEC 21064.
Sur le DEC Alpha, les appels au mode noyau sont implantés via une librairie, le PALcode (Privileged Architecture Library), servant d'intermédiaire entre le système d'exploitation et le matériel. Le PALcode a l'avantage d'avoir des fonctions pouvant être utilisées dans plusieurs mise en oeuvres. Ces fonctions remplacent celles microcodées que l'on peut trouver dans les processeurs CISC. Elles permettent d'assister le matériel dans un certain nombre d'opérations :
Le Palcode fonctionne dans un environnement particulier dans lequel les interruptions sont masquées afin de pouvoir exécuter des séquences de code de manière atomique. L'utilisation des instructions réservées au PALcode n'est autorisée que dans cet environnement. Dans le cas contraire, une exception d'instruction illégale est déclenchée.
Les fonctions PALcode sont appelées à travers l'instruction CALL_PAL, qui provoque une exception dans le matériel. Un mécanisme masque alors les interruptions, autorise le mode privilégié pour les routines du PALcode et sauve l'état courant de la machine. La transition inverse est ensuite réalisée pour retrouver l'environnement initial.
Le DEC 21064 supporte les quatre modes classiques de fonctionnement (noyau, superviseur, exécution, utilisateur).
Destinée à être l'architecture des 25 prochaines années, les concepteurs de l'architecture Alpha ont bien entendu privilégié l'intégration de leur processeurs dans des systèmes multiprocesseurs. De tels systèmes nécessitent la mise en oeuvre de protocoles de cohérences de caches et des instructions de mise à jour atomique permettant d'implémenter des primitives de synchronisation. L'architecture DEC Alpha définit également l'ordre des accès à la mémoire dans un système à mémoire partagée.
Il est à noter que Cray a fait le choix de cette architecture pour la mise en oeuvre de ses systèmes parallèles de type Cray T3D.
Les concepteurs de DEC ont introduit un mécanisme d'analyse de l'exécution des applications grâce à la mise en oeuvre d'un moniteur de performances. Ce moniteur, implémenté sur les processeurs DEC 21064 et 21064A sous la forme de deux compteurs permet de mesurer divers paramètres (émission d'instructions, gel des pipelines, instructions de branchement, lecture/écriture, nombre de cycles exécutés en PALmode, etc...) au cours de l'exécution en vue d'une analyse ultérieure.
Quasiment deux années séparent la commercialisation de ces processeurs. Les technologies employées pour chacun d'eux sont représentatives de l'évolution effectuée.
Le DEC 21064 est implémenté dans une technologie CMOS à 0.65 m à trois couches de métal. Il est disponible en version 150, 166 et 200 MHz.
Le DEC 21064A utilise quant à lui une technologie CMOS à 0.5 m à quatre couches de métal. Il est séquencé à 225 et 275 MHz.
Les microprocesseurs DEC 21066 et DEC 21068 ont été annoncés en 1993. Le DEC 21066 répond à la demande des utilisateurs sur le marché des ordinateurs personnels et des stations de travail d'entrée de gamme, alors que le DEC 21068 est plus particulièrement destiné au marché des systèmes embarqués. L'intérêt de ces processeurs est d'intégrer sur la puce un contrôleur mémoire, un contrôleur de cache ainsi qu'une interface PCIPCI réduisant ainsi le coût et la complexité de l'intégration de ces processeurs dans des systèmes. Selon le même principe que le 21064A, une deuxième version du DEC 21066 (le DEC 21066A) a été annoncée en novembre 1994.
Ces microprocesseurs reprennent pour l'essentiel l'architecture du DEC 21064 à travers le chargement des instructions, leur émission, la structure des pipelines, la résolution des conflits (prédiction de branchement, etc...), les tables de traduction d'adresses, l'espace d'adressage virtuel et physique (respectivement sur 43 et 34 bits) ainsi que l'organisation des caches (la taille et la structure du premier niveau de caches restent identiques, la capacité du cache secondaire externe peut varier de 128 Ko à 2 Mo).
En fait, les principales différences résultent de l'adaptation de ce processeur aux marchés des systèmes d'entrée de gamme (réduction du coût) et des processeurs enfouis (contrôleur d'entrées/sorties).
Afin de réduire le coût des processeurs destinés à une plus large diffusion, des efforts important ont été faits pour réduire leur nombre de broches. Cette réduction se ressent au niveau de la largeur des bus de données avec l'extérieur. Les processeurs DEC 21066 et 21068 mettent en oeuvre un bus de 64 bits vers le cache externe au lieu du bus de 128 bits du DEC 21064 (le remplissage d'une ligne de cache se fait donc en quatre cycles au lieu de deux).
Par ailleurs, le bus d'adresses a été totalement supprimé, celui-ci étant désormais multiplexé sur le bus des index du cache. De-même, les processeurs DEC 21066 et 21068 calculent une valeur ECC sur 64 bits alors que le 21064 maintenait un ECC pour chacune des sections 32 bits de son bus 128 bits. Les signaux de contrôle du cache et de la mémoire sont simplifiés. Les microprocesseurs 21066 et 21068 n'implémentent par ailleurs aucun support multiprocesseur.
Cette politique de réduction du nombre de broches a permis d'économiser jusqu'à 144 broches entre le DEC 21064 et les processeurs DEC 21066 et 21068, et ce malgré l'introduction d'un bus PCI. Cependant, cela n'est pas sans conséquences sur les performances, puisque selon [9] la réduction du bus vers la mémoire devrait dégrader les performances de 25%.
Le contrôleur mémoire contrôle la mémoire externe primaire du système (jusqu'à 512 Mo). Il a également la possibilité de lire et d'écrire le cache secondaire. Il supporte également de nombreuses opérations graphiques.
Son rôle est de gérer les communications entre le CPU, la mémoire et l'ensemble des périphériques externes. Tous les périphériques d'un système sont connectés au CPU et à la mémoire par l'intermédiaire de ce contrôleur. Un composant extérieur est cependant nécessaire pour l'arbitrage du bus PCI entre les divers composants.
Le contrôleur d'entrées/sorties dispose d'une logique de type scatter-gather qui effectue la traduction des adresses 32 bits générées par le maître du bus PCI, vers les adresses 64 bits du processeur. Afin de permettre une traduction rapide, le contrôleur implémente une table de traduction d'adresses de huit entrées.
Le contrôleur joue le rôle d'un maître du bus PCI quand le CPU exécute une instruction qui adresse un périphérique. De même, quand le contrôleur répond à une transaction émise par un périphérique externe ou un contrôleur DMA maître du bus PCI, il est alors esclave. Les microprocesseurs DEC 21066 et 21068 sont conçus pour assurer la cohérence de la mémoire dans tous les cas de transferts.
Les processeurs DEC 21066 et 21068 incluent un multiplicateur de fréquence permettant d'accepter une horloge plus basse, facilitant ainsi leur intégration sur des systèmes bon marché. La valeur du multiplicateur est programmable (par tout nombre entier compris entre 2 et 9. Une utilisation directe concerne l'horloge du bus PCI à 33,3 MHz qui peut être utilisée en positionnant le PLL pour une valeur multiplicative de cinq). Ceci permet d'éliminer par ailleurs une entrée de signaux d'horloge à haute fréquence (sur le DEC 21064, comme sur le 21164, il est nécessaire d'amener une fréquence d'horloge double de celle utilisée, soit respectivement 400 MHz et 600 MHz. Ceci a pour effet de rebuter certains constructeurs de systèmes).
Ces deux microprocesseurs sont réalisés en technologie CMOS à 0.65 m. Le DEC 21066 est séquencé à la fréquence de 166 MHz. Le DEC 21068 atteint quant à lui 66 MHz.
Le DEC 21164 a été annoncé le 7 septembre 1994, et la commercialisation de
systèmes bâtis autour de ce processeur a débuté en avril 1995. Ce processeur
est destiné aux systèmes scientifiques, aux serveurs haut de gamme et au
marché des stations de travail.
Deuxième implémentation de l'architecture Alpha, le DEC 21164 est
représentatif des processeurs annoncés fin 1994 à travers une mise en
oeuvre superscalaire de degré quatre et une haute fréquence d'horloge
(266 MHz et 300 MHz, une récente annonce faisant même état d'un
processeur à 333 MHz). Par ailleurs, les capacités d'intégration atteintes
lui permettent d'inclure sur le même composant un deuxième niveau de cache
de 96 Ko.
Ce processeur améliore l'ensemble des caractéristiques développées dans le
chapitre relatif au DEC 21064. Le jeu d'instructions n'a subi aucune
modification entre les deux générations de processeurs.
Du fait de la haute fréquence d'horloge, la technique du superpipeline a été
utilisée, le pipeline entier compte sept étages, le pipeline flottant neuf. Le
partitionnement en étages statiques et dynamiques est resté identique, si ce
n'est la prise en compte de quatre instructions à chaque cycle au lieu de
deux sur le DEC 21064. Le tampon d'instructions qui permet d'anticiper le
chargement a été élargi à quatre entrées. Pour pouvoir pleinement exécuter
ces quatre instructions, l'architecture du DEC 21164 inclut quatre unités
fonctionnelles (deux unités d'exécution entières et flottantes). L'émission
des instructions dans les diverses unités fonctionnelles est synchrone et se
fait toujours dans l'ordre. Le mécanisme de prédiction de branchement est
identique à celui mis en oeuvre sur le DEC 21064A. Cependant la
profondeur de la pile d'adresses de retour utilisée a été amenée à 12
entrées.
La plupart des latences d'opérations entières et flottantes ont été
améliorées. L'exécution des instructions de branchement conditionnel a été
retardée de un cycle dans le but d'optimiser le débit du pipeline. En effet,
cette astuce permet de séquencer au même cycle une opération et
l'instruction de branchement directement dépendante. Le résultat de la
prédiction de branchement est retardé d'un cycle mais l'importante table de
prédiction (2 K entrées) devrait compenser ce retard.
La hiérarchie mémoire mise en oeuvre sur ce processeur est
impressionnante avec les deux niveaux de caches internes, plus un troisième
niveau optionnel externe. Le DEC 21164 est le premier processeur à inclure
sur la même puce deux niveaux de hiérarchie mémoire !
Le premier niveau de mémoire est constitué d'un cache d'instructions et de données séparés. Ils ont les mêmes caractéristiques que ceux de son prédécesseur mis à part leur adressage virtuel et l'extension du champ d'identification de processus à sept bits (au lieu de six). L'une des différences majeures avec le DEC 21064 est la présence d'un deuxième niveau de cache interne, d'une capacité de 96 Ko, associatif par ensemble à trois voies, à écriture différée. Ce cache constitue une solution au problème de l'adressage d'un cache primaire à 300 MHz qui impose une petite capacité pour conserver un temps d'accès faible. L'associativité du deuxième niveau de cache compense les problèmes de conflits du niveau primaire.
Le DEC 21164 fournit également le contrôle nécessaire à la mise en oeuvre d'un troisième niveau de cache externe. Sa taille est configurable de 1 à 64 Mo. Ce cache est à correspondance directe, avec une politique d'écriture différée.
À la fréquence de 300 MHz, le DEC 21164 est confronté au problème de la latence d'accès à la mémoire. C'est pourquoi des mécanismes matériels sont mis en oeuvre entre les divers niveaux de cache.
Le tampon d'instructions qui permet d'anticiper le chargement des
instructions a été amené à quatre entrées. Par ailleurs des mécanismes mis
en oeuvre dans les tampons de lecture et d'écriture présents entre chacun
des niveaux de cache, permettent de regrouper des requêtes vers une même
ligne de données afin de les servir simultanément grâce au large bus mis en
oeuvre (128 bits). Un mécanisme de temporisation permet de conserver un
certain temps les requêtes avant de les adresser au sous-système mémoire,
ceci afin d'optimiser le mécanisme de regroupement.
Le support aux systèmes d'exploitation a été considérablement amélioré.
L'espace d'adressage linéaire physique a été étendu à 40 bits (soit un
rapport de 64 avec celui du DEC 21064). Les tables de traduction d'adresses
pour les instructions et les données ont été respectivement étendues à 48 et
64 entrées. Ces tables sont totalement associatives et implémentent un
algorithme de remplacement de type NLU. Le champ d'identification de
processus a été amené à sept bits. Les quatre modes d'exploitation sont restés
identiques.
Le support multiprocesseur a également été amélioré. Deux types de
protocoles sont disponibles en fonction du coût d'intégration désiré de ce
processeur dans le système (protocole de type MESI et par éviction de bloc
dans le cas de systèmes d'entrée de gamme).
Ce processeur inclut également comme son prédécesseur un support à l'analyse
de performances par le biais de trois compteurs configurables par logiciel
pour suivre certains évènements.
Le bus système vers la mémoire a une largeur de 128 bits. Des composants
externes d'interfaces sont nécessaires pour communiquer avec des systèmes de
type PCI ou ISA
ISA.
Les mécanismes de correction et de détection d'erreur restent inchangés
(ECC et parité).
Ce processeur est réalisé en technologie CMOS à 0.5 m. Il intègre 9.3
millions de transistors et il sera disponible en deux versions : 266 et
300 MHz. Les performances annoncées sont de l'ordre de 330 SPECint92 et
500 SPECfp92 pour la version à 300 MHZ.