Date post: | 03-Apr-2015 |
Category: |
Documents |
Upload: | theophile-metais |
View: | 112 times |
Download: | 3 times |
CENTRAL PROCESSING UNIT
Hugo Descoubes - Juin 2013
Architecture et Technologie des Ordinateurs
CPU
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Tout CPU effectue séquentiellement les traitements présentés ci-dessous :
2 – copyleft
FETCH
• 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 )
DECODE
EXECUTE
WRITEBACK
CPU
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.
3 – copyleft
FetchDecodeExecute
Writeback
Program Memory
11000010011100111100011011101000011000111000101…
CPU
PC
1 level Hardware Pipeline
0000110 111 011 111
PC
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
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.
CPU
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.
4 – copyleft
Fetch
Program Memory
11000010011100110001110001110001100001110001011…
1100001001110001
Decode 0011000111000101
CPU
Execute 1110001 101 110 100
Writeback 0000110 111 011 111
PC
PC Program Counter
4 levels Hardware Pipeline
OpcodeManipulation
Sources OperandsManipulation
Dest. OperandManipulation
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
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.
CPU
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
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
http://www.intel.com
CPU
6 – copyleft
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é :
Mnemonic Syntax 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 STR regSrc, address Sauvegarde une donnée contenu dans un regsitre vers la mémoire STR R1, addData 101 r aaa u
Glossary : r=registre a=address u=unused k=constant R1=register R2=register addInst=Program memory address addData=Data memory address
CPU
7 – copyleft
Implémentation assembleur du langage C ci-dessous :
char value=3, saveValue;
void main (void) {while (1) { value += 2; saveValue =
value;}
}
Programme en C
0x0 main : LOAD &value, R2 010000100x1 MOVK 2, R1 100010000x2 ADD R1, R2, R1 000010000x3 STR R1, &value 101000000x4 LOAD &value, R2 010000100x5 STR R2, &saveValue 101100100x6 JMP main 001000000x7 undefineduuuuuuuu0x8 undefineduuuuuuuu… … …0xF undefineduuuuuuuu
Programme assembleur
Program Address Mnemonic operands Binary
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
Glossary : R1=0R2=1
&value=0x0
&saveValue=0x1
CPU
8 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
PC = 0x0
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
Etudions l’évolution de notre programme assembleur ainsi que le travail du CPU
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
9 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x1
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
• Démarrage application
• Cycle n°1 : Fetch instruction adresse 0x0, modification PC (Program Counter)
01000010
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
10 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x2
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
• Cycle n°2 : Fetch instruction adresse 0x1, décodage instruction précédemment fetchée, modification PC
10001000
01000010
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
11 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x3
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
• Cycle n°3 : Fetch instruction adresse 0x2, modification PC (Program Counter), exécution LOAD
10001000
01000010
00001000
00000011
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
12 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x4
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
10001000
00001000
0000001100000010
10100000
• Cycle n°4 : Fetch instruction adresse 0x3, modification PC (Program Counter), exécution MOVK
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
13 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x5
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2
00001000
0000001100000101
10100000
• Cycle n°5 : Fetch instruction adresse 0x4, modification PC (Program Counter), exécution ADD
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000000110x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
01000010
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
14 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x6
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000001100000101
10100000
• Cycle n°6 : Fetch instruction adresse 0x5, modification PC (Program Counter), exécution STR
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
01000010
10110010
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
15 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x7
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°7 : Fetch instruction adresse 0x6, modification PC (Program Counter), exécution LOAD
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 uuuuuuuu0x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
01000010
10110010
00100000
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
16 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x8
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°8 : Fetch instruction adresse 0x7, modification PC (Program Counter), exécution STR
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 000001010x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
10110010
00100000
uuuuuuuu
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
17 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x0
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°9 : Fetch instruction adresse 0x8, modification PC=0x0 (Program Counter), exécution JMP
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 000001010x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
00100000
uuuuuuuu
uuuuuuuu
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
18 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x1
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°10 : Fetch instruction adresse 0x0, modification PC (Program Counter), aucune instruction exécutée
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 000001010x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
uuuuuuuu
01000010
uuuuuuuu
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
19 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x2
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°11 : Fetch instruction adresse 0x1, modification PC (Program Counter), aucune instruction exécutée
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 000001010x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
01000010
10001000
uuuuuuuu
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
20 – copyleft
Fetch stage
Instruction Bus
Decode stage
Execution Unit
PC = 0x3
8 4ProgramAddress Bus
MUX
3
DataAddressBus
8DataBus
CPU
Address Binary
Address Binary
R1 R2 0000010100000101
• Cycle n°12 : Fetch instruction adresse 0x2, modification PC (Program Counter), exécution LOAD
main : LOAD &value, R2MOVK 2, R1ADD R1, R2, R1STR R1, &valueLOAD &value, R2STR R2, &saveValueJMP main
0x0 010000100x1 100010000x2 000010000x3 101000000x4 010000100x5 101100100x6 001000000x7 uuuuuuuu0x8 uuuuuuuu… …
0x0 000001010x1 000001010x2 uuuuuuuu0x3 uuuuuuuu0x4 uuuuuuuu0x5 uuuuuuuu0x6 uuuuuuuu0x7 uuuuuuuu
Prog
ram
Mem
ory
Dat
a M
emor
y
01000010
10001000
00001000
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
21 – copyleft
Etc …
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions
CPU
22 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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.
Instruction DataBus
Program&
DataMemory
Unified
CPU
CPU
23 – copyleft
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).
CPU
24 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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.
DataBus
Instruction Bus
CPUProgramMemory
DataMemory
CPU
25 – copyleft
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 …
CPU
26 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 …
Harvard
Data Bus
Instruction Bus
L1DController
CPU
L1PController
CacheL2
Unified
L2Controller
Main Memory
Unifiedor
L3 CacheUnified(shared)
Von Neumann
Cache L1DSeparated
Cache L1PSeparated
CPU
27 – copyleft
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 :
CPU
28 – copyleft
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 mono-core) et dans les registres internes du CPU.
CPU
29 – copyleft
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
CPU
30 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
Dr J. Y. Haggège
• 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).
CPU
31 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
Dr J. Y. Haggège
• 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.
CPU
32 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
Dr J. Y. Haggège
• 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.
CPU
33 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
Dr J. Y. Haggège
• 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) …
CPU
34 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
AAA ASCII adjust AL after addition
AAD ASCII adjust AX before division
AAM ASCII adjust AX after multiplication
AAS ASCII adjust AL after subtraction
ADC Add with carry
ADD Add
AND Logical AND
CALL Call procedure
CBW Convert byte to word
CLC Clear carry flag
CLD Clear direction flag
CLI Clear interrupt flag
CMC Complement carry flag
CMP Compare operands
CMPSB Compare bytes in memory
CMPSW Compare words
CWD Convert word to doubleword
DAA Decimal adjust AL after addition
DAS Decimal adjust AL after subtraction
DEC Decrement by 1
DIV Unsigned divide
ESC Used with floating-point unit
HLT Enter halt state
IDIV Signed divide
IMUL Signed multiply
IN Input from port
INC Increment by 1
INT Call to interrupt
INTO Call to interrupt if overflow
IRET Return from interrupt
Jcc Jump if condition
JMP Jump
LAHF Load flags into AH register
LDS Load pointer using DS
LEA Load Effective Address
LES Load ES with pointer
LOCK Assert BUS LOCK# signal
LODSB Load string byte
LODSW Load string word
LOOP/LOOPx Loop control
MOV Move
MOVSB Move byte from string to string
MOVSW Move word from string to string
MUL Unsigned multiply
Orig
inal
808
6 In
stru
ction
set
CPU
35 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Architecture matérielle jeu d’instruction
NEG Two's complement negation
NOP No operation
NOT Negate the operand, logical NOT
OR Logical OR
OUT Output to port
POP Pop data from stack
POPF Pop data from flags register
PUSH Push data onto stack
PUSHF Push flags onto stack
RCL Rotate left (with carry)
RCR Rotate right (with carry)
REPxx Repeat MOVS/STOS/CMPS/LODS/SCAS
RET Return from procedure
RETN Return from near procedure
RETF Return from far procedure
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
SCASB Compare byte string
SCASW Compare word string
SHL Shift left (unsigned shift left)
SHR Shift right (unsigned shift right)
STC Set carry flag
STD Set direction flag
STI Set interrupt flag
STOSB Store byte in string
STOSW Store word in string
SUB Subtraction
TEST Logical compare (AND)
WAIT Wait until not busy
XCHG Exchange data
XLAT Table look-up translation
XOR Exclusive OR
Orig
inal
808
6 In
stru
ction
set
CPU
36 – copyleft
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
CPU
37 – copyleft
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.
CPU
38 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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.
• Adressage immédiat : affectation d’une constante dans un registre. Le déplacement d’une constante vers la mémoire est également possible.
mov %ax, %bx
mov $0x1A2F, %bx
CPU
39 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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.
mov (0x000F), %bl
64Ko
0
0xFFFF
0x0000
1o
0x000F
…
…
Dat
a M
emor
y
CPU
40 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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.
• 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).
mov $0x000F, %bxmov (%bx), %al
64Ko
0
0xFFFF
0x0000
1o
0x000F
…
…
Dat
a M
emor
y
movb %bl, %al ;déplacement 1omovw %bx, %ax ;déplacement 2omovl %ebx, %eax ;déplacement 4o
;(non supporté sur 8086)
CPU
41 – copyleft
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.
CPU
42 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 :
• Instructions logique : manipulation bit à bit de données :
movb $14,%al ; al=0x0E (4cy)movb $2,%bl ; bl=0x02 (4cy)add %bl,%al ; al=0x10 (3cy)mul %bl ; ax=0x0020 (70-77cy)div %bl ; al=0x10 (quotient)
; bl=0x00 (reste) ; (80-90cy)
sub %bl,%al ; al=0x10 (3cy)
movb $15,%al ; al=0x0F (4cy)movb $0x01,%bl ; bl=0x01 (4cy)and $0xFE,%al ; al=0x0E (4cy)or %bl,%al ; al=0x0F (3cy)not %al ; al=0xF0 (3cy)
; Complément à 1 shl $1,%al ; al=0xE0 (2cy)
; flag carry C=1
CPU
43 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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
CPU
44 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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;
void main (void) {
while (1) { if ( varTest == 0 ) { // user code if } else { // user code else } }}
main: mov (addressVarTest),%al ; al=0x00 (+8cy)mov 0,%bl ; bl=0x00 (4cy)cmp %bl,%al ; (3cy), flag Z=1jz if1 ; IP = addresse if1
; (16cy jump, 4cy no jump)else1: ; user code else
;…;…;…jmp endif1 ; IP = addresse endif1 (15cy)
if1: ; user code if;…;…;…
endif1: jmp main ; IP = addresse main (15cy)
CPU
45 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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);
void main (void) {
while (1) { fctTest(); }}
void fctTest (void) { // user code}
main: call fctTest ; IP = adresse fctTest (19cy relatif)jmp main ; IP = adresse main (15cy);other code;…;…
fctTest: ; user code;…;…;…ret ; IP = adresse jmp dans le main
; (16-20cy)
CPU
46 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Observons les principales évolutions des architectures x86-64 du 8086 jusqu’à l’architecture Sandy Bridge :
CPUArchitecture
Année Espace d’adressageLinéaire/physique
Principales évolutions
8086 197816bits (logical)/20bits (phys.)
Jeu d’instruction x86 original, segmentation mémoire
801861982
Accélération matérielle (calcul d’adresses, multiplication ,division …)
80286 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
80386 1985
32bits (logical)/46bits (linear)/32bits (phys.)
Jeu d’instruction 32bits (IA-32), MMU avec unité de Pagination
80486 1989 Pipeline RISC-like, mémoire cache intégrée et FPU (Floating Point Unit)
Pentium 1993 Processeur superscalaire (exécution plusieurs instructions par cycle CPU via plusieurs unités d’exécution), extension MMX
Pentium pro(P6)
1995
32bits (logical)/46bits (linear)/36bits (phys.) via PAE
Cache L2 intégré, PAE 4bits (Physical Address Extension), translation micro-instructions (uop), exécution out-of order, exécution spéculative (register renaming)
Pentium IIPentium III
1997 Cache L3 intégré, extension SSE (instructions SIMD)
Extension SSE2 , Hyper-Threading, pipeline profond, uop cache (Trace Cache)Pentium 4 2000
CPU
47 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Observons les principales évolutions des architectures x86-64 du 8086 jusqu’à l’architecture Sandy Bridge :
CPUArchitecture
Année Espace d’adressageLinéaire/physique
Principales évolutions
Pentium 4Prescott
2004Cf. CPUID
Jeu d’instruction x64 (Intel 64), extension SSE3
Core 2 2006 Multi-cœurs, extension SSE4 (Penryn), faible consommation
Atom 2008 Cf. CPUIDSur ma machine Intel 64 famille Sandy Bridge sous Linux 48bits (linear-virtual)/36bits (phys.)
Très faible consommation, exécution in-order (marchés laptop et mobile)
Corei7Nehalem
2008 3 niveaux de cache intégrés, bus QPI (remplaçant FSB vers chipet), extension pour cryptage AES
Sandy BridgeIvy Bridge
2011 Extension SSE5 et AVX, GPU, advanced uop cache
CPU
48 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Rappelons les registres rencontrés sur architecture 8086 de Intel :
Dr J. Y. Haggège
CPU
49 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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) :
64bits 32 16 8RiX
EiXiX
iH iL
General Purpose Registers (i = A, B, C, D)
Depuis 8086 architecture
Depuis 80386 architecture (E = Extended)
Depuis Intel 64 architecture (64bits mode-only)
General Purpose Registers for Floating Point Unit : x87 and MMX extensions (i = 0 to 7)
Depuis 80486 architecture (x87 extension)
80bits 64bits
STi
MMXi Depuis Pentium MMX architecture
CPU
50 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
256bits 128bitsYMMi
XMMi
General Purpose Registers for SIMD Execution Units (SSE extensions) (i = 0 à 7 with Pentium III SSE )
(i = 0 à 15 with Intel 64)
Depuis Pentium III architecture (SSE extension)
Depuis Sandy Bridge architecture (AVX extension)
64bits 32 16 8
Ri
RiD
RiX
RiB
64bits mode-only General Purpose Registers (i = 8 to 15)
Depuis Intel 64 architecture (64bits mode-only)
CPU
51 – copyleft
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 :
CPU
52 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
64bits 32 16 8RiP
EiPiP
iPL
Pointer Registers (i = S and B)
Registres pour la manipulation de pointeurs (SP, BP, SI, DI et xS) :
16bits
iS
Segment Registers (i = C, D, S, E, F and G)
(64bits mode-only)
64bits 32 16 8
RiI
EiI
iI
iIL
Index Registers (i = S and D)
(64bits mode-only)
Depuis 8086 architecture
Depuis 8086 architecture
CPU
53 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
64bits 32 16 8RIP
EIPIP
Instruction Pointer Register
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 …
Depuis 8086 architecture
CPU
54 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Environnements d’exécution en modes 32bits et 64bits :
http://www.intel.com
CPU
55 – copyleft
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.
CPU
56 – copyleft
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 :
http://www.intel.com
Front End
Out-of Order Engine
Execution Core
Cache Hierarchy
CPU
57 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB 4Ko page 128 entry2-4Mo page 8 entry
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).
CPU
58 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
Branch PredictionUnit
• 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).
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
CPU
59 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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.
• 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).
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
CPU
60 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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.
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Inst. bubble Inst. Inst. Inst. bubble
Inst. bubble Inst. Inst. Inst. Inst.
Inst. Inst. bubble bubble bubble bubble
Inst
ructi
on Q
ueue
CPU
61 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Inst. bubble Inst. Inst. Inst. bubble
Inst. bubble Inst. Inst. Inst. Inst.
Inst. Inst. bubble bubble bubble bubble
Macro-fusedIn
stru
ction
Que
ue
CPU
62 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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
• Par exemple, lorsque Intel introduisit l’extension SSE2 avec le Pentium4, chaque instruction sur 128bits était découpée en 2 uops de 64bits.
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
CPU
63 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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.
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
MSROMMicrocodeSequencer
4uops/Cy
CPU
64 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• Le flot d’instruction est alors acheminé vers une nouvelle file d’attente dont le travail principal est de combler les ‘’bulles’’ rencontrées dans les étages précédents afin d’assurer un flot dans le désordre quasi constant de 4uops (out-of order).
• Certains mécanismes d’accélération sont insérés à cette étape. Etudions les principaux.
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
MSROMMicrocodeSequencer
4uops/Cy
~4uops guarantee
Instruction Decoder Queue
(micro-fusion)
CPU
65 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• Le Loop Stream Detector (LSD) permet de détecter et de verrouiller les petites boucles (< 18 instructions) et évitent donc notamment des phases de fetch et de décodage inutiles. La boucle est invalidée par l’unité de prédiction dès qu’une prédiction manquée est détectée (miss-prediction).
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
MSROMMicrocodeSequencer
4uops/Cy
~4uops guarantee
Instruction Decoder Queue
(micro-fusion)
Loop Stream Detector up to 28uops
CPU
66 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• 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
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
MSROMMicrocodeSequencer
4uops/Cy
~4uops guarantee
Instruction Decoder Queue
(micro-fusion)
Loop Stream Detector up to 28uops
CPU
67 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 Operands uopsfused
unfused uops Latency ReciprocalThroughput
Comments
p0 p1 p5 p23 p4
dppsxmm, xmm, imm8 4
SSE4.1xmm, m128, imm8 6
CPU
68 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
L1 ICache32Ko
8ways set associative
ITLB4Ko page 128 entry2-4Mo page 8 entry
16o aligned/Cy128bits
InstructionFetch Unit
Branch PredictionUnit
• Le Decoded Icache est l’une des évolutions majeure amenée avec l’arrivée de la micro-architecture Sandy Bridge.
Lega
cy D
ecod
e Pi
pelin
e (N
ehal
em)
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
1 Inst.
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. 1 Inst. 1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
SimpleDecode
SimpleDecode
SimpleDecode
1uop 1uop 1uop 4uops
MSROMMicrocodeSequencer
4uops/Cy
~4uops guaranteeOut-of Order
Instruction Decoder Queue
(micro-fusion)
Loop Stream Detector up to 28uops
Decoded Icache1,5K uops
8ways set Direct Mapped
32sets8ways/set
up to 6uops/way
Dec
oded
ICac
he (S
andy
Brid
ge)
4uops/Cy
uops cache build
advertised
CPU
69 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
ITLB4Ko page 128 entry2-4Mo page 8 entry
InstructionFetch Unit
Branch PredictionUnit
• 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.
Instruction PreDecoder16o
up to 6 inst./Cy (typical ~4inst.)
Instruction Queue18++ Instructions (macro-fusion)
1 Inst. up to 4 Inst./Cy
Instruction DecoderComplexDecode
4uops
MSROMMicrocodeSequencer
4uops/Cy
~4uops guarantee
Instruction Decoder Queue
(micro-fusion)
Decoded Icache1,5K uops
8ways set Direct Mapped
32sets8ways/set
up to 6uops/way
Dec
oded
ICac
he (S
andy
Brid
ge)
4uops/Cy
uops cache build
advertised
CPU
70 – copyleft
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.
CPU
71 – copyleft
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) :
; void function ( 16, 1 ); ;function call 10cyMOVKL 16, A4 ;delayslot 0cy, parameter n°1MOVKL 1, B4 ;delayslot 0cy, parameter n°2MOVKL retAdd, B3 ;delayslot 0cy, save return addressMOVKH retAdd, B3 ;delayslot 0cy, save return addressB function ;delayslot 5cy, call functionNOP 5; jump to function and return here after!
Memory program in order
; void function ( 16, 1 ); ;function call 6cyB function ;delayslot 5cy, call functionMOVKL 16, A4 ;delayslot 0cy, parameter n°1MOVKL 1, B4 ;delayslot 0cy, parameter n°2MOVKL retAdd, B3 ;delayslot 0cy, save return addressMOVKH retAdd, B3 ;delayslot 0cy, save return addressNOP 1; jump to function and return here after!
Memory program out-of order
CPU
72 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Etudions l’étage d’exécution dans le désordre de micro-opérations (out-of order engine) :
• 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…)
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• micro-fused• macro-fused
CPU
73 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 :
a3 a2 a1 a0
XMMi (i = 0 à 15 with Intel 64)128bits General Purpose Registers
for SIMD Execution Units0326496128
XMM1
x3 x2 x1 x00326496128
XMM2
dpps 0xF1, %xmm2,%xmm1
0326496128
Temp1 a0.x0a1.x1a2.x2a3.x3
032
Temp2a0.x0 + a1.x1
032
Temp3a2.x2 + a3.x4
032
Temp4a0.x0 + a1.x1
+a2.x2 + a3.x4
CPU
74 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 …) …
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• micro-fused• macro-fused
CPU
75 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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).
Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
RetirementReOrder Buffer (ROB)168 uops entry in-flight
Large set of rename registers
up to 4 uops/Cy • unfused• micro-fused• macro-fused
CPU
76 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Etudions l’étage d’exécution :
• 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).
Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
RetirementReOrder Buffer (ROB)168 uops entry in-flight
Large set of rename registers
up to 4 uops/Cy • unfused• micro-fused• macro-fused
Scheduler (54 uops entry)port2 port3 port4 port0 port1 port5
up to 6 uops
CPU
77 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 :
Instruction Decoder Queue
~4 uops guarantee/Cy (out-of order)
Allocate and Rename
Register Allocation Table
RetirementReOrder Buffer (ROB)168 uops entry in-flight
Large set of rename registers
up to 4 uops/Cy • unfused• micro-fused• macro-fused
Scheduler (54 uops entry)port2 port3 port4 port0 port1 port5
AGULoadStore
(address)
AGUStore(data)
2 3 4
Integer0 1 5
MMXSSE
AVX low
0 1 5
x87AVX high
0 1 5
Result Bus128bits128bits 128bits
up to 6 uops
Memory Order Buffer (MOB)
CPU
78 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 Operands uopsfused
unfused uops Latency ReciprocalThroughput
Comments
p0 p1 p5 p23 p4
dppsxmm, xmm, imm8 4 1 2 1 - - 12 2
SSE4.1xmm, m128, imm8 6
CPU
79 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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).
Schedulerport2 port3 port4 port0 port1 port5
AGULoadStore
(address)
AGUStore(data)
2 3 4
Integer0 1 5
MMXSSE
AVX low
0 1 5
x87AVX high
0 1 5
Memory Order Buffer (MOB)
Result Bus128bits
L1 Data Cache32Ko
8ways set associative
DTLB4Ko page 64 entry2-4Mo page 32 entry1Go page 4 entry
128bits128bits128bits
128bits 128bits
CPU
80 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 Operands uopsfused
unfused uops Latency ReciprocalThroughput
Comments
p0 p1 p5 p23 p4
dppsxmm, xmm, imm8 4 1 2 1 - - 12 2
SSE4.1xmm, m128, imm8 6 5 1 - 12 4
CPU
81 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Sandy Bridge General Purpose Processor
Sandy Bridge Core
A titre indicatif, observons les empreintes silicium de chacun des étages ou entités précédemment présentées :
CPU
82 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions Registers Front End Out-of Order Engine Execution Core
Sandy Bridge Core
A titre indicatif, observons les empreintes silicium de chacun des étages ou entités précédemment présentées :
Sand
y Br
idge
Pip
elin
e
CPU
83 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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% :
: Thread A
: Thread B
Superscalar CPU (without HT) Multi Core superscalar’s CPU’s (without HT)Execution Unit instructions use
Tim
e
Tim
eExecution Unit instructions use
CPU
84 – copyleft
Introduction – CPU élémentaire – Architectures CPU – Intel 8086 – Evolutions 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 :
: Thread A
: Thread B
Superscalar CPU (with HT)Execution Unit instructions use
Tim
e
CPU
85 – copyleft
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
CPU
86 – copyleft
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 :
CPU
87 – copyleft
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 :
Merci de votre attention !