CPU - Cerimes

Download Report

Transcript CPU - Cerimes

CENTRAL PROCESSING UNIT
Architecture et Technologie des Ordinateurs
Hugo Descoubes - Juin 2013
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Tout CPU effectue séquentiellement les traitements présentés
ci-dessous :
FETCH
DECODE
EXECUTE
WRITEBACK
• FETCH : Aller chercher le code binaire d’une
instruction en mémoire programme. Beaucoup de
CPU récents sont capables d’aller chercher plusieurs
instructions durant la phase de fetch.
• DECODE : décodage du ou des opcodes des
instructions précédemment fetchées.
• EXECUTION : Exécution de ou des instructions
précédemment décodées. Cette opération est
réalisée par les EU’s (Execution Unit).
• WRITEBACK : Ecriture du résultat en mémoire ou
dans un registre (typiquement dans le CPU )
2 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
La très grande majorité des architectures modernes sont
capables de réaliser une partie voire toutes ces étapes en parallèle.
Nous parlerons de pipelining hardware.
Program
Memory
110000100111001
1110001101110100
0011000111000101
…
PC
CPU
Fetch
Decode
Execute
Writeback
PC
0000110 111 011 111
Prenons un exemple et supposons
que chaque étape prend un cycle
CPU (fetch, decode, execute et
writeback).
Il faudrait donc 4cy pour exécuter
chaque instruction.
1 level Hardware Pipeline
3 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
La très grande majorité des architectures modernes sont
capables de réaliser une partie voir toutes ces étapes en parallèle.
Nous parlerons de pipelining hardware.
Program
Memory
110000100111001
1000111000111000
1100001110001011
…
PC
Program Counter
CPU
PC
Fetch
1100001001110001
Decode
0011000111000101
Execute
1110001 101 110 100
Sources Operands
Manipulation
Writeback
0000110 111 011 111
Dest. Operand
Manipulation
Opcode
Manipulation
4 levels Hardware Pipeline
Prenons un exemple et supposons
que chaque étape prend un cycle
CPU (fetch, decode, execute et
writeback).
Il faudrait donc 4cy pour la
première instruction et 1cy
(théoriquement) pour les suivantes.
4 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Pour un CPU, posséder un pipeline hardware est donc
intéressant. Cependant, un pipeline trop long peut entraîner des
ralentissement (souvent lié aux instructions de saut). Il devient alors
très difficile d’accélérer l’architecture (mécanismes d’accélération).
A titre d’exemple, les architectures Penryn’s de Intel possèdent
un pipeline Hardware de 14 niveaux et Nehalem 20-24 étages.
Pipeline matériel de la famille sandy bridge :
5 – copyleft
http://www.intel.com
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Etudions un CPU élémentaire RISC-like n’étant rattaché à
aucune architecture connue. Observons le jeu d’instruction très très
réduit associé :
Syntax
Mnemonic
Description
Example
Binary (bits)
ADD
ADD regSrc, regSrc, regDst
Addition contenu de 2 registres
ADD R1, R2, R1
000 r r r uu
JMP
JMP label
Saut en mémoire programme
JMP addInst
001 aaaa u
LOAD
LOAD address, regDst
Chargement d’une donnée depuis la mémoire vers le CPU
LOAD addData, R2
010 aaa r u
MOV
MOV regSrc, regDst
Copie le contenu d’un registre vers un autre registre
MOV R2, R1
011 r r uuu
MOVK
MOVK constant, regDst
Charge une constante dans un registre
MOVK cst3bits, R1
100 kkk r u
STR regSrc, address
Sauvegarde une donnée contenu dans un regsitre vers la mémoire
STR R1, addData
101 r aaa u
STR
Glossary : r=registre
a=address
u=unused
k=constant
R1=register
R2=register
addInst=Program memory address
addData=Data memory address
6 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Implémentation assembleur du langage C ci-dessous :
Programme en C
char value=3, saveValue;
void main (void) {
while (1) {
value += 2;
saveValue = value;
}
}
Programme assembleur
Program Address
Mnemonic
operands
Binary
0x0 main :
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
0xF
LOAD
MOVK
ADD
STR
LOAD
STR
JMP
undefined
undefined
…
undefined
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
uuuuuuuu
Glossary :
R1=0
R2=1
&value=0x0
&saveValue=0x1
7 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Etudions l’évolution de notre
programme assembleur ainsi que
le travail du CPU
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
PC = 0x0
Fetch stage
Address Binary
Decode stage
Data
Address
Bus
Execution Unit
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
8 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Démarrage application
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
• Cycle n°1 : Fetch instruction
adresse 0x0, modification PC
(Program Counter)
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
01000010
PC = 0x1
Address Binary
Decode stage
Data
Address
Bus
Execution Unit
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
9 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°2 : Fetch instruction
adresse 0x1, décodage
instruction précédemment
fetchée, modification PC
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
10001000
Decode stage
01000010
PC = 0x2
Address Binary
Execution Unit
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
10 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°3 : Fetch instruction
adresse 0x2, modification PC
(Program Counter), exécution
LOAD
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
00001000
Decode stage
10001000
Execution Unit
01000010
PC = 0x3
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000011
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
11 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°4 : Fetch instruction
adresse 0x3, modification PC
(Program Counter), exécution
MOVK
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
10100000
Decode stage
00001000
Execution Unit
10001000
PC = 0x4
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000010
R2 00000011
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
12 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°5 : Fetch instruction
adresse 0x4, modification PC
(Program Counter), exécution
ADD
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
01000010
Decode stage
10100000
Execution Unit
00001000
PC = 0x5
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000011
Data
Bus
00000011
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
13 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°6 : Fetch instruction
adresse 0x5, modification PC
(Program Counter), exécution
STR
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
10110010
Decode stage
01000010
Execution Unit
10100000
PC = 0x6
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
R2 00000011
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
Data
Bus
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
14 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°7 : Fetch instruction
adresse 0x6, modification PC
(Program Counter), exécution
LOAD
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
00100000
Decode stage
10110010
Execution Unit
01000010
PC = 0x7
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000101
Data
Bus
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
15 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°8 : Fetch instruction
adresse 0x7, modification PC
(Program Counter), exécution
STR
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
uuuuuuuu
Decode stage
00100000
Execution Unit
10110010
PC = 0x8
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
R2 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
Data
Bus
00000101
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
16 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°9 : Fetch instruction
adresse 0x8, modification
PC=0x0 (Program Counter),
exécution JMP
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
uuuuuuuu
Decode stage
uuuuuuuu
Execution Unit
00100000
PC = 0x0
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000101
Data
Bus
00000101
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
17 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°10 : Fetch instruction
adresse 0x0, modification PC
(Program Counter), aucune
instruction exécutée
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
01000010
Decode stage
uuuuuuuu
Execution Unit
uuuuuuuu
PC = 0x1
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000101
Data
Bus
00000101
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
18 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°11 : Fetch instruction
adresse 0x1, modification PC
(Program Counter), aucune
instruction exécutée
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
10001000
Decode stage
01000010
Execution Unit
uuuuuuuu
PC = 0x2
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
R2 00000101
Data
Bus
00000101
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
19 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
• Cycle n°12 : Fetch instruction
adresse 0x2, modification PC
(Program Counter), exécution
LOAD
Address Binary
01000010
10001000
00001000
10100000
01000010
10110010
00100000
uuuuuuuu
uuuuuuuu
…
8
Instruction Bus
4
main : LOAD
MOVK
ADD
STR
LOAD
STR
JMP
Program
Address Bus
CPU
Fetch stage
00001000
Decode stage
10001000
Execution Unit
01000010
PC = 0x3
Address Binary
Data
Address
Bus
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
3
MUX
R1 00000101
R2 00000101
&value, R2
2, R1
R1, R2, R1
R1, &value
&value, R2
R2, &saveValue
main
Data
Bus
00000101
00000101
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
uuuuuuuu
Data Memory
Program Memory
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
…
8
20 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Etc …
21 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Von Neumann
 Harvard
 Harvard Modifié
