UltraSPARC IIi
L'UltraSPARC IIi, successeur de l'UltraSPARC, est un microprocesseur 64 bits de Sun Microsystems dont la distribution commença en 1997.

L'UltraSPARC IIi est basé sur les spécifications SPARC version 9, et équipe notamment les stations Sun allant de l'Ultra 5 à l'Ultra 60 ainsi que les premiers modÚles de Sunblade.
Principaux blocs fonctionnels
Les principaux composants formant l'UltraSPARC IIi sont :
- IEU : Integer Execution Unit, effectue les opérations arithmétique grùce à ses 2 ALUs ;
- FPU : Floating Point Unit, effectue les opérations arithmétiques sur des nombres à virgule ;
- GRU : GRaphic Unit, exécute les instructions graphiques (voir Jeu d'instructions) ;
- LSU : Load/Store Unit, accÚde à la mémoire ;
- PDU : Prefetch, Prediction and Dispatch Unit, contient la Prefetch queue et la logique pour le groupement des instructions ;
- I-Cache & D-Cache : caches de données et d'instructions ;
- I-MMU & D-MMU : Memory Management Unit, traduit les adresses virtuelles
Registres
L'UltraSPARC IIi implĂ©mente la technique de la fenĂȘtre de registres, c'est-Ă -dire qu'il met Ă disposition de l'utilisateur plusieurs jeux de registres interchangeables.
En plus des 8 registres globaux (%g0 Ă %g7), qui sont dupliquĂ©s selon le mode de fonctionnement du microprocesseur (4 modes sont disponibles), l'utilisateur a accĂšs Ă une fenĂȘtre coulissante de 24 registres :
- les registres d'entrée (%i0 à %i7), utilisés pour récupérer les arguments d'une fonction et lire la valeur de retour ;
- les registres locaux (%l0 Ă %l7), offrant un stockage pour les variables locales ;
- les registres de sortie (%o0 Ă %o7), permettant le passage d'argument Ă une fonction.
La fenĂȘtre de registres est dite coulissante car dans le prologue d'une fonction, on fait appel Ă une instruction qui transforme les registres de sortie en registres d'entrĂ©e, et qui libĂšre un nouveau jeu de 16 registres locaux et de sortie. Dans l'Ă©pilogue, on revient Ă l'ancienne fenĂȘtre, ce qui a pour effet de restaurer les registres locaux et d'entrĂ©e.
L'UltraSPARC IIi offre 8 fenĂȘtres de registres, au-delĂ , c'est au systĂšme d'exploitation d'assurer la sauvegarde des fenĂȘtres prĂ©cĂ©dentes contre l'Ă©crasement. En effet, la fenĂȘtre fonctionne de maniĂšre circulaire : une fois sur la derniĂšre fenĂȘtre, on reprend Ă la premiĂšre.
La FPU offre 32 registres pouvant contenir soit des flottants simple précision soit des flottants double précision (IEEE 754).
Pipeline
Le pipeline de l'UltraSPARC IIi est composé de 9 étages :
- fetch : lit un maximum de 4 instructions depuis le I-Cache ;
- decode : pré-décode et identifie les instructions ;
- group : choisit les instructions à exécuter (voir description ci-dessous) ;
- execute : exécute les instructions arithmétiques (à l'aide des 2 ALUs) ;
- cache : effectue la traduction d'adresse (voir Unité de gestion de la mémoire) ;
- N1 : résolution des caches-misses au niveau du D-Cache ;
- N2 : accÚs mémoire ;
- N3 : résolution des traps ;
- write-back : écriture des résultats finaux dans les registres.
L'UltraSPARC IIi est superscalaire de degré 4, c'est-à -dire qu'il peut exécuter selon certaines contraintes 4 instructions simultanément. Parmi ces contraintes :
- la présence de 2 ALUs permet l'exécution simultanée de deux instructions arithmétiques au maximum par groupe ;
- la FPU et la GRU permettent l'exécution d'un maximum de deux instructions simultanées, selon la nature des instructions dont il est question ;
- une instruction de branchement peut ĂȘtre exĂ©cutĂ©e, seulement si elle est la derniĂšre du groupe d'instructions ;
- une instruction d'accĂšs mĂ©moire peut ĂȘtre exĂ©cutĂ©e par groupe.
Dans le cas des instructions FPU ou des instructions graphiques, la fin du pipeline diffĂšre :
- register : accĂšde aux registres flottants ;
- X1 : début de l'exécution des instructions ;
- X2 : continue l'exécution ;
- X3 : fin de l'exécution ;
- write-back : idem que dans le pipeline classique.
Chaque instruction de branchement est suivi d'un delay slot, c'est-Ă -dire une instruction qui sera systĂ©matiquement exĂ©cutĂ©e mĂȘme si le branchement est pris. Il est possible d'annuler l'effet du delay slot, en utilisant des instructions particuliĂšres.
Caches
- Le cache d'instructions (I-Cache) est un cache set associative de degré 2, contenant des blocs de 32 octets. Il y a 16 kilooctets au total.
- Le cache de données (D-Cache) est un cache direct mapped avec 2 sous blocs de 16 octets par ligne de cache. La politique de write-hit est de type write-through. Le D-Cache mesure 16 kilooctets, à l'instar de l'I-Cache.
Jeu d'instructions
Le jeu d'instructions de l'UltraSPARC IIi est le Visual Instruction Set de Sun. Il offre :
- les instructions arithmétiques et logiques classiques ;
- les comparaisons et branchements ;
- les accÚs à la mémoire ;
- des instructions SIMD pour accélérer les traitements graphiques et sonores.
Exemple en assembleur
La fonction suivante calcule la somme des entiers 64 bits d'un tableau.
sum:
save %sp, -192, %sp /* sauve l'ancienne fenĂȘtre de registre */
/* Ă cet instant : */
/* %i0 = nombre de cases du tableau */
/* %i1 = adresse du tableau */
sllx %i0, 3, %l0 /* calcule la taille du tableau en mémoire */
/* il s'agit d'une multiplication par 8 */
/* (décalage de 3 bits vers la gauche) */
add %i1, %l0, %l0 /* calcule l'adresse de fin du tableau dans %l0 */
mov %i1, %l1 /* copie l'adresse du tableau dans %l1 */
clr %i0 /* on utilise le registre %i0 pour la somme */
/* car registre est le registre de retour */
/* maintenant, on va parcourir les adresses de %l1 (début du tableau) à */
/* %l0 (fin du tableau) et additionner les valeurs */
.loop: ldx [%l1], %l2 /* lit la valeur courante du tableau dans %l2 */
add %l1, 8, %l1 /* avance dans le tableau d'une case (8 octets) */
cmp %l1, %l0 /* compare l'adresse courante Ă l'adresse de fin*/
blt .loop /* si %l1 < %l0, saute au label loop */
add %i0, %l2, %i0 /* additionne la valeur Ă la somme */
ret /* restaure l'ancienne fenĂȘtre de registre */
restore /* instruction en delay-slot */
On observe que l'addition juste aprĂšs le branchement est exĂ©cutĂ©e mĂȘme quand le branchement est pris. Mettre une instruction utile dans le delay slot permet ici de gagner un cycle par itĂ©ration.
Unité de gestion de la mémoire
La MMU de l'UltraSPARC IIi est formée par la LSU (Load/Store Unit) et les Translation Lookaside Buffers (TLB) : I-TLB et D-TLB.
La gestion de la mémoire virtuelle fait appel à deux TLB de 64 entrées de type full associative. Chaque entrée dans un TLB est divisée en 2 :
- le tag : contient l'adresse virtuelle, le flag Global et le numéro de contexte ;
- les données : précisent l'adresse physique, la taille de la page et les permissions.
Lorsqu'une adresse doit ĂȘtre traduite, les tags du TLB correspondant (I-TLB pour la lecture d'instructions, D-TLB pour les accĂšs mĂ©moire faits par la LSU), est parcouru Ă la recherche d'une adresse correspondante. Si une telle entrĂ©e est trouvĂ©e, le numĂ©ro de contexte est alors comparĂ© au numĂ©ro de contexte courant, ou si la page est globale, alors cette comparaison n'est pas faite. Une fois l'entrĂ©e identifiĂ©e, la partie donnĂ©es est lue et l'adresse est traduite.
En cas de TLB-miss (c'est-à -dire si aucune entrée ne convient), le microprocesseur entame une recherche dans un cache placé en mémoire par l'utilisateur : le Translation Storage Buffer (TSB). Cette recherche est évidemment plus longue car il y a de nombreux accÚs mémoire. Cependant, l'utilisation du TSB est optionnelle.
Enfin, s'il n'existe aucune entrĂ©e ni dans le TLB ni dans le TSB, une exception est dĂ©clenchĂ©e. De la mĂȘme maniĂšre, s'il existe une entrĂ©e mais que les permissions sont insuffisantes, une exception est aussi dĂ©clenchĂ©e. C'est alors au systĂšme d'exploitation :
- soit de remplir le TLB avec l'entrée manquante ;
- soit de changer les permissions pour autoriser l'opérations ;
- ou encore d'avertir l'utilisateur d'une erreur irrécupérable (Segmentation fault sous UNIX) et d'interrompre le programme.
Bien entendu, il faut trĂšs soigneusement maintenir les TLB, afin d'optimiser les performances et d'Ă©viter les plantages.
Il est possible de contourner le mécanisme de traduction d'adresse, en utilisant 2 identifiants d'espace d'adressage spécifiques (Bypass ASIs). Cette opération est cependant réservée au superviseur.