Next: L'architecture PowerPC Up: Les architectures POWER Previous: Les architectures POWER

L'architecture POWER

IBM a introduit le premier système RISC 6000 (RS/6000) en février 1990. L'ensemble de ces produits était basé sur une implémentation multichip de l'architecture POWER, qui comme son nom l'indique regroupe les principales caractéristiques des processeurs RISC : instructions de taille constante, architecture load/store, ensemble de registres généraux entiers et flottants, etc...

L'architecture POWER est issue d'une orientation différente des constructeurs de processeurs de l'époque. L'objectif premier d'une architecture RISC est de privilégier la simplicité de manière à réduire au maximum le temps de cycle. Les concepteurs du POWER ont décidé de minimiser la durée totale d'exécution d'une tâche en incluant dans l'architecture des instructions plus évoluées. Le POWER1 a été le premier processeur à bénéficier de cette approche (voir [1]).

Deux ans plus tard, bénéficiant de l'avancée technologique dans le domaine de l'intégration qui permis de regrouper sur le même composant l'ensemble des unités fonctionnelles du POWER, un second processeur visant les systèmes bas de gamme fut introduit (processeur RSC pour RISC Single Chip).

Le POWER2 constitue la version la plus élaborée de cette architecture grâce à un séquencement superscalaire de degré six ainsi qu'un doublement de la largeur des bus et des unités fonctionnelles par rapport au POWER1. Il en marque également l'apogée car bien qu'un POWER3 ait été initialement prévu, le projet est maintenant abandonné pour évoluer vers l'architecture PowerPC. Aussi, l'avenir de cette architecture semble désormais figé, l'évolution du POWER2 devant essentiellement se limiter à l'augmentation de sa fréquence d'horloge (jusqu'à 133 MHz). Les systèmes IBM seront maintenant bâtis autour de l'architecture PowerPC.

Le jeu d'instructions POWER

Il nous semble particulièrement intéressant de détailler quelques caractéristiques de ce jeu d'instructions qui encore maintenant (bien que certains constructeurs aient adopté certaines de ces instructions) le différencie des autres processeurs RISC.

Le reproche classique adressé au RISC vis à vis du CISC est qu'il lui faut davantage d'instructions pour exécuter une même tâche, ce qui tend à accroître la longueur des programmes et leur occupation mémoire. Pour répondre à cette objection, IBM a imaginé des instructions composées assurant une extension du code mais ne constituant nullement un retour au CISC.

Par exemple, on constate que l'appel d'une procédure et le retour au programme appelant, avec la sauvegarde des registres et leur restauration, sont à l'origine d'une forte expansion de code. C'est pourquoi IBM a introduit des load et store multiple, permettant de déplacer le contenu de plusieurs registres simultanément vers ou à partir de la mémoire et ce, en une seule instruction.

Un autre exemple est la mise à jour automatique du registre d'adresse de base sur un load ou un store. Une instruction combinée permet de supprimer les instructions d'incrémentation de l'index lors du déplacement des chaînes.
Il s'ajoute à ces instructions combinées :

On notera l'absence d'instructions combinées branchement et exécution (conditional move) car une nouvelle technique a été mise en oeuvre grâce à l'implémentation d'un registre de condition amélioré :

Cet espace conditionnel est inclus dans l'unité de branchement avec les registres d'adresse de branchement. Il n'est donc pas nécessaire d'accéder aux registres généraux pour évaluer un branchement, ce qui permet de les mettre en oeuvre sans retard. Par ailleurs, un registre de comptage 32 bits, le CTR (Count Register), peut servir à compter des tours de boucle par décrémentation mais il permet également de fournir une adresse cible de branchement lorsqu'il est utilisé à travers l'instruction de branchement conditionnel avec CTR.
Le jeu d'instructions POWER compte cinq formats principaux : des instructions de type registre-registre, registre-immédiat, branchement, saut et appel de procédure et enfin le format arithmétique en virgule flottante. Il inclut les quatre formes courantes d'adressage (absolu, indirect, basé et indexé) plus une forme d'adressage avec pré-incrémentation (voir [1] et [4] pour plus de détails).

L'architecture POWER

Nous décrirons dans cette partie les processeurs POWER1 et POWER2, dans la mesure où leurs architectures sont sensiblement identiques et seuls le nombre d'instructions prises en compte, la largeur des chemins de données et le nombre des unités fonctionnelles diffèrent. Le processeur RSC constitue quant à lui une implémentation monocomposant du POWER1, nous ferons donc peu de remarques à ce sujet.

Généralités

D'un point de vue générale, les processeurs POWER sont multicomposants et se répartissent respectivement sur huit et neuf composants (une unité entière, une unité flottante, une unité de chargement et de séquencement des instructions, une unité d'interface avec la mémoire et quatre composants constituant le cache de données. Dans le cas du POWER1, il faut également ajouter un contrôleur d'entrées/sorties qui a été fusionné sur l'unité d'interface avec la mémoire dans le cas du POWER2).

Les pipelines

L'architecture POWER est une architecture résolument superscalaire. Le POWER1 pouvait traiter simultanément quatre instructions par cycle, le POWER2 quant à lui en traite six et en inspecte deux de plus en vue d'un éventuel branchement.

Le POWER2 a conservé les mêmes pipelines que ceux implémentés sur son prédécesseur : cinq étages pour les opérations entières, six lors d'opérations sur la mémoire et huit pour les opérations flottantes. Cependant le nombre d'unités d'exécution ajoutées à cette architecture lui permet de traiter un plus grand nombre d'instructions. Effectivement, alors que le POWER1 traite quatre instructions à chaque cycle, le POWER2 en séquence six. Ceci a bien entendu des conséquences sur la largeur des chemins de données (élargi à 256 bits dans le cas de ce dernier).

Le choix d'une gestion décentralisée des conflits a été fait, afin d'exploiter au maximum le parallélisme entre les instructions. Aussi, l'ICU (pour Instruction Cache Unit) joue essentiellement un rôle de chargement des instructions et d'émission vers les unités entières et flottantes. Cette unité est également responsable de la gestion des conflits de contrôle. Elle dispose pour cela de deux tampons, l'un destiné au chargement des instructions du flot séquentiel (8 entrées sur le POWER1, 16 sur le POWER2) et l'autre destiné à recevoir les instructions issues du chemin prédit (4 entrées sur le POWER1 et 8 sur le POWER2). Cette technique permet à l'ICU de disposer des deux chemins de données lors d'un branchement. Les instructions issues du flot séquentiel sont envoyées aux unités de manière conditionnelle. Si une mauvaise prédiction est détectée, ces instructions sont annulées et les instructions issues du tampon cible sont immédiatement émises.

L'une des améliorations apportée sur le POWER2 concerne la prise en compte des instructions sur le bus. Les unités entière et flottante ne prennent sur l'Ibus que les instructions qui les concernent (sur le POWER1, elles étaient lues puis abandonnées). Pour absorber le flot d'instructions de cette architecture, la taille des tampons implantés sur les unités d'exécution a été systématiquement doublée comme on va le voir au chapitre suivant.

Les unités arithmétiques

Unité arithmétique entière.

Sur l'architecture POWER, cette unité a un triple rôle : elle est responsable de l'ensemble des calculs arithmétiques entiers, effectue les calculs d'adresse, et assure la synchronisation avec l'unité flottante lors d'opérations d'accès à la mémoire ou encore lors de l'exécution d'instructions susceptibles de déclencher une exception.

La gestion des conflits de contrôle est effectuée au niveau de cette unité. Elle dispose de 32 registres de 32 bits pour effectuer l'ensemble des opérations. Le fichier de registres dispose d'un nombre supérieur de ports de lecture/écriture du fait du jeu d'instructions (adressage avec mise à jour). Ceci est particulièrement net sur le POWER2, qui du fait de son architecture superscalaire nécessite sept ports en lecture et quatre ports en écriture.

L'unité arithmétique de l'architecture POWER a été considérablement améliorée entre ces deux processeurs. Alors que le POWER1 réceptionne les instructions dans un tampon de quatre entrées et exécute une instruction à chaque cycle, le POWER2 dispose d'un tampon de huit entrées et de deux pipelines d'exécution (deux unités d'exécution entières non symétriques sont incluses). Au sein de cette unité, les instructions sont exécutées dans l'ordre, un additionneur à trois entrées permet toutefois d'améliorer les performances en exécutant en parallèle deux instructions dépendantes.

Une unité de multiplication/division permet de réaliser une multiplication en deux cycles (contre 3 à 5 cycles sur le POWER1) et une division en 13-14 cycles (19-23 sur le POWER1).

Par ailleurs, il faut mentionner les unités présentes sur l'ICU responsables de l'exécution des opérations sur le registre de condition et une unité de branchement.

Unité arithmétique flottante.

L'architecture POWER a intégré un opérateur de multiplication-addition. Cet opérateur est pipeliné et permet de lancer une opération à chaque cycle avec une latence de deux cycles.

Par ailleurs, cette unité intègre un mécanisme de renommage de registres particulièrement utile pour résoudre les dépendances de données de type écriture après lecture et écriture après écriture (WAR et WAW). Sur les deux processeurs, les instructions émises par l'ICU sont réceptionnées dans un tampon (huit entrées sur le POWER2, quatre sur le POWER1), au rythme de quatre instructions par cycle sur le POWER2 (deux sur le POWER1). Ces instructions sont par la suite décodées et renommées avant d'être envoyées dans des files d'exécution (tampon de décodage de quatre entrées sur le POWER1, file d'instructions arithmétiques de huit entrées sur le POWER2).

Comme l'unité entière, l'unité arithmétique flottante du POWER2 a été considérablement augmentée par rapport à celle du POWER1. Au lieu des 38 registres physiques du POWER1, le POWER2 dispose de 54 registres par rapport aux 32 vus par le programmeur. Il dispose de deux pipelines d'exécution pour chacune des instructions de type lecture/écriture et calcul flottant. Les unités travaillent indépendamment l'une de l'autre, des mécanismes matériels permettant de contrôler les interblocages (les deux pipelines d'exécution pour les instructions de type lecture et écriture sont précédés d'une file commune de six entrées au niveau de laquelle la cohérence des accès est vérifiée).

Hiérarchie mémoire

L'organisation mémoire mise en oeuvre sur le POWER1 est restée sensiblement identique sur le POWER2 aux capacités des caches près. Le cache d'instructions du POWER2 a une taille de 32 Ko et il est directement implémenté sur l'ICU (sur le POWER1, ce cache est externe et a une taille de 8 Ko). Il est associatif par ensemble à deux voies.

Le cache de données a quant à lui une taille de 256 Ko, il est associatif par ensemble à quatre voies et met en oeuvre une politique d'écriture différée. L'algorithme de remplacement des lignes utilisé est de type LRU. L'adressage et le test de ce cache sont physique.

Il est à noter que bien que les instructions transitent par le cache de données, elles ne font que traverser cette unité. Ceci permet de bénéficier des mécanismes de détection et de correction d'erreur dispensés par cette unité tout en minimisant le nombre de broches vers l'extérieur.

Support des systèmes d'exploitation

L'architecture POWER définit un espace d'adressage mémoire virtuel de type segmenté paginé. L'adresse virtuelle est composée des 28 bits de poids faible de l'adresse calculée plus un numéro de segment. Cette variante par rapport aux autres architectures permet de s'affranchir de la contrainte d'avoir de grands espaces d'adressage contigus, facilitant ainsi le remplacement des blocs de la mémoire principale, tout en alliant les avantages de la segmentation : protection séparée des instructions et des données, partage facilité, manipulation plus simple des structures de données dont la taille varie dynamiquement.

La taille des pages définie par l'architecture POWER est constante et égale à 4 Ko.

Espace virtuel.

L'espace virtuel défini par l'architecture POWER n'est pas réellement segmenté au sens habituel du terme. L'approche mise en oeuvre est une extension de l'espace virtuel paginé qui reste linéaire. Chaque processus ne voit qu'une mémoire virtuelle de 4 Go, découpée en 16 segments de 256 Mo chacun. Cependant la véritable adresse virtuelle est obtenue par indirection. Les quatre bits de poids fort de l'adresse effective sur 32 bits sont utilisés comme numéro de registre de segment. Ce registre de segment contient 24 bits. L'adresse est alors étendue à (32 - 4) + 24 = 52 bits, ce qui donne un espace virtuel de 4 Peta-octets. Le contenu des registres de segments est géré par le système d'exploitation, ainsi un processus ne peut accéder qu'aux 16 segments qui lui sont alloués sur les segments disponibles. Cette notion d'espace virtuel étendu, empruntée à Multics, permet notamment d'intégrer le système de gestion des fichiers dans l'espace virtuel. L'adressage physique du POWER2 est de 32 bits.

L'approche d'IBM présente un compromis intéressant pour le partage de données ou de code. Tout en conservant l'espace virtuel linéaire paginé, deux processus partagent du code ou des données en partageant un même segment. Ce code ou ces données ne sont pas forcément à la même adresse virtuelle vue du processus puisque les quatre bits de poids fort de l'adresse de 32 bits peuvent être différents. On peut toutefois reprocher à l'architecture POWER le petit nombre de segments (16) dont un processus dispose.

Mécanisme de traduction d'adresses.

Dans le cas du POWER2, une adresse effective (adresse issue du programme) est d'abord traduite en une adresse virtuelle puis en une adresse physique.

Les 32 bits d'adresses effectives sont convertis en une adresse virtuelle de 52 bits comme suit :

  1. Utilisation des 4 bits de poids forts de l'adresse effective pour sélectionner l'un des 16 registres de segments.
  2. Concaténation des 24 bits d'identification du segment fournis par le registre de segment accédé, avec les 28 bits restants de l'adresse effective.

On obtient alors une adresse virtuelle sur 52 bits. Celle-ci est alors convertie en une adresse physique de 32 bits en utilisant une table de pages indexée par l'intermédiaire de deux fonctions de hachage (ce mécanisme est décrit dans [3]).

Caches de traduction d'adresses.

Sur les deux processeurs, deux caches de traduction d'adresses instructions et données ont été implémentés ; seule différence entre les deux processeurs, la capacité de ces caches. Sur le POWER2, les TLB instructions et données ont une taille respective de 128 et 512 entrées, soit le quadruple de la taille des caches du POWER1. Ils sont tous deux associatif par ensemble à deux voies. La mise à jour des TLB lors de défaut est gérée par un algorithme de type LRU.

Support multiprocesseur.

L'architecture POWER n'offre aucun support matériel à la mise en oeuvre d'une mémoire partagée (à la différence de l'architecture PowerPC). Les processeurs sont cependant utilisés dans les systèmes POWERparallel tels que le SP1 ou SP2 qui lui succède. Ces systèmes sont utilisés dans le domaine scientifique ainsi que dans des architectures de type client/serveur.

Le SP2 a été annoncé en avril 1994 et comporte de 2 à 128 processeurs en standard et jusqu'à 512 sur demande spéciale. Des processeurs POWER2 remplacent les POWER1 précédemment utilisés.

Les systèmes POWERparallel sont organisés selon le principe du parallélisme à mémoire distribuée avec échange de messages et réseau d'interconnexion.



Next: L'architecture PowerPC Up: Les architectures POWER Previous: Les architectures POWER


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