Un CPU peut posséder différents modèles d’interconnexion
avec les mémoires (program et data). Chaque modèle amène son lot
d’avantages et d’inconvénients.
Historiquement, l’une des premières architectures
rencontrées était celle de Von Neumann. Mapping mémoire voire
mémoire unifiée (code et données). Le CPU 8086 de Intel possède une
architecture de Von Neumann. Néanmoins via une astuce il possède
un pipeline à 2 niveaux.
CPU
Instruction
Data
Bus
Program
&
Data
Memory
Unified
22 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Von Neumann
 Harvard
 Harvard Modifié
En 2012, certains CPU’s actuels utilisent encore ce type de
fonctionnement dans certains cas. Il s’agit d’architectures hybrides
Harvard/Von Neumann, par exemple les PIC18 de Microchip.
Possibilité de placer des données en mémoire programme.
Observons quelques avantages et inconvénients de cette
architecture :
• Mapping mémoire unique (data et program)
• Polyvalent si mémoire unifiée. Applications code large et peu de
données et vice versa.
• Mais, pipeline matériel impossible/difficile (fetch, decode,
execute, writeback en parallèle).
23 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Von Neumann
 Harvard
 Harvard Modifié
En 2012, l’architecture de Harvard est toujours rencontrée sur
certains processeurs. Prenons les exemples des PIC18 de Microchip,
AVR de Atmel …
Une architecture de Harvard offre une mémoire programme
séparée de la mémoire donnée. Technologie, taille des adresses donc
taille des mémoires et bus distincts.
Program
Memory
Instruction
Bus
CPU
Data
Bus
Data
Memory
24 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Von Neumann
 Harvard
 Harvard Modifié
Observons quelques avantages de ce type d’architecture :
• pipeline matériel possible. Fetch (program memory) en parallèle
des phases decode (CPU), execute (CPU ou data memory) suivi du
writeback (CPU ou data memory).
Observons quelques inconvénients de ce type d’architecture :
• Mapping mémoires distincts (adresse mémoire donnée différente
adresse mémoire programme). Moins flexible pour le développeur.
• Peu polyvalent. Certaines applications exigent une large
empreinte en mémoire donnée (traitement image et son, bases de
données…) pour d’autres ce sera le code …
25 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Von Neumann
 Harvard
 Harvard Modifié
L’architecture de Harvard modifié tend à allier les avantages
des deux architectures précédemment présentées. Elle amène
cependant son lot d’inconvénients. La très grande majorité des CPU’s
modernes utilise ce type d’architectures. Prenons une liste non
exhaustive de CPU : Core/Coreix de Intel, Cortex-A de ARM, C6xxx de
Texas Instrument …
Von Neumann
Harvard
Cache L1P
L1P
Separated
Controller
Instruction
Bus
CPU
Data Bus
Cache L1D
L1D
Separated
Controller
Cache
L2
Unified
L2
Controller
Main
Memory
Unified
or
L3 Cache
Unified
(shared)
26 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Von Neumann
 Harvard
 Harvard Modifié
En informatique, une mémoire cache est chargée
d’enregistrer et de partager temporairement des copies
d’informations (données ou code) venant d’une autre source,
contrairement à une mémoire tampon qui ne réalise pas de copie.
L’utilisation de mémoire cache est un mécanisme d’optimisation
pouvant être matériel (Cache Processeur L1D, L1P, L2, L3 shared…)
comme logiciel (cache DNS, cache ARP…). Sur processeur numérique,
le cache est alors hiérarchisé en niveaux dépendants des technologies
déployées :
27 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Von Neumann
 Harvard
 Harvard Modifié
