Td corrigé Architecture MIPS - Free pdf

Architecture MIPS - Free

2.3.4 Les catégories d'instructions .... Il y a 57 instructions, de 3 types différents : ... Supposons que l'on désire copier 0x87654321 dans le registre R1 : addi R1 ...




part of the document













Architecture MIPS


TABLE DES MATIERES


 TOC \o "1-4" 1 Introduction  PAGEREF _Toc6572989 \h 3
2 Architecture externe  PAGEREF _Toc6572990 \h 3
2.1 Caractéristiques  PAGEREF _Toc6572991 \h 3
2.2 Conception du jeu d'instructions d'un processeur  PAGEREF _Toc6572992 \h 4
2.3 Les instructions  PAGEREF _Toc6572993 \h 5
2.3.1 Register Type  PAGEREF _Toc6572994 \h 5
2.3.2 Immediate Type  PAGEREF _Toc6572995 \h 5
2.3.3 Jump Type  PAGEREF _Toc6572996 \h 6
2.3.4 Les catégories d'instructions  PAGEREF _Toc6572997 \h 6
2.3.5 Les instructions d'accès mémoire  PAGEREF _Toc6572998 \h 7
2.4 Exercice  PAGEREF _Toc6572999 \h 8
2.5 Exercice  PAGEREF _Toc6573000 \h 9
3 Architecture interne  PAGEREF _Toc6573001 \h 10
3.1 Pipeline  PAGEREF _Toc6573002 \h 10
3.1.1 Introduction  PAGEREF _Toc6573003 \h 10
3.1.2 Vue simplifiée du pipeline  PAGEREF _Toc6573004 \h 11
3.1.3 La mémoire  PAGEREF _Toc6573005 \h 12
3.1.4 Règles du pipeline  PAGEREF _Toc6573006 \h 12
3.1.5 Vue détaillée du pipeline  PAGEREF _Toc6573007 \h 12
3.1.6 Exercices  PAGEREF _Toc6573008 \h 13
3.1.7 Problèmes lié au pipeline  PAGEREF _Toc6573009 \h 16
3.1.7.1 Premier problème  PAGEREF _Toc6573010 \h 16
3.1.7.2 Deuxième problème  PAGEREF _Toc6573011 \h 17
3.1.8 Exercice  PAGEREF _Toc6573012 \h 19
3.1.9 Exercice  PAGEREF _Toc6573013 \h 20
3.2 Optimisations du compilateur  PAGEREF _Toc6573014 \h 21
3.2.1 Optimisations simples  PAGEREF _Toc6573015 \h 21
3.2.2 Optimisation "Software Pipeline"  PAGEREF _Toc6573016 \h 23
3.2.3 Optimisation "déroulement de boucle"  PAGEREF _Toc6573017 \h 24
3.2.4 Exercice  PAGEREF _Toc6573018 \h 24
3.3 Super Pipelines  PAGEREF _Toc6573019 \h 26
3.3.1 Pipeline détaillé  PAGEREF _Toc6573020 \h 27
3.3.2 Les bypass  PAGEREF _Toc6573021 \h 28
3.3.3 Application  PAGEREF _Toc6573022 \h 29
3.4 Super scalaires à exécution ordonnée  PAGEREF _Toc6573023 \h 31
3.4.1 Règles à respecter  PAGEREF _Toc6573024 \h 32
3.4.2 Exercice  PAGEREF _Toc6573025 \h 32
4 Pi-Bus  PAGEREF _Toc6573026 \h 34
5 La mémoire  PAGEREF _Toc6573027 \h 35
5.1 Les caches  PAGEREF _Toc6573028 \h 36




Introduction


MIPS : Microprocessor without Interlocked Pipeline Stages

En 1975, IBM invente le RISC.
EN 1981, John Hennessy (Stanford) invente un processeur RISC sans inter blocage entre les pipelines, et en 1984 invente sa boite : MIPS Computer Systems.
En 1985 il sort le premier processeur MIPS : le R2000.
En 1988, il sort le R3000 Silicon Graphics.
1991 : R4000 64 bits.
1992 : Silicon Graphics (SGI) rachète MIPS, et changent le nom : MIPS Technologies.
1994 : R8000, processeur super scalaire.
1997 : 48 millions de MIPS vendus (plus que le motorola 68000).
1999 : création de 2 licences différentes :
32-bits MIPS (MIPS32)
64-bits MIPS (MIPS64)
Ces licences ont été achetées entre autres par Sony, Nec, Toshiba, Philips.


Architecture externe

Caractéristiques


L'architecture externe est l'interface entre le processeur et le programmeur. Ce cours sera plus orienté vers l'architecture interne.

Une architecture externe est composée de :
registres visibles
set d'instructions
adressage
système d'interruptions / exceptions

Caractéristiques du R3000 :
32 bits
little endian
32 registres
R0 toujours égal à 0 : Trash Register
R31 : Link Register
R2 : valeur de retour d'un sous programme
R29 : frame pointer
R30 : global variables area pointer
Registres spéciaux
Hi et Lo : registres utilisés pour la multiplication et la division
SR : Status Register – 2 modes :
USER
SYSTEM
CAUSE : contient la cause de l'interruption / exception
EPC : Exception PC (Program Counter) : adresse de l'instruction qui a causé l'exception
BAR : Bad Address Register

