Ensimag 2A

publicité
2A
Ensimag
Ensimag 2A
Examen d’Architecture avancée
Filière SLE/ISI, 3 heures, tout documents autorisés.
Notation sur 30 points : choisissez les exercices qui vous conviennent le mieux.
1
Caches (8pts)
On désire implanter le mécanisme de réduction de la pénalité du miss dans les caches à correspondance directe
(direct mapped) appellé Victim Cache, inventé par Norman Jouppi de DEC. Jouppi a prouvé expérimentalement
qu’un « cache des victimes » de 4 lignes réduisait la pénalité des miss de conflits de 20% à 95%.
Le principe est le suivant : lors d’un miss, au lieu d’évincer purement et simplement la ligne du cache, le cache
va la copier dans un tout petit cache totalement associatif. Lors des miss suivants, on va vérifier simultanément à
l’accès cache usuel si l’adresse est dans le répertoire du « cache des victimes ».
– si c’est le cas, on va échanger le contenu de la ligne du cache avec celui de la ligne du « cache des victimes » ;
– si ce n’est pas le cas, le cache va chercher la ligne en mémoire, comme il le fait classiquement.
On fait ce travail sur un cache à correspondance directe (direct mapping), à écriture systématique (write through),
structurés en 64 lignes de 8 mots de 32 bits. La mémoire utilisée pour implanter le cache est une mémoire simple
accès de largeur n bits, dans laquelle il n’est possible d’écrire (et de lire) que par paquets de n bits, les lectures
et les écritures ne pouvant avoir lieu au même cycle. Le signal AP[31 :0] est l’adresse émise par le processeur, le
signal DP[31 :0] est la donnée lue par le processeur, le signal D[31 :0] est la donnée telle que disponible sur le
bus.
On ne s’intéressera dans cet exercice qu’aux lectures.
Le cache initial est réalisé à l’aide d’une seule et unique mémoire, qui contiendra donc à la fois le bit d’invalidation,
le tag et les données, simple accès, c.-à-d. que l’on ne peut pas lire et écrire dedans au même cycle. L’interface est
(reçu signifie signal reçu par la mémoire, fourni signifie signal produit par la mémoire) : DIO[n − 1 :0], donnée
en entrée (reçue), lors d’une écriture et produite (fournie), lors d’une lecture ; ADDR[l −1 :0], adresse de l’action
(lecture ou écriture, reçue) ; OE, lecture de la memoire (reçue). La valeur 1 sur OE provoque l’apparition de la
donnée d’adresse ADDR sur le fil DIO[n − 1 :0] qui y reste tant que OE ne passe pas à zéro ; WE, écriture de la
memoire (reçue). La valeur 1 sur WE provoque l’écriture de DIO[n − 1 :0] dans la case d’adresse ADDR ; CS,
selection de la mémoire (reçue). Le répertoire et les données ne peuvent être lus ou écrits indépendamment l’un
de l’autre.
La figure 1 représente la structure du chemin de données du cache proposé avant l’insertion du « cache des
victimes ». On suppose par ailleurs qu’il y a une machine d’état qui contrôle le cache. Dans les questions qui
suivent, on sera amené à modifier des parties de ce schéma en ajoutant du matériel. On vous demande de
redessiner succinctement les parties concernées sur votre feuille d’examen et d’utiliser les noms d’entrées/sorties
spécifiés.
Question 1 Donnez la capacité du cache initial en kilobytes, du point de vue des données.
Question 2 Donnez la structure de l’adresse du point de vue du cache (nombre de bits de chacun des champs).
Question 3 Précisez la largeur n (en nombre de bits) des bus de données de la mémoire utilisée pour réaliser la
totalité du cache (répertoire + données)
On cherche à construire le schéma du chemin de données d’un cache totalement associatif de 4 lignes de 8 mots
de 32 bits, en utilisant une mémoire pour contenir les données, le répertoire étant réalisé en registres (comme le
cache totalement associatif vu en cours et en TD). On notera avec les noms suivants les signaux de cette RAM :
VDIN[p − 1 :0], donnée en entrée (reçue), lors d’une écriture ; VDOUT[p − 1 :0], donnée en sortie (fournie),
lors d’une lecture ; VADDR, adresse de l’action (lecture ou écriture, reçue) ; VOE, lecture des données du cache
(reçue) ; VWE, écriture des données dans la mémoire (reçue) ; VCS, sélection de la mémoire (reçue). Chaque
registre i utilisé pour stocker une ligne dans le répertoire possède une autorisation d’écriture (WERi ) qui lui est
Examen d’architecture - 2S
page - 1
2A
Ensimag
IADDR[31:0]
tag
index
D[31:0]
offset
IINS[31:0]
ADDR[m-1:0]
DIN[n-1:p+1]
SDx
SD0
WEDx
WED0
DIN[p]
OE WE CE
DOUT[p]
DOUT[n-1:p+1]
DIO[p-1:0]
HIT
==
F IG . 1 – Structure du chemin de données du cache
propre. Les 2 questions suivantes doivent être faites sur le même schéma. Elles ne sont séparées que pour mettre
en évidence les 2 parties à réaliser.
Question 4 Donnez la taille du registre contenant le tag du « cache des victimes ». Donnez le schéma de la partie
lecture du cache, en précisant le calcul du signal VHIT qui indique que l’adresse émise par le processeur se trouve dans
ce cache.
Question 5 Ajoutez sur votre schéma la partie écriture du cache. On utilisera une politique de remplacement aléatoire, l’adresse de la ligne à remplacer étant issue d’un compteur modulo 4 tournant en permanence.
On cherche à présent à implanter la partie chemin de données du mécanisme d’échange de lignes, qui va échanger
une ligne du cache « normal » avec une ligne du cache des victimes prise au hasard (on ignore les problèmes
d’initialisation ici, en supposant que les lignes sont déjà toutes utilisées).
Question 6 Précisez et justifiez en 2 lignes le principe de l’échange que vous aller mettre en œuvre.
Donnez un schéma bloc (il n’est pas utile de préciser de nouveau tout ce que vous avez détaillé avant) intégrant les
nouvelles ressources ajoutées pour effectuer cet échange. On pourra se permettre de modifier le « cache normal » si
cela s’avère nécessaire.
Proposez une ébauche d’automate d’état qui pilote les chemins de données pour l’échange.
2
Processeur RISC (9pts)
On désire ajouter au MIPS R3000 les instructions de format R load multiple words, lmw $rt, $rs, $rd, et store
multiple words, smw $rt, $rs, $rd. Ces instructions sont interprétées comme suit : Lmw lit $rd modulo 32 mots
successifs de la mémoire à partir de l’adresse contenue dans le registre $rs dans le registre $rt et ses $rd modulo
32 successeurs eux même modulo 32. Cela signifie que l’on chargera au plus 32 registres, et que si l’on doit
charger une valeur après avoir chargé $31, on devra la charger dans $0. Le registre $rd reste inchangé à la fin de
l’instruction, sauf s’il a été lui même chargé.
Smw écrit $rd modulo 32 registres successifs à partir du registre $rt et de ses $rd modulo 32 successeurs eux
mêmes modulo 32 en mémoire en tant que mots à partir de l’adresse contenue dans le registre $rs. Cela signifie
que l’on écrira au plus 32 registres, et que si l’on doit écrire un registre après $31, ce sera le registre $0.
En sortie de ces instructions, le contenu du registre $rs est inchangé, sauf s’il a été lui même chargé par l’instruction.
Examen d’architecture - 2S
page - 2
2A
Ensimag
On rappelle le pipeline à 5 étages du MIPS vue en cours figure 2. Le but de l’exercice est de préciser les modifications à apporter pour implanter ces deux nouvelles instructions.
Hazard
detection
unit
ID/EX.MemRead
IF/IDWrite
ID/EX
11
Control
0
ALU
ID/EX.$rs
ID/EX.$rt
ID/EX.$rt
ID/EX.$rd
WB
MEM/WB
M
WB
M
u
x
Registers
Mux
Instruction
memory
Instruction
PC
EX
Mux
PCWrite
IF/ID
EX/MEM
M
u
x
Data
memory
M
u
x
M
u
x
EX/MEM.$rd
Forwarding
unit
ID/EX.$rt
M
u
x
MEM/WB.$rd
F IG . 2 – Le pipeline à 5 étages du MIPS avec sa forwarding unit pour utiliser les valeurs contenues dans les
registres du pipeline et sa hazard detection unit pour insérer les bulles.
Question 7 On suppose que le registre $1 contient la valeur 3 et le registre $2 la valeur 0x10000000. On a les valeurs
suivantes dans les registres et la mémoire :
registre
$3
$4
$5
$6
$7
$8
valeur
12
15
17
23
26
44
adresse
0x10000000
0x10000004
0x10000008
0x1000000C
0x10000010
0x10000014
valeur
123
456
789
101
121
314
Donnez le résultat de l’exécution de l’instruction lmw $3, $2, $1 à partir de l’état défini dans la table.
$3 ← 123
$4 ← 456
$5 ← 789
Question 8 Donnez, sous la forme de pseudo-code, l’« algorithme » à exécuter pour effectuer les instructions
lmw $rt, $rs, $rd et smw $rt, $rs, $rd.
On notera $rx le numéro de registre sur 5 bits et rx la valeur du registre sur 32 bits, et RF[$rx] l’accès au registre
$rx dans le banc de registre et MEM[addr] l’accès à la case mémoire d’adresse addr.
Attention, la valeur des registres rs et rd ne changeant pas, il faut faire une copie des valeurs dans des variables
avant de les utiliser si l’on souhaite les modifier. De même, les numéros de registres restent les mêmes à la fin de
Examen d’architecture - 2S
page - 3
2A
Ensimag
l’exécution.
Le load :
nbregs = rd%32
while (--nbregs >= 0) {
RF[($rt+nbregs)%32] = MEM[rs+nbregs*4];
}
Le store :
nbregs = rd%32
while (--nbregs >= 0) {
MEM[rs+nbregs*4] = RF[($rt+nbregs)%32];
}
Question 9 Nous allons maintenant étudier l’impact de l’ajout de ces instructions sur les ressources (composants) du
chemin de données, sans pour l’instant regarder le pipeline.
– Quelle modification faut-il apporter au banc de registre (étage ID - Décode) ? Justifiez votre réponse.
– Faut-il ajouter un ou plusieurs opérateurs dans l’étage EXE ? Si oui lesquels, et pour des opérandes de quelle taille ?
Justifiez votre réponse en analysant les adresses et les index de registres qui doivent être générés durant l’exécution
de l’opération.
RF : 1 port de plus en lecture (32 bits) à cause du store
ALU : on va utiliser l’alu usuelle pour le calcul de l’adresse effective, il faut donc un additionneur 5 bits pour
calculer le numéro de registre et un soustracteur sur 6 bits pour décrémenter le nombre de registre : ceci permet
de faire un test de fin avec uniquement le bit de signe.
Question 10 On reprend l’instruction lmw $3, $2, $1 avec dans $1 la valeur 3. Précisez comment va se dérouler
l’exécution d’une telle instruction en remplissant une table du type :
ins0
ins1
ins2
ins3
t
IF
t+1
ID
IF
t+2
EX
ID
IF
t+3
MEM
EX
ID
IF
t+4
WB
MEM
EX
ID
t+5
t+6
t+7
WB
MEM
EX
WB
MEM
WB
t+8
Attention, comme on va itérer sur une partie du pipeline, la structure de la table sera différente, et on notera "BULLE"
la présence d’une bulle dans le pipeline.
On prend à présent l’instruction smw $3, $2, $1 avec dans $1 toujours la valeur 3. En quoi est-ce différent ?
L’instruction lmw va devoir itérer au plus tard dans l’étage EX et produire autant d’instructions dans la suite du
pipeline qu’il y a d’itérations à faire. Ces mini-instructions vont s’exécuter normalement dans la suite du pipeline,
aussi il y aura autant d’exécution de MEM et WB que de EX.
lmw $3, $2, $1
ins1
ins2
ins3
Examen d’architecture - 2S
t
IF
t+1
ID
IF
t+2
EX
ID
IF
t+3
EX
ID
IF
t+4
EX
ID
IF
t+5
MEM
EX
ID
IF
t+6
WB
MEM
EX
ID
t+7
t+8
page - 4
2A
Ensimag
Le store doit lire les bons registres à chaque nouveau cycle, donc l’accès au banc de registre ne peut plus se faire
comme avant.
Question 11
1. Que faut-il ajouter à la "Hazard Detection Unit" pour exécuter correctement (c’est à dire patienter
jusqu’à ce qu’elles soient achevées) ces nouvelles instructions ? On utilisera la notation ID/EX.qqchose pour
indiquer les informations dont on a besoin dans le registre du pipeline.
2. Que faut-il ajouter à l’étage ID ? Modifiez le schéma de cet étage pour ajouter le matériel nécessaire.
3. Que faut-il ajouter à l’étage EX ? Modifiez le schéma de cet étage pour ajouter le matériel nécessaire.
1. Il faut ajouter la détection de ces instructions spécifiquement, avec une fonction booléenne sur le fait que le
nombre de registres à traiter est différent de zéro. ID/EX.MemMW == 1 && ID/EX.nbregs >= 0
2. Le fil $rt (registre lu) doit être multiplexé avec le résultat de l’addition du registre ID/EX.$rt
et de ID/EX.nbregs. La commande du mux est également issue de l’étage EX et est
ID/EX.MemSMW == 1 && ID/EX.nbregs >= 0
Une troisième entrée de lecture doit également être ajoutée (banc de registre à 3 lectures simultanées) afin
de pouvoir lire 3 registres dans le cas du store.
3. Il faut ajouter un adder et un substractor et faire les bonnes connections. Il faut amener rs+nbregs*4 en
entrée de l’ALU pour fournir le calcul d’adresse.
3
Hiérarchie de caches (6pts)
Pour pallier à la différence de rapidité entre processeur et mémoire centrale, il est possible d’utiliser plusieurs
niveaux de caches. Nous étudierons ici une organisation à 3 niveaux de cache :
Le processeur est un processeur 32 bits et a un temps de cycle de t. Le cache de 1er niveau L1 (4K octets) a un
temps d’accès t et des lignes de 32 octets. Le cache de 2ème niveau L2 (128K octets) a un temps d’accès de 5t et
des lignes de 256 octets. Le cache de 3ème niveau (1M octets) a un temps d’accès de 30t et des lignes de 2048
octets. Le temps d’accès à la mémoire centrale est de 60t. On supposera que le temps de pénalité en cas de défaut
dans un cache est égal au temps d’accès au niveau suivant de la hiérarchie de mémoire.
Question 12 Évaluation du temps moyen d’accès.
Par simulation, on a évalué les taux de défauts pour des caches de premier niveau :
Taille du cache
4Koctets
128Koctets
1Moctets
Examen d’architecture - 2S
Format des lignes
32 octets
256 octets
2K octets
Taux de défauts
0,098
0,020
0,005
page - 5
2A
Ensimag
On définit :
– le taux de défauts local d’un cache par : nombre de défauts lors de l’accès à ce cache divisé par le nombre d’accès à
ce cache ;
– le taux de défauts global d’un cache par : nombre de défauts lors de l’accès à ce cache divisé par le nombre total
d’accès mémoire demandé par le processeur.
1. calculez les taux de défauts locaux et globaux des 3 caches ;
2. calculez le temps moyen d’accès à une donnée pour le processeur.
Question 13 Évaluation analytique du temps d’exécution d’un programme.
On considère le programme suivant, qui ajoute une valeur constante (mémorisée dans R1) à tous les éléments d’un
tableau T de dimension 1000, un élément étant codé sur 32 bits. Le code est en pseudo-assembleur proche du MIPS,
la sémantique des instructions est précisée en commentaire.
boucle:
LD #1000, R2
LD #T, R3
LD 0(R3), R4
ADD R4, R1, R4
ST R4,0(R3)
ADD R3,#4,R3
SUB R2,#1,R2
BNZ R2,boucle
!
!
!
!
!
!
!
!
Charge la constante 1000 dans R2
Charge l’adresse du tableau T dans R3
Charge la valeur à l’adresse R3+0 dans R4
Ajoute R1 et R1 et met le resultat en R4
Stocke R4 à l’adresse R3+0
Ajoute la constante 4 à R3
Ajoute la constante 1 à R2
Saute à boucle si R2 est différent de 0
Le processeur est pipe-line, avec lancement possible d’une instruction à chaque période d’horloge. Si on veut faire des
calculs très détaillés, on doit prendre en compte le fait qu’un cycle d’attente doit être inséré après un LD (si il y a
dépendance) et après un saut. On suppose que le tableau T est mémorisé en mémoire centrale avant l’exécution de
cette itération (aucune partie de ce tableau n’a été recopiée dans un cache).
– Combien de périodes d’horloge seront- elles nécessaires à l’exécution de ce programme avec la hiérarchie de 3 caches
définie ci-dessus ?
4
Réordonnancement de programmes (7pts)
On s’intéresse ici à la réorganisation statique et dynamique d’un fragment de programme, implémentant le calcul
suivant sur un tableau de nombre réels (codés en flottant) :
tant que T(i+1) != 0 faire début T(i) := T(i) + T(i+1); i := i+2; fin;
Le processeur utilisé est caractérisé par :
formats :
mot mémoire de 32 bits, adresses 32 bits, adressage à l’octet,
traitant des entiers codés sur 32 bits et des flottants (réels) codés sur 64 bits
registres :
16 registres pour valeurs entières R0, ..., R15
16 registres pour valeurs codées en flottant : F0, ..., F15
modes
registre
d’adressage :
valeur immédiate #vi
indexé par rapport à un registre Ri : depl(Ri)
relatif au compteur programme pour les branchements
jeu
LDW depl(Rj), Ri
Ri := Mém(Rj+depl)
d’instructions :
LDL depl(Rj), Fi
Fi := Mém(Rj+depl)
(utiles pour le sujet) STW Ri, depl(Rj)
Mém(Rj+depl) := Ri
STL Fi, depl(Rj)
Mém(Rj+depl) := Fi
OPint Ri,Rj,Rk
Rk := Ri OPint Rj
OPflo Fi,Fj,Fk
Fk := Fj OPflo Fj
CMPI Ri, Rj, CCR
CCR := f (Ri,Rj)
CMPF Fi,Fj, CCR
CCR := g(Fi,Fj)
BIcc étiq
branchement à étiq si condition (positionnée par CMPI) vraie
BFcc étiq
branchement à étiq si condition (positionnée par CMPF) vraie
Examen d’architecture - 2S
page - 6
2A
Ensimag
Dans les instructions OPint, et CMPI (ou OPflo et CMPF), le registre Rj (ou Fj) peut être remplacé par une valeur
immédiate. On remarque qu’il y a positionnement explicite du registre code condition CCR par les instructions
CMPI (comparaison d’entiers) et CMPF(comparaison de flottants). Les autres instructions ne modifient pas CCR.
On distingue les instructions de branchement conditionnel suivant le type de condition testée.
En supposant que R12 contient l’adresse de T(i), le fragment de programme ci-dessus peut être traduit par :
1 boucle :
2
3
4
5
6
8
9
10 suite :
LDL
8(R12),F2
CMPF
F2,#0,CCR
BFZ suite
LDL
0(R12),F1
ADDF
F1,F2,F1
STL
F1,0(R12)
ADDI
R12,#16,R12
BRA boucle
!
!
!
!
!
!
lecture T(i+1)
comparaison à 0
branchement à la suite si T(i+1) = 0
lecture T(i)
calcul
et stockage du résultat
Ce processeur est pipe-line, et la table ci-dessous indique les cycles d’attente en cas de dépendance : Remarque :
ce processeur est à prédiction de branchement. Quand la prédiction est réalisée pour un branchement déjà rencontré, le temps d’attente est 0 (l’adresse cible du branchement est disponible) et il est inutile d’attendre la fin
d’une comparaison CMPF. Quand la prédiction n’est pas réalisée et/ou c’est la première fois qu’on rencontre ce
branchement, le temps perdu est de 2 pour un BIcc, de 4 pour un BFcc (temps entre l’opération CMPF et l’opération de branchement = 2 inclus). Vous pourrez vous contenter d’analyser le comportement du programme pour
une prédiction réalisée et une adresse cible connue, le branchement BFZ n’étant effectué qu’en fin d’itération.
1ère instruction
instruction dépendante
LDW
LDL
STW
STL
OPint ou CMPI
OPflo ou CMPF
BIcc
BFcc
LDW
LDL
STW
STL
OPint
OPflo
CMPI
CMPF
BIcc
BFcc
1
1
1
1
1
-
3
3
-
-
-
0
0
0
0
0
-
3
3
-
0
-
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Question 14
1. évaluez le nombre de cycles par itération du programme indiqué ci-dessus.
2. modifiez le programme pour diminuer le nombre de cycles
3. déroulez la boucle (3 exemplaires devraient être suffisants) et optimisez le programme obtenu ; à noter : il est
nécessaire de modifier les registres utilisés (renommage statique)
4. supposons qu’on dispose de 3 registres CCR : CCR1, CCR2, CCR3 : peut-on optimiser le programme obtenu en
précédemment (item 3) ?
5. on transforme le processeur en processeur VLIW, avec deux pipe-lines fonctionnant en parallèle (donc 2 opérations par instruction VLIW) : le premier pipe-line peut exécuter des opérations entières ou flottantes (y compris
les comparaisons), le deuxième des opérations entières ou un accès mémoire. Il n’y a pas de parallélisme possible
avec une instruction de branchement. Proposez un programme optimisé pour un tel processeur, en supposant
que quand un registre est à la fois source et destination dans une même instruction VLIW, sa valeur avant
l’exécution de toute opération de l’instruction VLIW est prise comme opérande.
6. on transforme le processeur en processeur superscalaire, capable d’examiner et de lancer (si possible) plusieurs
instructions en parallèle : dans le cas où il s’agit de 2 instructions successives, proposez une version optimisée
du programme.
Examen d’architecture - 2S
page - 7
Téléchargement