Ce type d’architecture allie les avantages et comble les
inconvénients associés aux architectures de Harvard et de Von
Neumann via l’utilisation de mémoire cache (mémoire temporaire).
Néanmoins, pour un développeur bas niveau adepte de l’optimisation
ou du développement de drivers, une manipulation optimale de la
mémoire cache exige une grande rigueur de codage.
L’un des principaux dangers de ce type de mémoire, est la
cohérence des informations présentes dans la hiérarchie mémoire du
processeurs. Par exemple pour un coreix de la famille sandy bridge,
une même donnée peut exister avec différentes valeurs en mémoire
de masse (hard disk), mémoire principale (DDR3), mémoire cache L3
(shared multi-core), L2 (unified mono-core), L1D (separeted monocore) et dans les registres internes du CPU.
28 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
Découvrons plus en détail le 8086 anciennement proposé par
Intel. Rappelons que ce CPU est à la base des architectures x86 :
: bus d’adresse de donnée
: bus de contrôle
: Interruptions
: Direct Memory Access
29 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
• Execution Unit : décode puis
exécute les instructions
présentes dans la file
d’attente
• Bus Interface Unit : contrôle
des bus pour les accès
mémoire. Calcul adresses
physiques (segmentation).
Gestion phases de fetch via
IP ou Instruction Pointer
(équivalent à PC ou Program
Counter).
Dr J. Y. Haggège
30 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
• Segmentation: la
segmentation mémoire sera
vue plus tard dans le cours
lorsque nous aborderons
l’étude de la MMU (Memory
Managment Unit).
• Pile : vu dans la suite du
cours.
• Indexage : vu dans la suite
du cours.
Dr J. Y. Haggège
31 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
• General Purpose Registers :
AX (AH+AL), BX (BH+BL), CX
(CH+CL) et DX (DH+DL) sont
des registres généralistes
16bits. Certains d’entre eux
peuvent être spécialisés
AX=accumulateur,
CX=compteur…
• Instruction Pointer : contient
l’adresse de la prochaine
instruction à aller chercher.
Dr J. Y. Haggège
32 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
• Arithmetic Logical Unit :
l’UAL ou ALU est l’unité de
calcul du CPU. Cette unité
effectue des opérations
arithmétiques et logiques
élémentaires.
• Flags : des flags
(indicateurs) sont toujours
associés à une ALU : Carry
(débordement), Z (zero), S
(signe), O (overflow) …
Dr J. Y. Haggège
33 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Original 8086 Instruction set
CPU
 Architecture matérielle
 jeu d’instruction
AAA
ASCII adjust AL after addition
HLT
Enter halt state
AAD
ASCII adjust AX before division
IDIV
Signed divide
AAM
ASCII adjust AX after multiplication
IMUL
Signed multiply
AAS
ASCII adjust AL after subtraction
IN
Input from port
ADC
Add with carry
INC
Increment by 1
ADD
Add
INT
Call to interrupt
AND
Logical AND
INTO
Call to interrupt if overflow
CALL
Call procedure
IRET
Return from interrupt
CBW
Convert byte to word
Jcc
Jump if condition
CLC
Clear carry flag
JMP
Jump
CLD
Clear direction flag
LAHF
Load flags into AH register
CLI
Clear interrupt flag
LDS
Load pointer using DS
CMC
Complement carry flag
LEA
Load Effective Address
CMP
Compare operands
LES
Load ES with pointer
CMPSB
Compare bytes in memory
LOCK
Assert BUS LOCK# signal
CMPSW
Compare words
LODSB
Load string byte
CWD
Convert word to doubleword
LODSW
Load string word
DAA
Decimal adjust AL after addition
LOOP/LOOPx
Loop control
DAS
Decimal adjust AL after subtraction
MOV
Move
DEC
Decrement by 1
MOVSB
Move byte from string to string
DIV
Unsigned divide
MOVSW
Move word from string to string
ESC
Used with floating-point unit
MUL
Unsigned multiply
34 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Original 8086 Instruction set
CPU
 Architecture matérielle
 jeu d’instruction
