Couche d’architecture du jeu
d’instructions
Instruction Set Architecture - ISA
M41
2023-2024
ENSA Marrakech
1
Rappel: organisation d’un ordinateur
Trois composantes principales d'un ordinateur: processeur, mémoire et
entrées/sorties (ou I/Os)
datapath +
control =
processor
(CPU)
2
Comment les ordinateurs fonctionnent?
Chaque couche fait abstraction de tout ce qui est en dessous.
À noter comment l’abstraction cache le détail des plus bas niveaux
3
Architecture de jeu d’instruction - ISA
ISA spécifie
• L'organisation de la mémoire
Espace d'adressage
Adressabilité
• L'ensemble des registres
• Le jeu d'instructions
Opcodes
Types de données
Longueur et format des instructions
4
ISA de MIPS
• Catégorie d’instructions
– Load/Store
– Computational
– Jump and Branch
– Floating Point (co-processeur)
R0 - R31
PC
HI
LO
3 Instruction Formats, 32 bits wide
R OP rs rt rd sa funct
I OP rs rt immediate
J OP jump target
5
Niveaux de représentation
temp = v[k];
High Level Language
Program v[k] = v[k+1];
v[k+1] = temp;
Compiler
lw $15, 0($2)
Assembly Language lw $16, 4($2)
Program sw $16, 0($2)
sw $15, 4($2)
Assembler
0000 1001 1100 0110 1010 1111 0101 1000
Machine Language
1010 1111 0101 1000 0000 1001 1100 0110
Program 1100 0110 1010 1111 0101 1000 0000 1001
0101 1000 0000 1001 1100 0110 1010 1111
Machine Interpretation
Control Signal
Specification
°
°
6
Cycles d’exécution
Instruction
Fetch
Obtenir l’instruction de la mémoire du programme
Instruction
Décoder l’instruction et déterminer les actions requises
Decode
Operand Localiser et obtenir les données des opérandes
Fetch
Execute Calculer le résultat ou l’état
Result
Stocker le résultat pour une utilisation ultérieure
Store
Next
Instruction
Déterminer l'instruction suivante
7
Les instructions arithmétiques MIPS
Instructions arithmétiques en MIPS
add $t0, $s1, $s2
sub $t0, $s1, $s2
Chaque instruction arithmétique performe une opération
Chacune spécifie 3 opérandes qui sont dans les registres ($t0, $s1, $s2)
destination source1 op source2
Format d’instruction (R) (ex. Sub)
0 17 18 8 0 0x22
8
Champs d’instructions MIPS
R op rs rt rd shamt funct
op 6-bits opcode spécifie l’opération
rs 5-bits adresse du registre du premier opérande source
rt 5-bits adresse du registre du deuxième opérande source
rd 5-bits adresse du registre de l’opérande destination
shamt 5-bits shift amount (pour les instructions de décalage)
funct 6-bits Code de la fonction (function) précisant l’opcode
9
Les opérandes des registres
Les instructions arithmétiques utilisent les opérandes registres
MIPS a un fichier registre de 32 × 32-bit
Utilisé pour les données fréquemment utilisés
Numérotés de 0 à 31
Un mot (word) est de 32 bit
Noms des registres en assembleur
$t0, $t1, …, $t9
$s0, $s1, …, $s7
Registres vs mémoires (quand c’est plus petit c’est plus rapide)
10
Fichier registre MIPS
32
Contient 32 registres à 32 bits Register File locations
32 bits
32 src1
2 ports pour lecture src1 addr
5 data
1 port pour écriture 5
src2 addr
dst addr 5
src2
32 32 data
write data
write control
L’accès aux registres est beaucoup plus rapide que l’accès à la
mémoire principale
11
Exemple d’utilisation des opérandes
Code C:
f = (g + h) - (i + j);
On considère que g,h,i,j sont déjà dans $s1,$S2, $S3 et
dans $s4 respectivement, et le résultat f va être
déposé dans $s0
Code compilé en MIPS:
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
12
Les registres en MIPS
13
Opérandes immédiats
Données constante spécifiées dans l’instruction
addi $s3, $s3, 4
La constante est dans l'instruction elle-même!
Le format immédiat limite les valeurs dans la plage +215–1 à -215
Pas d’instruction de soustraction immédiate
Juste ajouter une valeur négative
Addi $s2, $s1, -1
14
Constantes larges
Si on veut transférer une constante de 32 bit (qui dépasse
16 bits) dans un registre; on le fait en deux étapes: Soit la
constante large: 0xAAAABBBB
Utiliser l’instruction "load upper immediate"
lui $t0, 0xAAAA
Par après on charge les 16 bits moins significatifs en utilisant
ori $t0, $t0, 0xBBBB
15
Opérations de décalage
sll et srl décalent les bits d'un mot à gauche ou à droite
respectivement
sll $t2, $s0, 4 #$t2 = $s0 << 4 bits
srl $t2, $s0, 4 #$t2 = $s0 >> 4 bits
Format de l’instruction (ex. sll)
0 16 10 4 0x00
Ces opérations sont logiques car le décalage introduit des
0 dans les places vidées.
16
Opérations logiques
Il existe un certain nombre d'opérations logiques sur les bits
and $t0, $t1, $t2 #$t0 = $t1 & $t2
or $t0, $t1, $t2 #$t0 = $t1 | $t2
nor $t0, $t1, $t2 #$t0 = not($t1 | $t2)
Format de l’instruction (R)
andi $t0, $t1, 0xFF00 #$t0 = $t1 & ff00
ori $t0, $t1, 0xFF00 #$t0 = $t1 | ff00
Format de l’instruction (I)
17
Instructions d'accès à la mémoire MIPS
MIPS a deux instructions de transfert de données de base pour accéder à
la mémoire
lw $t0, 4($t1) #charger la donnée de la mémoire
sw $t0, 8($t1) #stocker la donnée en mémoire
18
Exemple de load et store
lw $t0, 4($t1)
sw $t0, 8($t1)
19
Instruction lw en langage machine
Load(I):
lw $t0, 24($s3)
35 19 8 2410
Memory
2410 + $s3 = 0xf f f f f f f f
. . . 0001 1000 0x120040ac
$t0
+ . . . 1001 0100
. . . 1010 1100 = $s3 0x12004094
0x120040ac
0x0000000c
0x00000008
0x00000004
0x00000000
data word address (hex)
20
Organisation de la mémoire en MIPS
La mémoire MIPS est adressable par byte, ce qui signifie que chaque adresse mémoire
fait référence à une quantité de 8 bits de données.
L'architecture MIPS peut avoir jusqu'à 32 lignes d'adresse. Il en résulte une RAM 232 x 8,
ce qui équivaut à 4 Gbytes de mémoire.
21
Big Endian vs Little Endian
Big Endian: le byte le plus à gauche correspond à l'adresse du mot (ex. IBM
AIX, SPARC, MIPS, etc.)
Little Endian: le byte le plus à droite est l'adresse du mot (ex: x86 et AMD64
/ x86-64 series)
little endian byte 0
3 2 1 0
msb lsb
0 1 2 3
big endian
byte 0
22
Exemple d’opération impliquant la mémoire
Code C:
g = h + A[8];
g dans $s1, h dans $s2, adresse de base de A dans $s3
Code MIPS compilé:
l’indice 8 correspond à un offset de 32 bytes (4 bytes par mot)
lw $t0, 32($s3) # load word
add $s1, $s2, $t0
23
Un autre exemple
Code c:
A[12] = h + A[8];
h dans $s2, adresse de base de A dans $s3
Code MIPS compilé:
lw $t0, 32($s3) # load word
add $t0, $s2, $t0
sw $t0, 48($s3) # store word
24
chargement et stockage des Bytes
MIPS fournit des instructions spéciales pour transférer des
Bytes
lb $t0, 1($s3) #charger le byte de la mémoire
sb $t0, 6($s3) #stocker le byte dans la mémoire
Format machine (I) (ex: sb)
0x28 19 8 16 bit offset
25
Les opérations des sauts
Saut à une instruction étiquetée (L1) si une condition est vrai
sinon, continuer séquentiellement
beq rs, rt, L1
si (rs == rt) saut à l’instruction L1;
bne rs, rt, L1
si (rs != rt) saut à l’instruction L1;
j Label1
saut inconditionnel à l'instruction Label1
26
Compilation de l’instruction If
Code C:
if (i==j) f = g+h;
else f = g-h;
f, g, h, i, j … dans $s0, $s1, $s2, $s3, $s4…
Code compilé (manuellement) en MIPS :
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: …
27
Spécification des destinations du saut conditionnel
Utilisation du registre PC pour calculer l’adresse du destination
du saut
28
Instruction jump
L’instruction j correspond à un saut inconditionnel:
j label #go to label
Format de l’instruction (J):
0x02 26-bit address
29
Exemple
Loop: sll $t1, $s3, 2 80000 0 0 19 9 2 0
add $t1, $t1, $s6 80004 0 9 22 9 0 32
lw $t0, 0($t1) 80008 35 9 8 0
bne $t0, $s5, Exit 80012 5 8 21
addi $s3, $s3, 1 80016 8 19 19 1
j Loop 80020 2
Exit: … 80024
30
Exemple
Loop: sll $t1, $s3, 2 80000 0 0 19 9 2 0
add $t1, $t1, $s6 80004 0 9 22 9 0 32
lw $t0, 0($t1) 80008 35 9 8 0
bne $t0, $s5, Exit 80012 5 8 21 2
addi $s3, $s3, 1 80016 8 19 19 1
j Loop 80020 2 20000
Exit: … 80024
31
.. Et si le saut est encore plus loin
Que se passe-t-il si la destination de la branche est plus
éloignée que ce qui peut être capturé en 16 bits?
L’assembleur vient à la rescousse – il insère un saut
inconditionnel vers la branche cible et inverse la condition
beq $s0, $s1, far
devient
bne $s0, $s1, L2
j far
L2:
32
Résumé du mode d’adressage
33
L’organisation du MIPS vue jusqu’à maintenant
Processor
Memory
Register File
1…1100
src1 addr src1
5 32 data
src2 addr 32
5 registers
dst addr ($zero - $ra) read/write
5 src2
write data data addr
32 32 230
32 words
32 bits
branch offset
32 Add
read data
32 PC 32 Add 32 32
32
4 write data 0…1100
Fetch 32
PC = PC+4 32 0…1000
4 5 6 7 0…0100
32 ALU 0 1 2 3
Exec Decode 0…0000
32
32 bits word address
32
(binary)
byte address
(big Endian)
34
Compilation des instructions d’une boucle
Code C:
while (save[i] == k) i +=
1;
i dans $s3, k dans $s5, adresse
de save dans $s6
Code compilé (manuellement) en
MIPS :
Loop: sll $t1, $s3, 2 add $t1, $zero, $s6
add $t1, $t1, $s6 lw $t0, 0($t1)
lw $t0, 0($t1) j test
bne $t0, $s5, Exit Loop: addi $t1, $t1, 4
addi $s3, $s3, 1 lw $t0, 0($t1)
j Loop Test: beq $t0, $s5, Loop
Exit: …
35
Autres instructions pour les sauts
En plus de beq, bne, il y a autres types de sauts
L’instruction slt (set less then) :
slt $t0, $s0, $s1 # if $s0 < $s1 then
# $t0 = 1 else
# $t0 = 0
Format de l’instruction (format R):
Il y a aussi
slti $t0, $s0, 25 # if $s0 < 25 then $t0=1 ...
sltu $t0, $s0, $s1 # if $s0 < $s1 then $t0=1 ...
sltiu $t0, $s0, 25 # if $s0 < 25 then $t0=1 ...
36
Pseudo-instructions pour les sauts
On peut utiliser slt, beq, bne, et la valeur $zero pour créer
d’autres conditions
less than blt $s1, $s2, Label
slt $at, $s1, $s2 #$at set to 1 if
bne $at, $zero, Label #$s1 < $s2
less than or equal to ble $s1, $s2, Label
greater than bgt $s1, $s2, Label
great than or equal to bge $s1, $s2, Label
blt, ble, bgt et bge sont des pseudo-instructions. Elles sont
reconnues par l’assembleur
C'est pourquoi le registre ($at) est réservé pour l'assembleur.
37
Instructions pour l’accès aux procédures
Instruction d’appel d’une procédure :
jal ProcedureAddress #jump and link
Sauvegarde PC+4 dans le registre $ra pour avoir un lien à la
prochaine instruction lors du retour de la procédure
Format machine (format J):
0x03 26 bit address
La procédure retourne avec l’instruction
jr $ra #return
Format machine (format R):
0 31 0x08
38
3 étapes dans l’exécution de la procédure
1. La routine principale (l’appelant) place les paramètres dans $a0 - $a3
pour que la procédure appelée accède à ces paramètres et va avoir le
contrôle après (jal dest)
2. La procédure appelée réserve les ressources nécessaires, exécute la
tâche demandée et puis retourne la valeur du résultat dans:$v0 - $v1
3. La procédure appelée retourne le contrôle à l’appelant (jr $ra)
Règles:
- La procédure appelée doit sauvegarder les registres $s0-$s7 si besoin
39
Exemple de Procédure
Code C: ProcEx:
int ProcEx (int g, int h, addi $sp, $sp, -4
int i,int j)
{ int f; sw $s0, 0($sp)
f = (g + h) - (i + j);
return f;
} add $t0, $a0, $a1
Arguments g, …, j dans add $t1, $a2, $a3
$a0, …, $a3
f dans $s0 sub $s0, $t0, $t1
Résultat dans $v0 add $v0, $s0, $zero
lw $s0, 0(sp)
addi $sp, $sp, 4
jr $ra
40
Métrique de la performance
41
Besoin de métrique de la performance
Perspective d'achat
• étant donné une collection de machines, qui a
La meilleure performance ?
Le moindre coût ?
Le meilleur rapport qualité/prix ?
Perspective de conception
• face aux options de conception, qui a
La meilleure amélioration de la performance ?
Le moindre coût ?
Le meilleur rapport qualité/prix ?
Les deux exigent
• Une métrique pour l'évaluation et pour la comparaison
L’objectif est de comprendre les facteurs de
l'architecture contribuant à la performance globale du
système et l'importance relative de ces facteurs
42
Quelques définitions
La performance relative: “ x est N fois plus rapide que y”
Si on s'intéresse avant tout à la latence,
Si on s'intéresse avant tout au débit
43
Métrique de la performance du processeur
Cycles d’horloge CPU /programme =
Temps d’exécution =
Ninstr : nombre d’instructions exécutées (Instruction Count )
CPI : cycles par instruction (cycles per instruction)
Tcycle (=1/f): le temps de cycle de l’horloge (clock cycle time)
44
CPI
Différents types d'instructions nécessitent différents nombres de
cycles
CPIi est le CPI pour le type d'instruction i
ICi est le nombre d'instructions de type i (Instruction Counti )
Calcul du CPI moyen global
CPIi est obtenu à partir de la fiche technique du processeur, et les
fréquences d'instructions obtenues par profilage de code
• Profilage de code : exécution d'un outil de mesure logiciel en arrière-
plan, qui compte les instructions par type, lors de l'exécution d'un
programme
45
Exemple 1: Comparaison de performance de deux machines
Supposons que nous ayons deux implémentations de la même
architecture de jeu d'instructions (ISA). Pour un programme,
La machine A a un temps de cycle d'horloge de 250 ps et un CPI de 2,0
La machine B a un temps de cycle d'horloge de 500 ps et un CPI de 1,2
Quelle machine est plus rapide pour ce programme, et de combien ?
Chaque ordinateur exécute le même nombre d'instructions.
On prend I commele nombre d’instructions.
Cycles d'horloge CPU pour la machine A = I * 2
Cycles d'horloge CPU pour la machine B = I * 1.2
Temps CPU pour A = cycles d’horloge CPU * temps de cycle d’horloge = 500 * I ps
Temps CPU pour B = cycles d’horloge CPU * temps de cycle d’horloge = 600 * I ps
L’ordinateur A est plus rapide
Performance CPU de A / Performance CPU de B = 1.2
46
Exemple 2: Calcul du CPI
Étant donné cette machine, le CPI est la somme de (CPIi × Frequencyi)
Le CPI moyen est de 0,5 + 0,4 + 0,4 + 0,2 = 1,5
Quelle fraction du temps est consacrée aux transferts de données ?
0.6/1.5 = 0,4
Quelle fraction du temps est consacrée pour les traitement arithmétique et
logique ?
0.5/1.5 = 0,33
Quelle fraction du temps est consacrée pour les sauts ?
0.4/1.5 = 0,27
Pour améliorer les performances, investir les ressources là où l’exécution
consomme plus de temps.
47
Considérations sur la performance CPU
Remarque: les paramètres de l’équation sont interdépendants et donc on
est confronté à chercher des compromis pour réduire le temps d’exécution
48
Benchmarks
• Un benchmark est un programme utilisé pour évaluer
la performance. Il existe des suites standards de
benchmark qui permettent de comparer les
performances de différentes machines informatiques.
Suite sandard de benchmark
Groupes utilisateurs
Experts académiques
TPC
EEMBC
Organisation pour benchmark SPEC
...
Fabriquants
49