Annoncé en 1988 par la société MIPS Computer Systems, le MIPS R3000
fut le premier processeur à vocation industrielle. Il succède au MIPS R2000,
dérivé des travaux de l'Université de Stanford (1985). L'une des
principales caractéristiques de ce processeur est sa simplicité. En effet,
la force des processeurs MIPS réside dans la relation très étroite entre
l'architecture du processeur et le compilateur associé .
En 1991, Le MIPS R6000 fut commercialisé à la fréquence de
66 MHz. Développé par Bipolar Integrated Technology, ce
processeur, reprenait pour l'essentielle l'architecture du R3000 en
introduisant certaines particularités telles qu'un cache secondaire
externe, un identificateur de processus dans les caches primaires et
dans le cache secondaire, une prédiction de branchement, une table de
traduction d'adresses séparée de l'unité entière et implémentée sur le
cache secondaire, etc... Cependant, ce processeur réalisé en
technologie ECL, ne connut pas le succès escompté. Bien que
cette technologie soit potentiellement plus rapide que la technologie
CMOS, les avantages de cette dernière en matière d'intégration, de
consommation et de coût de revient l'imposèrent comme la plus utilisée sur
le marché. Le MIPS R6000 reste à ce jour le processeur le plus
connu de cette technologie.
Le MIPS R4000 est la troisième génération de processeurs MIPS
(1992). Il est le premier à mettre en oeuvre une architecture
64 bits qui reste cependant compatible avec les générations MIPS
précédentes (un mode 32 bits assure la compatibilité). Afin d'offrir
une cadence de séquencement très élevée (dès sa sortie, le R4000 est
annoncé à la fréquence de 100 MHz), la technique du superpipeline a
été utilisée.
Destiné au marché des stations de travail, ce processeur fut
initialement prévu en trois versions : R4000PC (avec cache primaire
seulement), R4000SC (avec cache secondaire) et R4000MC (version
destinée aux systèmes multiprocesseurs).
Le MIPS R8000 est fondu par Toshiba (1994). Il vise clairement le
marché des applications scientifiques et techniques (stations de travail
graphiques 3-D), les serveurs de base de données, ainsi que le domaine des
multiprocesseurs.
Ce processeur est le premier à mettre en oeuvre une architecture
superscalaire. Jusqu'à quatre instructions peuvent être séquencées en
parallèle à chaque cycle grâce à ses deux unités flottantes, ses deux unités
entières et ses deux unités de lecture/écriture. Par ailleurs ce processeur
met en oeuvre des mécanismes originaux afin d'accroître ses performances.
Commercialisé initialement à la fréquence de 75 MHz, MIPS a annoncé tout
dernièrement une version à 90 MHz.
Nous décrivons dans les chapitres suivants les principales caractéristiques
de ces processeurs en comparant leurs jeux d'instructions, leurs pipelines,
la structure des caches et les mécanismes de gestion de la mémoire.
La définition originale du jeu d'instructions MIPS a connu trois mises à jour, chacune étant un sur-ensemble du jeu d'instructions précédent. Nous présentons dans une première partie les concepts généraux de ce jeu d'instructions avant de détailler son évolution.
Toutes les instructions sont codées sur 32 bits. Trois formats d'instructions sont couramment utilisés : immédiat (I-type), saut (J-type) et registre (R-type) (voir [1], [2], [4] pour plus de détails).
MIPS définit cinq classes d'instructions qui sont :
Les instructions de calcul et de transfert sont spécifiques aux coprocesseurs.
Le jeu d'instructions MIPS a connu trois mises à jour. Le R2000 implémente l'architecture originale MIPS I. Le R6000 et le R3000 mettent en oeuvre les extensions apportées par le jeu d'instructions MIPS II, alors que le R4000 est le premier des processeurs MIPS à utiliser l'architecture MIPS III. La dernière mise à jour de ce jeu d'instructions, définie par l'architecture MIPS IV, est implémentée sur le MIPS R8000 et sera également utilisée pour le MIPS R10000. Le tableau reprend les principales évolutions d'un jeu d'instructions à l'autre. Pour plus de détails sur le jeu d'instructions MIPS IV, le lecteur consultera [5].
[2]Ces instructions sont exécutées avec un retard de une instruction, l'instruction suivant le saut étant toujours exécutée avant le branchement.
Les trois processeurs étudiés dans ce chapitre sont représentatifs des différentes approches des pipelines RISC actuellement disponibles sur le marché.
Le MIPS R3000 implémente un pipeline de cinq étages typique d'un processeur
RISC traditionnel (chargement de l'instruction, décodage, exécution ou
calcul de l'adresse, accès à la mémoire, mise à jour du banc de registres).
La gestion des interblocages au sein du pipeline est effectuée par logiciel.
Le MIPS R4000 est le premier des processeurs RISC à mettre en
oeuvre la technique du superpipeline. Les étages critiques ont été
divisés en deux, voire en trois, pour permettre à ce processeur
d'atteindre des fréquences élevées. Le pipeline a au total une
profondeur de huit étages.
Contrairement au processeur MIPS R3000 (où la gestion des
interblocages est effectuée par logiciel), ce processeur met en
oeuvre une gestion matérielle. L'acronyme Microprocessor
without Interlock Pipeline Stage n'est donc plus respecté. Ceci
s'explique par le besoin de compatibilité binaire entre des versions
successives : gérer les interblocages uniquement par voie logicielle
impose des contraintes sévères sur la structure des pipelines des
futures versions. Par ailleurs le volume du code d'une application
devient critique pour les performances : le cache est petit et le coût
d'un défaut devient relativement élevé devant la fréquence de
séquencement de ces processeurs de plus en plus rapides.
Le pipeline entier du MIPS R8000 diffère largement des structures de
pipeline jusqu'ici employées par MIPS. Premier processeur
superscalaire réalisé par MIPS, il peut traiter jusqu'à quatre
instructions en parallèle à chaque cycle et en émettre quatre vers les
unités d'exécution parmi deux instructions entières, deux opérations
mémoires, quatre instructions flottantes.
D'une profondeur de cinq étages, le pipeline du R8000 offre la particularité d'inverser l'étage d'exécution et de calcul d'adresses, ceci afin de supprimer la dépendance entre la lecture d'un opérande et son utilisation.
Par ailleurs, ce processeur met en oeuvre un découplage au niveau de l'exécution des instructions entières et flottantes. Alors que les opérations entières et les générations d'adresse sont exécutées immédiatement, les instructions flottantes sont rangées dans une file d'attente appelée Floating-Point Queue (FPQ). indexF !FPQ Cette file, de 15 entrées, évite l'encombrement du mécanisme d'émission par des instructions flottantes en attente d'opérandes et découple l'unité flottante de l'unité entière. Ceci permet de masquer la latence d'accès au cache. La gestion des dépendances internes à l'unité flottante est traitée au sein même de celle-ci.
Par ailleurs, la dernière remarque que nous ferons sur la structure du pipeline entier concerne la mise en oeuvre d'une prédiction de branchement. Cette prédiction est effectuée par le biais d'un cache d'adresse de branchement de 1024 entrées accédé au même moment que le cache d'instructions.
Sur les trois microprocesseurs étudiés, les pipelines flottants sont sensiblement identiques aux pipelines entiers, les étages de chargement des instructions étant communs. Cependant contrairement au cas de l'unité entière dont l'étage d'exécution ne prend qu'un cycle, le temps requis pour exécuter une opération flottante est important en raison de la complexité des calculs effectués.
Les pipelines flottants du R3000 et du R4000 ont respectivement une profondeur de six étages et de huit étages.
Le pipeline flottant du R8000 est totalement découplé du pipeline entier. Seuls les étages de chargement et de décodage sont communs. Comme on l'a dit précédemment, jusqu'à quatre instructions flottantes peuvent être émises par l'unité entière à chaque cycle vers la Floating Point Queue. Deux instructions au maximum, sont émises par cycle, dans l'ordre, à partir de la FPQ où elles ont attendues la disponibilité de leurs opérandes. Cette file fonctionne en synergie avec deux files de chargement de données (d'une capacité de 32 entrées) qui permettent d'accéder aux données requises par les instructions tout en masquant la latence du cache secondaire externe (pour plus de détails se reporter à [4]).
Sur le processeur R3000 l'ensemble des opérations est effectué sur 32 bits (arithmétique et calcul d'adresse). Pour cela, 32 registres généraux de 32 bits sont définis.
L'unité de multiplication-division utilise deux registres spéciaux pour stocker les parties haute et basse du résultat (le registre LO contient le quotient et le registre HI le reste). Deux instructions spécifiques permettent de transférer le contenu de ces registres spéciaux dans les registres généraux.
Le MIPS R4000 assure la compatibilité binaire avec le MIPS R3000 en conservant un mode 32 bits en plus de son mode naturel 64 bits. L'unité centrale fournit 32 registres généraux d'une largeur de 64 bits dont 32 ou 64 sont utilisés selon le mode de fonctionnement
L'unité entière du R8000 est sensiblement identique à celle du R4000 à l'exception d'un accroissement du nombre des unités d'exécution du fait de l'architecture superscalaire. Le banc de registres dispose toujours de 32 registres de 64 bits, mais les deux ports de lecture et le port d'écriture de l'architecture scalaire du MIPS R4000 ont été étendus à neuf ports en lecture et quatre ports en écriture afin de prendre en compte l'ensemble des conflits de contrôle d'accès au banc de registres.
L'architecture MIPS définit l'unité flottante comme le coprocesseur 1 (CP1), qu'elle soit intégrée ou non sur la même puce que l'unité entière. Cette unité est responsable de l'ensemble des opérations arithmétiques flottantes. Elle est conforme aux exigences définies par la norme ANSI/IEEE Standard 754-1985, IEEE Standard for Binary Floating-Point Arithmetic.
L'unité flottante sur le MIPS R3000 est externe et est appelée R3010. Cette unité dispose de 32 registres généraux de 32 bits (FGR). Par ailleurs, 16 registres de 64 bits sont également disponibles par concaténation de deux registres généraux adjacents (FPR). Ces registres sont utilisés lors d'opérations sur des valeurs en double précision. Ce sont des registres logiques, seuls des numéros pairs sont utilisés pour les adresser (numéros impairs invalides).
Le coeur R3000 a été repris pour de nombreux processeurs embarqués, l'unité flottante et l'unité entière sont alors intégrées sur le même composant.
Le MIPS R4000 intègre l'unité flottante sur le même composant que
l'unité entière. Elle dispose de 32 registres généraux de
64 bits. Pour assurer une totale compatibilité avec le R3000, un mode
de fonctionnement permet de n'utiliser que 16 de ces registres. Par
ailleurs, l'instruction de racine carrée a été mise en oeuvre par
matériel.
Sur le processeur R8000, MIPS renoue avec les coprocesseurs flottants
externes avec un composant R8010 conçu par Weitek. Ce composant
inclut deux unités d'exécution à trois opérandes, 32 registres flottants de
64 bits et deux tampons de données à 32 entrées destinés aux opérations de
lecture/écriture. Deux instructions peuvent être simultanément exécutées à
chaque cycle par cette unité. Les deux files de données permettent
d'anticiper l'exécution des opérations de lecture/écriture du fait de
l'aspect découplé de cette architecture.
Le MIPS R8000 vise des performances flottantes élevées. L'architecture MIPS IV inclut à cet effet quatre nouvelles instructions de multiplication-addition flottantes à trois opérandes ( D). Ces instructions interviennent dans un grand nombre d'algorithmes scientifiques lors des calculs de sommes de produits. Elles devraient favoriser l'exécution des codes numériques vectorisables. De-même que l'opération Fmadd du Power1, l'opérateur n'est pas conforme à la norme IEEE 754 car il n'effectue pas d'arrondi entre la multiplication et l'addition. Ceci permet de diminuer la latence de l'opération et en augmente la précision.
On peut remarquer la différence d'implémentation entre les processeurs R3000 et R8000 qui génèrent une interruption externe vers l'unité entière alors que le R4000 utilise une exception.
L'architecture MIPS définit des processeurs avec un premier niveau de caches d'instructions et de données séparés : le maintien de la cohérence cache d'instructions/mémoire doit être assuré par logiciel. Un second niveau de cache peut être éventuellement ajouté.
Le MIPS R3000 met en oeuvre un premier niveau de cache
d'instructions et de données externe au composant. Ces caches sont à
écritures simultanées et à correspondances directes, physiquement
adressés et testés. Leur capacité est variable de 4 à 64 Ko
chacun. Il est à noter que le R3000 permet au moment de l'initialisation du
système le choix de la politique d'écriture lors des défauts
sur le cache en allouée ou non-allouée.Ècriture
attribuée
Sur le MIPS R4000, les deux caches de premier niveau (instructions et
données) sont internes. Ils ont tous deux une taille de 8 Ko et sont à
correspondances directes. Le cache de données met en oeuvre une
politique d'écriture différée. Ces deux caches sont adressés
virtuellement mais sont vérifiés au moyen d'une étiquette physique.
Le MIPS R8000 met en oeuvre la structure de cache la plus particulière
avec un premier niveau composé de deux caches internes, l'un pour les
instructions, l'autre pour les données entières. Un second niveau de
cache, externe au composant, sert au stockage des données flottantes.
Le cache d'instructions a une capacité de 16 Ko et est à correspondance directe. Il est structuré en lignes de quatre instructions de manière à alimenter en un cycle l'unité de chargement et de décodage des instructions. Ce cache est adressé virtuellement. Ce choix permet d'utiliser directement l'adresse venant du programme et simplifie le mécanisme de prédiction de branchement mis en oeuvre sur ce processeur.
Comme on l'a dit précédemment, le cache de données n'est accédé qu'à travers les instructions de lecture/écriture entières. Ce cache a une capacité de 16 Ko et est accédé virtuellement mais vérifié au moyen d'une étiquette physique. Il met en oeuvre un mécanisme original lors des écritures. Profitant de sa structure direct-mapped, la donnée est systématiquement écrite dans le cache à l'unique place possible pendant le test de l'étiquette. Puis, si le test de l'étiquette révèle que le secteur est absent du cache, alors le (ou les) bit(s) de validité du mot écrit est (sont) mis à zéro. Ce type de fonctionnement n'est permis que parce que le cache de données est à correspondance directe et à recopie simultanée.
Le R8000 est le premier des processeurs (après le MIPS R6000) à introduire un identificateur de processus dans la ligne d'étiquettes du cache. Cet identificateur facilite la gestion des caches en évitant l'invalidation de plusieurs lignes de cache lors de changement de contexte. Codées sur huit bits (soit 256 processus actifs simultanément), deux valeurs distinctes d'identificateurs de processus sont utilisées pour les caches d'instructions et de données.
À noter : le R3000 a des caches indexés physiquement et à étiquettes physiques. Le R4000 a des caches indexés virtuellement et à étiquettes physiques, le cache de données du R8000 a les mêmes caractéristiques mais le cache d'instructions est virtuellement testé.
Les concepteurs du R3000 n'ont pas prévu l'ajout d'un deuxième niveau de cache sur ce processeur. C'est seulement à partir du MIPS R6000, que l'on a vu apparaître ce deuxième niveau de mémoire (cache secondaire externe d'instructions et de données).
MIPS propose une version d'entrée de gamme du R4000 ne disposant pas d'interface pour un cache secondaire (R4000PC). Pour les versions avec cache secondaire, le R4000 dispose d'une interface permettant de gérer directement ce cache (test des étiquettes, ...).
Le cache secondaire du R4000 peut être utilisé comme un cache unifié, comprenant à la fois les données et les instructions, ou comme un cache subdivisé en un cache d'instructions et un cache de données. Sa taille est comprise entre 128 Ko et 4 Mo. Ce cache est, quelle que soit sa configuration, à correspondance directe avec la mémoire principale, et utilise une politique d'écriture de type write back pour la mise à jour des données.
Il est relié au processeur à travers un bus de données de 128 bits qui assure une bande passante suffisante entre les deux niveaux de caches pour minimiser la pénalité en cas de défaut sur le cache primaire. La technique de protection utilisée est la technique ECC (Error Correction Code).
Lorsqu'un défaut de cache survient à la fois dans les caches primaire
et secondaire, le second cache est rechargé à partir de la mémoire
principale et le premier à partir du second. Il est à noter que comme
le microprocesseur assure la gestion des deux caches, les données
transitent toujours par le microprocesseur entre la mémoire et le
cache secondaire.
Le MIPS R8000 est destiné au marché des applications numériques
flottantes qui requiert en général un ensemble de travail (ou working set) volumineux. Aussi, la structure de son cache secondaire
privilégie une large bande passante (1.2 Go) et une grande capacité
(de 4 à 16 Mo) plutôt que le temps d'accès (accès pipeliné sur cinq
cycles). Il est associatif par ensemble de quatre voies et met en
oeuvre une politique d'écriture différée.
Ce cache joue le rôle d'un cache secondaire pour le premier niveau de cache d'instructions et de données entières, et constitue un cache primaire vis à vis de l'unité flottante. Aussi, son efficacité est particulièrement déterminante sur les performances du système. C'est pourquoi les concepteurs ont choisi de faire appel à une technologie récente de mémoires synchrones (c'est à dire utilisant une horloge) de 12 ns de temps de cycle, organisées en deux bancs entrelacés. À cause de son importante bande passante, ce cache est désigné par MIPS sous le nom de Streaming Cache.
Les microprocesseurs étudiés fournissent des mécanismes de gestion de la mémoire virtuelle et un support permettant de mettre en oeuvre un système d'exploitation. Le coprocesseur 0, désigne l'unité responsable de la gestion de la mémoire virtuelle.
L'architecture MIPS définit un espace d'adressage virtuel linéaire paginé. C'est à dire que l'adresse virtuelle est identique à l'adresse calculée par le programme. Elle est divisée en un numéro de page et un déplacement dans cette page (auxquels s'ajoute un identificateur de processus). L'unité de gestion de la mémoire manipulée par le coprocesseur 0 est la page.
Le MIPS R3000 manipule des pages de taille constante de 4 Ko. Sur le MIPS R6000, la taille des pages a été étendue à 16 Ko. Il a fallu attendre le R4000 pour avoir des pages de taille variable de 4 Ko à 16 Mo (4, 16, 64, 256 Ko, 1 Mo ou 4 Mo). Chaque processus peut ainsi avoir une taille de page spécifique ce qui permet d'adapter la gestion de la mémoire au type de l'application.
Ce schéma a été repris sur le MIPS R8000. Par ailleurs, l'introduction d'un identificateur de processus distinct pour les instructions et les données permet d'affiner la gestion de la mémoire en allouant des tailles de pages différentes entre les instructions et les données.
Le MIPS R3000 mettant en oeuvre une architecture de type 32 bits, son espace d'adressage physique est limité à 4 Go. L'espace d'adressage virtuel se répartit en 2 Go pour l'utilisateur et 2 Go pour le noyau.
L'espace physique du R4000 est de 64 Go (adresse physique sur 36 bits). Deux modes de fonctionnement sont utilisés sur ce processeur, un mode 32 bits et un mode 64 bits. Selon ce mode, l'adresse virtuelle est représentée sur 32 ou 64 bits. La taille maximale d'un processus utilisateur est de 2 Go dans le premier cas et de 1 To dans le second (on ne tient compte que de 40 bits de l'adresse virtuelle).
Sur le MIPS R8000, les espaces d'adressages physique et virtuel ont été considérablement augmentés. L'espace d'adressage virtuel a été étendu à 48 bits alors que l'espace d'adressage physique est de 40 bits, les calculs d'adresse s'effectuant toujours dans l'un et l'autre cas sur 64 bits.
Les mécanismes de traduction d'adresses virtuelles en adresses
physiques sont généralement très lourds (sélection de la table des
processus, adressage de la table des pages du processus à partir de
l'adresse virtuelle, accès au numéro de page physique). Aussi, pour
atteindre des performances correctes, un cache de traduction
d'adresses, généralement appelé le TLB (Translation Lookaside
Buffer), conserve la traduction des pages récemment accédées. Suivant
le même principe que les caches, le TLB est consulté à chaque fois que
le processeur produit une adresse virtuelle. Ainsi, si la donnée ne se
trouve pas dans le cache, l'adresse physique est immédiatement
disponible pour adresser le sous-système mémoire.
Le MIPS R3000 implémente un TLB totalement associatif de 64 entrées
commun aux instructions et aux données. L'adressage physique des
caches entraînant des accès systématiques à cette table explique le
nombre relativement élevé d'entrées. Chacune des entrées de cette
table est complétée par un identificateur de processus codé sur six bits
(soit jusqu'à 64 processus simultanément actifs en mémoire). L'algorithme de
remplacement utilisé est un algorithme aléatoire.
Le MIPS R4000 implémente un TLB à 48 entrées également commun aux
instructions et aux données. Chacune de ces entrées est composée
d'une adresse paire et impaire contiguës en mémoire. Cette configuration
permet ainsi de disposer de 96 entrées effectives. L'algorithme de
remplacement utilisé après un défaut sur le TLB est le même que celui du
R3000. Cependant, une possibilité de verrouillage de certaines entrées
permet de conserver dans les TLB la traduction d'adresses de sections de
codes ou de données fréquemment référencées.
Le R4000 possède également un TLB de deux entrées dédié spécifiquement
aux instructions et inclus dans le TLB décrit précédemment. Il permet
d'effectuer en parallèle la traduction d'une instruction et d'une
donnée. En cas de défaut du TLB instruction, celui-ci est rechargé
depuis le TLB commun. Bien qu'il ne possède que deux entrées, ce
dispositif supplémentaire par rapport au R3000 permet d'accélérer
l'exécution. En effet, il supprime le conflit de banc lors d'un accès
simultané aux caches d'instructions et de données et, en raison de la
localité spatiale des instructions, deux pages sont dans la plupart
des cas suffisantes [6]. Le regarnissage du TLB
d'instructions à partir du TLB général ne coûte que quelques
cycles. On peut remarquer par ailleurs que l'identificateur de
processus a été amené à huit bits (et ce, dès le MIPS R6000).
Le MIPS R8000 met en oeuvre un TLB de 384 entrées, associatif par
ensemble à trois voies. L'indexage d'un TLB associatif par ensemble,
où peuvent être rangés des descripteurs de page de différentes
tailles, est un problème délicat (choix de l'index). Il est ici résolu
simplement par l'utilisation pour chaque ASID d'une seule taille
de page ; cette taille fait partie du contexte du processus. On
rappelle par ailleurs que ce processeur met en oeuvre des
identificateurs de processus distincts pour les instructions et les
données.
L'algorithme de remplacement du TLB est basé sur un algorithme de remplacement aléatoire. On notera le changement par rapport au R4000 où le remplacement est géré par logiciel. De la même manière que sur le R4000, certaines entrées du premier banc du TLB peuvent être verrouillées afin d'éviter que certaines pages fréquemment accédées ne soient vidées.
Il est à remarquer que sur les processeurs R4000 et R8000, les lignes de cache d'instructions et de données sont indexées virtuellement mais sont vérifiées au moyen d'une étiquette physique contenant l'adresse physique correspondante ainsi que des informations sur l'état de la ligne. Ceci permet d'effectuer en parallèle l'accès au cache et la traduction d'adresse virtuelle en adresse physique. La comparaison des étiquettes s'effectuant au cycle suivant. Ceci permet de gagner un cycle en cas de succès et d'utilisation immédiate de la donnée.
Les processeurs disposent de plusieurs modes de fonctionnement. Ces modes
protègent en écriture ou en lecture certaines zones mémoires et permettent à
différentes tâches de s'exécuter sans interférences. Sur les processeurs
MIPS, la protection est réalisée à chaque accès à la mémoire au cours de la
traduction d'adresse et s'effectue au niveau de la page.
Le MIPS R3000 implémente les deux modes de fonctionnement communément
utilisés : le mode noyau et le mode utilisateur. La distinction
entre ces modes s'effectue par les bits de poids fort des adresses. Comme on
l'a dit, la mémoire virtuelle est partitionnée en deux zones de 2 Go, la
zone d'adresse basse étant destinée au mode utilisateur, la deuxième
partie étant réservée au mode noyau.
Le MIPS R4000 se caractérise par un mode de fonctionnement
supplémentaire : le mode superviseur. Deux bits d'adresse sont
alors utilisés pour déterminer le mode de fonctionnement (trois en
mode 32 bits). Ces trois modes sont :
Le MIPS R8000 ne supporte que deux modes d'exécution : le mode
noyau et le mode utilisateur. Le mode superviseur de son
prédécesseur, le R4000, n'a pas été implémenté.
Un processus lancé
par le système d'exploitation en mode utilisateur ne pourra
générer des adresses que dans la zone mémoire allouée à ce mode,
garantissant ainsi une protection du système.
Le mode est spécifié par les deux bits de poids fort de l'adresse virtuelle (bits [63 : 62]) nommés bits de régions.
Le degré de performance atteint par les microprocesseurs étudiés les rendent attrayant pour les systèmes multiprocesseurs. Les système multiprocesseurs envisagés sont des systèmes à mémoire partagée et à bus unique. Dans de tels systèmes, il est nécessaire de disposer de protocoles de cohérence de cache qui assurent l'exclusion mutuelle et la mise à jour des différents caches, afin que chaque processeur puisse lire des données cohérentes.
Le MIPS R4000 est réellement le premier des processeurs MIPS à inclure de telles fonctionnalités. Il permet les protocoles suivant :
Le protocole de cohérence utilisé est déterminé par plusieurs bits dans le TLB. Chaque page possède un attribut, choisi parmi cinq, qui le spécifie. Ainsi, et contrairement au R3000 qui ne disposait que du protocole d'invalidation en écriture, le R4000 peut simultanément utiliser l'invalidation en écriture, la diffusion en écriture ou l'absence de cohérence, le protocole étant choisi page par page.
Par ailleurs, le R4000 intègre des instructions spécifiques utilisées lors
des accès à la mémoire partagée. Ces instructions offrent à l'utilisateur la
possibilité de mettre en oeuvre des primitives de synchronisation telles
que : sémaphores, test-and-set, bit-level locks, séquenceurs et
compteurs d'évènements. Le MIPS R3000 était dépourvu de telles instructions.
Le protocole de cohérence de cache employé par le MIPS R8000 est le protocole
à invalidation en écriture. Ce protocole est actuellement le plus utilisé
dans des systèmes incluant des caches à écriture différée en mémoire.
Par ailleurs, l'un des éléments importants d'un système bâti autour du MIPS R8000, est le contrôleur de cache. Ce composant n'est pas proposé par MIPS, mais ses fonctionnalités sont spécifiées. Il est chargé de l'interface entre le MIPS R8000, la mémoire principale et le reste du système. L'intervention de ce contrôleur de cache est requise dans les cas suivants :
Sur les trois processeurs, la duplication des RAM d'étiquettes des caches ainsi que l'ajout d'un contrôleur réalisant les opérations spécifiques à un système multiprocesseur (espionnage de bus par exemple) sont nécessaires pour garantir des performances acceptables.
Les systèmes multiprocesseurs à base de R8000, commercialisés par SGI, accueillent jusqu'à 18 processeurs et peuvent atteindre des performances crêtes de 5.4 Gflops (système Power Challenge XL).