NEG
Two's complement negation
SCASB
Compare byte string
NOP
No operation
SCASW
Compare word string
NOT
Negate the operand, logical NOT
SHL
Shift left (unsigned shift left)
OR
Logical OR
SHR
Shift right (unsigned shift right)
OUT
Output to port
STC
Set carry flag
POP
Pop data from stack
STD
Set direction flag
POPF
Pop data from flags register
STI
Set interrupt flag
PUSH
Push data onto stack
STOSB
Store byte in string
PUSHF
Push flags onto stack
STOSW
Store word in string
RCL
Rotate left (with carry)
SUB
Subtraction
RCR
Rotate right (with carry)
TEST
Logical compare (AND)
REPxx
Repeat MOVS/STOS/CMPS/LODS/SCAS
WAIT
Wait until not busy
RET
Return from procedure
XCHG
Exchange data
RETN
Return from near procedure
XLAT
Table look-up translation
RETF
Return from far procedure
XOR
Exclusive OR
ROL
Rotate left
ROR
Rotate right
SAHF
Store AH into flags
SAL
Shift Arithmetically left (signed shift left)
SAR
Shift Arithmetically right (signed shift
right)
SBB
Subtraction with borrow
35 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
Nous allons maintenant découvrir quelques-unes des
principales instructions supportées par le 8086 (documentation en
ligne, http://zsmith.co/intel.html). Il ne s’agira pas d’une étude
approfondie de chaque instruction et certaines subtilités ne seront
pas abordées dans ce cours ou seront vues par la suite (adressage
indexé, segmentation…). La présentation suivante sera découpée
comme suit :
• Instructions de management de données
• Instructions arithmétiques et logiques
• Instructions de saut
36 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
Comme tout CPU, le 8086 est capable de déplacer des
données dans l’architecture du processeur :
• registre (CPU) vers mémoire
• registre (CPU) vers registre (CPU)
• mémoire vers registre (CPU)
Un déplacement mémoire vers mémoire en passant par le
CPU n’est pas implémenté et aurait peu d’intérêt (mémoire vers CPU
suivi de CPU vers mémoire). Si nous souhaitons réaliser des transferts
mémoire/mémoire sans passer par le cœur, les périphériques de type
DMA (Direct Memory Access) peuvent s’en charger. Si votre
processeur en possède.
37 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
Commençons par l’instruction MOV. Vous constaterez que
cette instruction supporte un grand nombre de modes d’adressages.
Ceci est typique d’un CPU CISC. En général, les CPU RISC
implémentent moins de modes d’adressage avec des instructions
dédiées à chaque mode.
• Adressage registre : déplacement de données dans le CPU.
Registre vers registre.
mov
%ax, %bx
• Adressage immédiat : affectation d’une constante dans un
registre. Le déplacement d’une constante vers la mémoire est
également possible.
mov
$0x1A2F, %bx
38 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
Les modes d’adressage suivants manipulent tous la mémoire.
Nous partirons pour le moment d’une hypothèse fausse. Supposons
que nous ne pouvons manipuler que 64Ko de mémoire (données et
programme unifiées) et donc des adresses sur 16bits uniquement.
Nous découvrirons la capacité mémoire réelle de 1Mo du 8086
lorsque nous présenterons la notion de segmentation.
• Adressage direct : déplacement de données du CPU vers la
mémoire ou vice versa. L’adresse de la case mémoire à manipuler
est directement passée avec l’opcode de l’instruction.
1o
mov
(0x000F), %bl
Data Memory
64Ko
0xFFFF
…
…
0
0x000F
0x0000
39 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
• Adressage indirect : déplacement de données du CPU vers la
mémoire ou vice versa. L’adresse de la case mémoire à manipuler
est passée indirectement par un registre.
1o
mov
mov
Data Memory
64Ko
$0x000F, %bx
(%bx), %al
0xFFFF
…
…
0
0x000F
0x0000
• Adressage indexé : non vu en cours. Registres d’index SI et DI.
• Suffixes d’instruction : permet de fixer le nombre d’octets à
récupérer ou sauver en mémoire (uniquement en syntax AT&T).
movb
movw
movl
%bl, %al
%bx, %ax
%ebx, %eax
;déplacement 1o
;déplacement 2o
;déplacement 4o
;(non supporté sur 8086)
40 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
 Architecture matérielle
 jeu d’instruction
Quelque soit le langage d’assemblage rencontré, les
opérandes manipulées par une instruction seront toujours l’une de
celles qui suit :
• Immédiat (constante) : imm>reg ou imm>mem
• Registre (contenant une donnée ou une adresse) : reg>reg
• Addresse : reg>mem ou mem>reg ou saut mem
Les combinaisons présentées ci-dessus permettent d’accéder
et de manipuler la totalité de l’architecture du processeur.
41 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
• Instructions arithmétique : attention, les modes d’adressage
supportés diffèrent d’une instruction à une autre. Etudions quelques
instructions arithmétique en mode d’adressage registre :
movb
movb
add
mul
div
$14,%al
$2,%bl
%bl,%al
%bl
%bl
sub
%bl,%al
; al=0x0E (4cy)
; bl=0x02 (4cy)
; al=0x10 (3cy)
; ax=0x0020 (70-77cy)
; al=0x10 (quotient)
; bl=0x00 (reste)
; (80-90cy)
; al=0x10 (3cy)
• Instructions logique : manipulation bit à bit de données :
movb
movb
and
or
not
$15,%al
$0x01,%bl
$0xFE,%al
%bl,%al
%al
shl
$1,%al
; al=0x0F (4cy)
; bl=0x01 (4cy)
; al=0x0E (4cy)
; al=0x0F (3cy)
; al=0xF0 (3cy)
; Complément à 1
; al=0xE0 (2cy)
; flag carry C=1
42 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
Les instructions de saut ou de branchement en mémoire
programme peuvent être conditionnels ou inconditionnels. En langage
C, elles permettent par exemple d’implémenter : if, else if, else, switch,
for, while, do while, appels de procédure.
• Structures de contrôle : Observons une partie des instructions de
saut conditionnelles. Elles utilisent toutes les flags retournés par
l’ALU et doivent être pour la plupart utilisées après une instruction
arithmétique, logique ou de comparaison.
Dr J. Y. Haggège
43 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
Prenons un exemple de programme C et étudions une
implémentation assembleur possible. La solution n’est bien sûr pas
unique :
unsigned char varTest = 0;
main:
void main (void) {
while (1) {
if ( varTest == 0 ) {
// user code if
}
else {
// user code else
}
}
else1:
if1:
}
endif1:
mov
mov
cmp
jz
(addressVarTest),%al
; al=0x00 (+8cy)
0,%bl
; bl=0x00 (4cy)
%bl,%al
; (3cy), flag Z=1
if1
; IP = addresse if1
; (16cy jump, 4cy no jump)
; user code else
;…
;…
;…
jmp
endif1
; IP = addresse endif1 (15cy)
; user code if
;…
;…
;…
jmp
main
; IP = addresse main (15cy)
44 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
 Architecture matérielle
 jeu d’instruction
• Appel de procédure: dans une premier temps, nous ne parlerons
que des appels de procédure sans passage de paramètres. Cette
partie sera vue dans la suite du cours lorsque nous aborderons la
notion de pile ou stack. Juste après avoir vu la segmentation
mémoire, notamment les segments SS=Stack Segment et CS=Code
Segment).
void fctTest (void);
main:
void main (void) {
while (1) {
fctTest();
}
}
void fctTest (void) {
// user code
}
fctTest:
call
jmp
;other code
;…
;…
; user code
;…
;…
;…
ret
fctTest
main
; IP = adresse fctTest (19cy relatif)
; IP = adresse main (15cy)
; IP = adresse jmp dans le main
; (16-20cy)
45 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Observons les principales évolutions des architectures x86-64
du 8086 jusqu’à l’architecture Sandy Bridge :
CPU
Architecture
Année
8086
1978
80186
1982
80286
80386
1985
80486
1989
Pentium
1993
Pentium pro
(P6)
1995
Pentium II
Pentium III
1997
Pentium 4
2000
Espace d’adressage
Linéaire/physique
Principales évolutions
Jeu d’instruction x86 original, segmentation mémoire
16bits (logical)/20bits
(phys.)
Accélération matérielle (calcul d’adresses, multiplication ,division …)
16bits (logical)/30bits
(linear)/24bits (phys.)
MMU (Memory Managment Unit) avec segmented mode, tables GDT (Global et Local Descriptor
Table) et LDT, modes protégés avec privilèges
Jeu d’instruction 32bits (IA-32), MMU avec unité de Pagination
32bits (logical)/46bits
(linear)/32bits (phys.)
Pipeline RISC-like, mémoire cache intégrée et FPU (Floating Point Unit)
Processeur superscalaire (exécution plusieurs instructions par cycle CPU via plusieurs unités
d’exécution), extension MMX
Cache L2 intégré, PAE 4bits (Physical Address Extension), translation micro-instructions (uop),
exécution out-of order, exécution spéculative (register renaming)
32bits (logical)/46bits
(linear)/36bits (phys.) via
PAE
Cache L3 intégré, extension SSE (instructions SIMD)
Extension SSE2 , Hyper-Threading, pipeline profond, uop cache (Trace Cache)
46 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Observons les principales évolutions des architectures x86-64
du 8086 jusqu’à l’architecture Sandy Bridge :
CPU
Architecture
Année
Pentium 4
Prescott
2004
Core 2
2006
Atom
2008
Corei7
Nehalem
2008
Sandy Bridge
Ivy Bridge
2011
Espace d’adressage
Linéaire/physique
Principales évolutions
Jeu d’instruction x64 (Intel 64), extension SSE3
Cf. CPUID
Multi-cœurs, extension SSE4 (Penryn), faible consommation
Cf. CPUID
Sur ma machine Intel 64
famille Sandy Bridge sous
Linux 48bits (linearvirtual)/36bits (phys.)
Très faible consommation, exécution in-order (marchés laptop et mobile)
3 niveaux de cache intégrés, bus QPI (remplaçant FSB vers chipet), extension pour cryptage AES
Extension SSE5 et AVX, GPU, advanced uop cache
47 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Rappelons les registres rencontrés sur architecture 8086 de
Intel :
Dr J. Y. Haggège
48 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
En même temps que les architectures des CPU’s évoluent, le
nombre et les tailles des registres de travail évoluent également.
Observons les principaux registres de travail généralistes (iL/iH
imbriqué dans iX imbriqué dans EiX lui-même imbriqué RiX) :
General Purpose Registers (i = A, B, C, D)
64bits
32
16
8
RiX
Depuis Intel 64 architecture (64bits mode-only)
Depuis 80386 architecture (E = Extended)
EiX
Depuis 8086 architecture
iX
iH
iL
General Purpose Registers for Floating Point Unit : x87 and MMX extensions (i = 0 to 7)
80bits
64bits
STi
MMXi
Depuis 80486 architecture (x87 extension)
Depuis Pentium MMX architecture
49 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
64bits mode-only General Purpose Registers (i = 8 to 15)
64bits
32
16
8
Ri
Depuis Intel 64 architecture (64bits mode-only)
RiD
RiX
RiB
General Purpose Registers for SIMD Execution Units (SSE extensions)
(i = 0 à 7 with Pentium III SSE )
(i = 0 à 15 with Intel 64)
256bits
128bits
YMMi
Depuis Sandy Bridge architecture (AVX extension)
XMMi
Depuis Pentium III architecture (SSE extension)
50 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Pour rappel, l’instruction dpps précédemment étudiée durant
le chapitre précédent fut introduite avec l’extension SSE4.1 et utilise
donc les registres 128bits XMMi :
51 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Registres pour la manipulation de pointeurs (SP, BP, SI, DI et xS) :
Pointer Registers (i = S and B)
64bits
32
16
Segment Registers
(i = C, D, S, E, F and G)
8
RiP
16bits
EiP
iS
iP
Depuis 8086 architecture
iPL
(64bits mode-only)
Index Registers (i = S and D)
64bits
32
16
8
RiI
EiI
Depuis 8086 architecture
iI
iIL
(64bits mode-only)
52 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Instruction Pointer Register
64bits
32
16
8
RIP
EIP
IP
Depuis 8086 architecture
D’autres registres divers ou spécialisés sont également arrivés
au cours des évolutions des architectures : Descriptor Table Registers
(GDTR, LDTR, IDTR), task register (TR), control registers CR0-CR8 64bits
mode-only …
53 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Environnements d’exécution en modes 32bits et 64bits :
http://www.intel.com
54 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Analysons maintenant les principaux mécanismes
d’accélération matérielle apportés sur architecture Sandy Bridge de
Intel. Une bonne partie de ces mécanismes d’optimisation n’ont pas
forcément à être connus des développeurs, même pour un
développeur bas niveaux.
Contrairement à d’autres architectures (par exemple, CPU DSP
C6xxx de TI), les CPU’s compatibles x86-64 exécutent un flot
d’instruction présent in-order (dans l’ordre) en mémoire et appliquent
des mécanismes d’accélération matérielle d’exécution out-of order
dans le CPU. Ceci amènent notamment une architecture hardware
plus complexe, plus gourmande en énergie, sujette à de fortes
contraintes d’échauffement, plus difficile à appréhender et à accélérer.
55 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Vu d’ensemble du pipeline matériel de la microarchitecture
Sandy Bridge de Intel :
Front End
Out-of Order Engine
Execution Core
Cache Hierarchy
http://www.intel.com
56 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Registers
Front End
Out-of Order Engine
Execution Core
Etudions le pipeline matériel de la
microarchitecture Sandy Bridge de
Intel sortie courant 2011.
• La mémoire cache et la notion
de TLB (Translation Lookaside
Buffer) seront étudiés plus tard
dans le cours. Nous partirons de
l’hypothèse (souvent juste) que
les instructions nécessaire à
l’exécution du code en cours
traitement par le CPU sont
présentent en ICache
(Instruction Cache).
57 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Legacy Decode Pipeline (Nehalem)
Branch Prediction
Unit
Registers
Front End
Out-of Order Engine
Execution Core
• L’unité de prédiction aux
branchements est chargée
d’anticiper et prédire les
branchements futurs. Elle peut
prédire de façon efficace :
branchement conditionnel, jump
et call directs et indirects,
returns de procédure.
• Le pipeline actuellement
présenté est hérité de la
microarchitecture Nehalem de
Intel (premiers corei7 fin 2008).
58 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Branch Prediction
Unit
Registers
Front End
Out-of Order Engine
Execution Core
• L’unité Instruction Fetch est
chargée d’acheminer 16octets
alignés à travers l’ITLB et
présents en L1 Icache vers l’unité
de pré-décodage.
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
• Comme tout jeu d’instruction
CISC, les instructions ne
possèdent pas une taille fixe.
L’unité de pré-décodage est
chargée d’identifier le nombre
d’instruction contenue dans les
16o récupérés (instructions
préfixées).
59 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Branch Prediction
Unit
Instruction PreDecoder
• Potentiellement, des ‘’bulles’’
(clusters dans la file d’attente
sans instruction) peuvent être
naturellement insérés en
fonction du code en cours
d’exécution.
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Queue
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Registers
Front End
Out-of Order Engine
Execution Core
Inst.
bubble
Inst.
Inst.
Inst.
bubble
Inst.
bubble
Inst.
Inst.
Inst.
Inst.
Inst.
Inst.
bubble
bubble
bubble
bubble
60 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Branch Prediction
Unit
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
• Cet étage peut également
réaliser la macro-fusion
d’instruction simple. Sous
condition, prenons des exemples
d’instructions pouvant
fusionnées sur architecture
Sandy Bridge : CMP, TEST, ADD,
SUB, AND, INC, DEC
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Queue
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Registers
Front End
Out-of Order Engine
Execution Core
Macro-fused
Inst.
bubble
Inst.
Inst.
Inst.
bubble
Inst.
bubble
Inst.
Inst.
Inst.
Inst.
Inst.
Inst.
bubble
bubble
bubble
bubble
61 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Branch Prediction
Unit
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
Registers
Front End
Out-of Order Engine
Execution Core
• L’unité de décodage
d’instruction est chargée de
décoder les instructions CISC en
micro-opérations ou uops
élémentaires (operation, load,
store, jump …). Par exemple,
xorq %rax, 32(%rbp) devient
xorOperation+memoryStore
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Decoder
Simple
Decode
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Complex
Decode
4uops
• Par exemple, lorsque Intel
introduisit l’extension SSE2 avec
le Pentium4, chaque instruction
sur 128bits était découpée en 2
uops de 64bits.
62 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Branch Prediction
Unit
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Complex
Decode
4uops
• Les instructions CISC complexe
sont routées vers un décodeur
dédié (Complex Decode). En cas
d’instructions générant plus de 4
uops, celles-ci sont alors
extraites d’une mémoire morte
ROM associée à un séquenceur
(MSROM) chargé d’envoyer le
flot de uops à l’étage suivant.
up to 4 Inst./Cy
Instruction Decoder
Simple
Decode
Registers
Front End
Out-of Order Engine
Execution Core
MSROM
Microcode
Sequencer
4uops/Cy
63 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Legacy Decode Pipeline (Nehalem)
CPU




