Utilisateur:Poil/pipeline

Un article de Wikipédia, l'encyclopédie libre.

En architecture des ordinateurs, un pipeline est une technique de conception des processeurs où l'exécution des plusieurs instructions se chevauchent à l'intérieur même du processeur. Le premier ordinateur à utiliser cette technique est l'IBM Stretch, conçu en 1958.

[modifier] Exemple

Soit un microprocesseur où 4 cycle sont nécessaires pour accomplir une instruction :

  1. I.F (Instruction Fetch) charge l'instruction à exécuter depuis la mémoire.
  2. ALU (Arithmetic Logic Unit) exécute l'instruction.
  3. M.A (Memory Access), dénote un transfert depuis un registre vers la mémoire dans le cas d'une instruction du type STORE (accès en écriture) et de la mémoire vers un registre dans le cas d'un LOAD (accès en lecture).
  4. W.B (Write Back) stocke le résultat dans un registre.

En supposant que chaque étape met 1 cycle d'horloge pour s'exécuter, il faut normalement 4 cyles pour exécuter une instruction, 12 pour 3 instructions :

Séquençage des instructions dans un processeur sans pipeline. Il faut 9 cycles pour exécuter 3 instructions.
Séquençage des instructions dans un processeur sans pipeline. Il faut 9 cycles pour exécuter 3 instructions.
Séquençage des instructions dans un processeur doté d'un pipeline à 5 étages. Il faut 15 cycles pour exécuter 3 instructions. A t = 5, toutes les unités du processeurs sont sollicitées, et les 5 opérations ont lieu en même temps.
Séquençage des instructions dans un processeur doté d'un pipeline à 5 étages. Il faut 15 cycles pour exécuter 3 instructions. A t = 5, toutes les unités du processeurs sont sollicitées, et les 5 opérations ont lieu en même temps.
Séquençage des instructions dans un processeur superscalaire de degré 2. Il faut 9 cycles pour exécuter 10 instructions. A t = 5, toutes les unités du processeurs sont sollicitées.
Séquençage des instructions dans un processeur superscalaire de degré 2. Il faut 9 cycles pour exécuter 10 instructions. A t = 5, toutes les unités du processeurs sont sollicitées.
Le Pentium 4 d'Intel est superpipeliné avec un pipeline à 20 étages.
Le Pentium 4 d'Intel est superpipeliné avec un pipeline à 20 étages.
Une instruction vectorielle exécute la même opération sur toutes les données (vecteur) sur laquelle elle est appliquée.
Une instruction vectorielle exécute la même opération sur toutes les données (vecteur) sur laquelle elle est appliquée.
I.F ALU M.A W.B
1 2 3 4 I.F ALU M.A W.B
5 6 7 8 I.F ALU M.A W.B
9 10 11 12

Si on insére des registres tampons (pipeline registers) entre chaque étape, on fait chevaucher les exécutions de chaque cycle. Les 3 instructions s'exécuteront en 6 cycles, et le processeur sera capable de produire une instruction par cycle à partir du quatrième :

I.F ALU M.A W.B
1 I.F ALU M.A W.B
2 I.F ALU M.A W.B
3 I.F ALU M.A W.B
4 5 6 7

Au 4ème cycle, tous les étages sont en cours d'exécution.

Cette technique ne diminue pas le temps d'exécution d'une instruction, mais permet de multiplier le débit avec lequel elles sont exécutées par le processeur.

Aujourd'hui tous les microprocesseurs sont pipelinés :

Processeur Profondeur du pipeline
Intel Pentium 4 Prescott 31
Intel Pentium 4 20
Intel Pentium II 14
AMD Opteron 1xx 12
Intel Pentium III 10
IBM PowerPC 970 16
Sun UltraSPARC III et IV 14
Intel Itanium 8
MIPS R4400 8

[modifier] Problèmes

Les pipelines provoquent de nouveaux problèmes, en particulier d'interdépendance : par exemple une instruction ne peut récupérer le résultat de la précédente car celui-ci n'est pas encore disponible. Ainsi, la séquence :

ADD   R1, R2, R3  // R1 = R2 + R3
STORE R1, 1000    // C(1000) = R1

Ne stocke pas à l'emplacement mémoire 1000 la valeur de R1 contenant la somme R2 + R3, mais la valeur de R1 contenu avant l'instruction ADD.

Se pose le mème problème avec les sauts :

 MOV R1, #1000 // R1 = 1000
 JUMP R1       // Saut inconditionel

R1 ne contient pas encore la valeur 1000 au moment où l'instruction de saut va s'exécuter.

Une solution possible à ces deux problèmes est d'insérer une instruction entre les deux qui sont inter-dépendantes. Prenons par exemple la séquence suivante :

1: A = B + C
2: D = A + C
3: E = F + B

qui comporte une dépendance directe simple, A ne pouvant être disponible pour la partie droite de la seconde instruction.

  • la première solution, triviale, est d'insérer des NOP (No Operation), c'est ce que font les compilateurs quand on ne précise pas d'option d'optimisation du code :
 1: A = B + C
1b: NOP
 2: D = A + C
 3: E = F + B
  • la seconde solution consiste à réarranger les instructions. Dans cet exemple, l'operation de la troisième ligne n'a aucune interdépendance avec les deux précédentes. Le code modifié sera :
 1: A = B + C
 2: E = F + B
 3: D = A + C
Autres langues