RISC : Reduced Instruction Set Computer
(Reject Inportant Stuff into Compiler ( branle tout dans le compilo)
( MyCure

CISC vs RISC :

exemple :
int chiche, a, b;
chiche = a + b;

CISC :
add [chiche], [a], [b]

RISC :
lw R3, [a]
lw R4, [b]
add R5, R3, R4
sw R5, [chiche]

2 caractéristiques principales d'un processeur :
Le jeu d'instruction
Le schéma d'exécution

Conception du jeu d'instructions d'un processeur

Un jeu d'instructions n'est pas construit par hasard. Il y a 2 règles à connaître :
Mix : Ensemble de statistiques sur la fréquence d'utilisation des instructions. Les Mix permettent aux ceoncepteurs de processeur de savoir quels instructions doivent être implémentée et lesquelles peuvent être évitées (et réalisée avec plusieurs instructions).
Amdhal Rule : Le gain réel dépend du coût de la mise en place de l'instruction dans le processeur : Gain réel = Gain x Fréquence d'utilisation


Il y a 2 caractéristiques qui font qu'un processeur est performant :
nombre de cycles par instruction (CPI ou CPIu (utiles))
Fréquence d'horloge F

Performance : P = F / CPI

But du processeur MIPS : CPI = 1

Question : Pourquoi l'instruction Sll Rd, Rs, I est une instruction de type registre ?
Réponse : Parce que grâce aux opcodes étendus, on peut avoir plus d'instruction de type registre par rapport aux instructions de type immédiat.

Raisons du choix d'une instruction :
les opcodes coûtent cher
beaucoup d'instructions sont inutiles car remplaçables par d'autres
MIX et la loi d'Amhdal définissent quelles sont les instructions à inclure dans le processeur.


Les instructions

Il y a 57 instructions, de 3 types différents :
R : Register to Register – Register Type
I : Accès mémoire, branchements – Immediate Type
J : Instructions de sauts (non-conditionnels) : Jump Type

Register Type

OpcodeRsRtRdShamFunc655556
Opcode : numéro de l'instruction
Sham : Shift Amount : spécifie le nombre de décalage
Rs : Source
Rt : Alternatif
Rd : Destination

Exemple : add R3, R4, R5
On aurait R3 dans Rd, R4 dans Rs, R5 dans Rt.
De même avec addu, srl, sll, etc.

Immediate Type


OpcodeRsRtImmed65516

Opcode : numéro de l'instruction
Rs : Source
Rt : Alternatif
Immed : valeur immédiate

Exemple : addi R4, R3, 8
On aurait R4 dans Rt, R3 dans Rs, et 8 dans immed.
De même avec addiu, andi, ori, etc.


Jump Type


OpcodeImmed626

Opcode : numéro de l'instruction
Immed : valeur immédiate

Exemple : J immed


Les catégories d'instructions


MIPS divise les instructions en 2 catégories :
les instructions arithmétiques
les instructions logiques

Les instructions arithmétiques gèrent l'overflow. MIPS est composé de 57 instructions (33 instructions arithmétiques et logiques, 12 instructions de branchement, 7 instructions et 5 instructions système).


ANDI : Andi Rt, Rs, I
Rs est sur 32 bits, et I sur 16. L'opération sur les 16 bits de poids fort de Rs se fait avec des 0.


ADDI : Addi Rt, Rs, I
Rs sur 32 bits, I sur 16. Les 16 bits manquants de I sont complétés par le bit de signe de I. L'overflow est géré.

Supposons que l'on désire copier 0x87654321 dans le registre R1 :
addi R1, R0, 0x8765 ~ Lui Rn, Immed (c'est une instruction réelle,
sll R1, R1, 16 pas une macro instruction)
Addi R1, R1, 0x4321

Autre exemple :
Addi R1, R0, 0x4567
Sll R1, R1, 16
Addi R1, R1, 0x89ab

Ici, R1 est sur 32 bits, mais 0x89ab est sur 16 bits, et son bit de signe va être recopié dans les 16 bits de poids fort. Le résultat que l'on va obtenir est :
R1 = 0x45670000 + FFFF89ab

Pour avoir 0x456789ab dans le registre R1, on fait donc :
Addi R1, R0, 0x4567
Sll R1, R1, 16
Ori R1, R1, 0x89ab


Les instructions d'accès mémoire

Les accès mémoire peuvent être fait en byte (8 bits), half-word (16 bits) ou word (32 bits).
Le processeur MIPS est en little endian : les bits de poids faible sont placé au début.

Lh Rt, Immed (R5)
Lb
Lw
Lbu, Lhu, Lwu pour Load Unsigned.

Pour mettre en mémoire : S (Sw, Sh, etc.)

Sauts

J main

OpcodeImmed626
Afin d'aligner les adresses, on ajoute à l'adresse immédiate 2 zéros à la fin.
On peut donc sauter plus loin, car on a réellement 28 bits au lieu de 26.

Jr Rs // Jump to register
Jal Immed // Jump and link ( Link Register
Jalr // Jump and Link register

Beq Rs, Rt, Label
Si Rs == Rt, @suivante = Label
Sinon, @suivante += 4 (une instruction = 4 octets)


Dans le cas d'un branchement réussi, on a :
@ = (@courante) + 4 + (@Label