Registers
Front End
Out-of Order Engine
Execution Core
• Le flot d’instruction est alors
L1 ICache
ITLB
acheminé vers une nouvelle file
32Ko
4Ko page 128 entry
8ways set associative
2-4Mo page 8 entry
d’attente dont le travail principal
est de combler les ‘’bulles’’
Instruction
Branch
Prediction
16o aligned/Cy
Fetch Unit
Unit
rencontrées dans les étages
128bits
précédents afin d’assurer un flot
Instruction PreDecoder
16o
dans le désordre quasi constant
up to 6 inst./Cy (typical ~4inst.)
de 4uops (out-of order).
Instruction Queue
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Decoder
Simple
Decode
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Complex
Decode
4uops
MSROM
Microcode
Sequencer
4uops/Cy
• Certains mécanismes
d’accélération sont insérés à cette
étape. Etudions les principaux.
Instruction
Decoder Queue
(micro-fusion)
~4uops guarantee
64 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Legacy Decode Pipeline (Nehalem)
CPU




Registers
Front End
Out-of Order Engine
Execution Core
• Le Loop Stream Detector (LSD)
L1 ICache
ITLB
permet de détecter et de
32Ko
4Ko page 128 entry
8ways set associative
2-4Mo page 8 entry
verrouiller les petites boucles (<
18 instructions) et évitent donc
Instruction
Branch
Prediction
16o aligned/Cy
Fetch Unit
Unit
notamment des phases de fetch
128bits
et de décodage inutiles. La boucle
Instruction PreDecoder
16o
est invalidée par l’unité de
up to 6 inst./Cy (typical ~4inst.)
prédiction dès qu’une prédiction
Instruction Queue
18++ Instructions (macro-fusion)
manquée est détectée (miss1 Inst.
up to 4 Inst./Cy
1 Inst.
1 Inst.
1 Inst.
prediction).
Instruction Decoder
Simple
Decode
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Loop Stream Detector
up to 28uops
Complex
Decode
4uops
MSROM
Microcode
Sequencer
4uops/Cy
Instruction
Decoder Queue
(micro-fusion)
~4uops guarantee
65 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Branch Prediction
Unit
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
Registers
Front End
Out-of Order Engine
Execution Core
• Cet étage peu également
réaliser sous condition des
micro-fusions de uops pouvant
être décodées et exécutées par
la suite :
uop + uop
=
micro-fused complex uop
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Decoder
Simple
Decode
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Loop Stream Detector
up to 28uops
Complex
Decode
4uops
MSROM
Microcode
Sequencer
4uops/Cy
Instruction
Decoder Queue
(micro-fusion)
~4uops guarantee
66 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Observons l’instruction dpps précédemment étudiée dans le
cours et découvrons son découpage en uops (unfused, micro-fused et
macro-fused) à avant l’étage d’exécution out-of order du CPU :
Instruction
dpps
Operands
uops
fused
xmm, xmm, imm8
4
xmm, m128, imm8
6
unfused uops
p0
p1
p5
Latency
p23
p4
Reciprocal
Throughput
Comments
SSE4.1
67 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




L1 ICache
ITLB
32Ko
8ways set associative
4Ko page 128 entry
2-4Mo page 8 entry
Instruction
Fetch Unit
Branch Prediction
Unit
Instruction PreDecoder
16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue
18++ Instructions (macro-fusion)
1 Inst.
1 Inst.
1 Inst.
1 Inst.
up to 4 Inst./Cy
Instruction Decoder
Simple
Decode
1uop
Simple
Decode
1uop
Simple
Decode
1uop
Loop Stream Detector
up to 28uops
Complex
Decode
4uops
MSROM
Microcode
Sequencer
4uops/Cy
Instruction
Decoder Queue
Decoded ICache (Sandy Bridge)
Legacy Decode Pipeline (Nehalem)
16o aligned/Cy
128bits
Registers
Front End
Out-of Order Engine
Execution Core
• Le Decoded Icache est l’une des
évolutions majeure amenée
avec l’arrivée de la microarchitecture Sandy Bridge.
advertised
Decoded Icache
1,5K uops
8ways set Direct Mapped
32sets
8ways/set
up to 6uops/way
4uops/Cy
uops cache build
(micro-fusion)
~4uops guarantee
Out-of Order
68 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




ITLB
4Ko page 128 entry
2-4Mo page 8 entry
ction
Unit
der
nst./Cy (typical ~4inst.)
usion)
st.
up to 4 Inst./Cy
Complex
Decode
MSROM
Microcode
Sequencer
ps
4uops/Cy
Instruction
Decoder Queue
Decoded ICache (Sandy Bridge)
Branch Prediction
Unit
advertised
Decoded Icache
1,5K uops
8ways set Direct Mapped
32sets
8ways/set
up to 6uops/way
4uops/Cy
Registers
Front End
Out-of Order Engine
Execution Core
• Le Decoded Icache est une mémoire
cache de uops de taille fixe déjà
décodées et donc remplie après
l’étage de décodage d’instruction.
Cette mémoire cache est enfouie
dans l’architecture du cœur. Il s’agit
d’une technologie proche du Trace
Cache du Pentium 4.
• Il faut savoir que sur un flow typique
d’instructions, ~80% des uops sont
issues de ce cache, ~15% du pipeline
hérité et ~5% du MSROM.
uops cache build
(micro-fusion)
tee
69 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Il existe plusieurs familles d’architectures capables d’exécuter
un flot d’instructions dans le désordre (out-of order). Les
architectures Intel (depuis le Pentium pro famille P6), les PowerPC de
IBM, les Cortex-A de ARM … effectuent ces mécanismes d’accélération
dans le CPU au niveau de l’étage d’exécution (après décodage).
D’autres architectures comme les CPU DSP C6000 de Texas
Instruments effectuent ces mécanismes à la compilation. L’avantages
étant d’avoir un CPU beaucoup plus simple mais un code out-of order
en mémoire contrairement aux architectures précédemment citées
qui possèdent un code in-order en mémoire et donc plus facile à lire
et à debugger pour le développeur.
70 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Prenons un exemple de code en assembleur C6000 de TI.
Observons ce même code non optimisé (in-order) et optimisé (out-of
order) :
Memory program in order
Memory program out-of order
; void function ( 16, 1 );
;function call 10cy
MOVKL
16, A4
;delayslot 0cy, parameter n°1
MOVKL
1, B4
;delayslot 0cy, parameter n°2
MOVKL
retAdd, B3
;delayslot 0cy, save return address
MOVKH
retAdd, B3
;delayslot 0cy, save return address
B
function
;delayslot 5cy, call function
NOP
5
; jump to function and return here after!
; void function ( 16, 1 );
;function call 6cy
B
function
;delayslot 5cy, call function
MOVKL
16, A4
;delayslot 0cy, parameter n°1
MOVKL
1, B4
;delayslot 0cy, parameter n°2
MOVKL
retAdd, B3
;delayslot 0cy, save return address
MOVKH
retAdd, B3
;delayslot 0cy, save return address
NOP
1
; jump to function and return here after!
71 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Etudions l’étage d’exécution dans le
Instruction Decoder Queue
désordre de micro-opérations (out~4 uops guarantee/Cy (out-of order)
of order engine) :
Allocate and Rename
Register Allocation Table
up to 4 uops/Cy
• unfused
• micro-fused
• macro-fused
Large set of
rename registers
• L’étage d’allocation et de
renommage est chargé d’allouer
des ressources au flot de uops
(registres temporaires
renommés). Cette unité travail
avec un très large jeu de
registres non accessibles au
développeur et enfouis dans
l’architecture du CPU (registres
entiers 160 entry, flottant 144
entry…)
72 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Rappelons l’exécution et le découpage en micro traitements
de l’instruction dpps précédemment rencontrée :
dpps
XMMi (i = 0 à 15 with Intel 64)
128bits General Purpose Registers
for SIMD Execution Units
0xF1, %xmm2,%xmm1
128
XMM1
96
a3
128
XMM2
Temp1
a2
96
x3
128
64
a1
64
x2
96
a3.x3
0
32
a0
x1
64
a2.x2
0
32
x0
0
32
a0.x0
a1.x1
32
a0.x0 + a1.x1
Temp2
32
0
a2.x2 + a3.x4
Temp3
32
Temp4
0
0
a0.x0 + a1.x1
+
a2.x2 + a3.x4
73 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
up to 4 uops/Cy
• unfused
• micro-fused
• macro-fused
Large set of
rename registers
Registers
Front End
Out-of Order Engine
Execution Core
• L’étage d’allocation et de
renommage peut également
exécuter puis retirer du pipeline
certaines instructions simples
ou idiomatiques :
 nop
 Zero idioms (sub reg,reg, xor
reg,reg …)
 …
74 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
Large set of
rename registers
up to 4 uops/Cy
• unfused
Retirement
• micro-fused
ReOrder Buffer (ROB)
• macro-fused
168 uops entry in-flight
Registers
Front End
Out-of Order Engine
Execution Core
• L’étage de retirement peut
supporter jusqu’à 168 uops en
vol. Cet étage est chargé de
retirer les uops de la file
d’attente après s’être assurer du
bon résultat suite au passage
dans l’étage d’exécution. L’unité
de retirement est également
chargée de capturer les défauts
et exceptions matérielles (stop
l’exécution des uops à la source
des défauts).
75 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Etudions l’étage d’exécution :
Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
Large set of
rename registers
up to 4 uops/Cy
• unfused
Retirement
• micro-fused
ReOrder Buffer (ROB)
• macro-fused
168 uops entry in-flight
Scheduler (54 uops entry)
port2 port3
port4
up to 6 uops
port0 port1 port5
• Le scheduler ou ordonnanceur
charge dans une fille d’attente
(jusqu’à 54 uops) les uops
prêtes à être exécutées jusqu’à
ce que les opérandes sources
soient également prêtes. Le
scheduler réparti alors les uops
vers les unités d’exécution
correspondantes (jusqu’à
6uops/cycle).
76 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
Large set of
rename registers
up to 4 uops/Cy
• unfused
Retirement
• micro-fused
ReOrder Buffer (ROB)
• macro-fused
168 uops entry in-flight
Scheduler (54 uops entry)
port2 port3
port4
port0 port1 port5
Registers
Front End
Out-of Order Engine
Execution Core
• L’étage d’exécutions possède
une architecture dîtes
superscalaire. Exécution de
plusieurs instructions sur un
même cycle CPU via plusieurs
unités d’exécutions. Observons
les familles de uops supportés
par chaque port :
up to 6 uops
4
0 1 5
0 1 5
0 1 5
AGU
AGU
Integer
Load
Store
Store
MMX
SSE
AVX low
x87
AVX high
2
3
(data)
(address)
128bits
128bits
128bits
Result Bus
Memory Order Buffer (MOB)
77 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Poursuivons l’étude de l’instruction dpps et de son passage
dans le pipeline matériel d’une architecture Sandy Bridge :
Instruction
dpps
Operands
uops
fused
xmm, xmm, imm8
4
xmm, m128, imm8
6
unfused uops
p0
p1
p5
p23
p4
1
2
1
-
-
Latency
Reciprocal
Throughput
12
2
Comments
SSE4.1
78 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Scheduler
port2 port3
port4
port0 port1 port5
4
0 1 5
0 1 5
0 1 5
AGU
AGU
Integer
Load
Store
(data)
MMX
SSE
AVX low
x87
AVX high
2
3
Store
(address)
128bits
128bits
Result Bus
128bits
Memory Order Buffer (MOB)
128bits
128bits
128bits
L1 Data Cache
DTLB
32Ko
8ways set associative
4Ko page 64 entry
2-4Mo page 32 entry
1Go page 4 entry
Registers
Front End
Out-of Order Engine
Execution Core
• Les unités d’exécutions AGU
(Address Generation Unit) sont
chargées de calculer des
adresses (modes d’adressage
complexes) puis d’aller sauver ou
chercher des données présentes
en mémoire cache donnée. Ce
sont les seules unités à posséder
un chemin d’accès vers la
mémoire donnée (jusqu’à
48o/cycle).
79 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Les instructions et donc uops désirant réaliser un accès à la
mémoire donnée amènent naturellement des latences. Les grandeurs
données sont optimales et ne tiennent pas compte d’éventuels cache
miss, défauts d’alignement, d’exceptions matérielles et de
l’hyperthreading (partage des unités d’exécution) :
Instruction
dpps
Operands
uops
fused
xmm, xmm, imm8
4
xmm, m128, imm8
6
unfused uops
Latency
Reciprocal
Throughput
p0
p1
p5
p23
p4
1
2
1
-
-
12
2
1
-
12
4
5
Comments
SSE4.1
80 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
A titre indicatif, observons les empreintes silicium de chacun
des étages ou entités précédemment présentées :
Sandy Bridge Core
Sandy Bridge General Purpose Processor
81 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
A titre indicatif, observons les empreintes silicium de chacun
des étages ou entités précédemment présentées :
Sandy Bridge Pipeline
Sandy Bridge Core
82 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Une avancée technologique mal reconnue à l’époque de sa
sortie en 2002 sur Pentium 4 mais néanmoins ré-implémenter depuis
2008 sur les architectures CoreiX et Atom est l’Hyper-Threading ou HT.
Observons le principe de cette technologie n’exigeant que 5% de
silicium supplémentaire mais pouvant dans certains cas améliorer les
performances de 30% :
Execution Unit instructions use
Execution Unit instructions use
Time
: Thread B
Multi Core superscalar’s CPU’s (without HT)
Time
: Thread A
Superscalar CPU (without HT)
83 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU




Registers
Front End
Out-of Order Engine
Execution Core
Un processeur supportant l’hyper-threading peut exécuter
jusqu’à 2 threads et est alors vu comme si il s’agissait de 2 CPU’s
distinct , nous parlons alors de CPU logique. Par exemple, pour un
Corei7 famille Sandy Bridge 4 cores, le système d’exploitation voit 8
cœurs :
Superscalar CPU (with HT)
: Thread A
: Thread B
Time
Execution Unit instructions use
84 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Observons les principales évolutions apportées avec la famille
Haswell (4ieme génération Core) parue Juin 2013 :
• Cache : L1D et L1I 64Ko 8-way associative, L2 1Mo 8-way
associative, L3 jusqu’à 32Mo 16-way associative
• Extensions jeu d’instructions : AVX2 et FMA3 (Fused Multiple-Add)
extension DSP au jeu d’instructions (Digital Signal Processing)
• Meilleure gestion d’énergie
• Accélérateur Graphique : support DirectX 11.1, OpenGL 4.0 et
OpenCL 1.2
85 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Evolutions du pipeline matériel sur famille Haswell :
86 – copyleft
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions




Registers
Front End
Out-of Order Engine
Execution Core
Evolutions du pipeline matériel sur famille Haswell :
87 – copyleft
Merci de votre attention !