Ce site utilise des animations réalisées avec la technologie Flash. Si vous ne possédez pas le petit programme permettant de lire ce format, les animations de cette page seront inactives et ce sera bien dommage. Vous pouvez néanmoins télécharger ce petit logiciel en vous connectant ici. La procédure est indolore, rapide et gratuite. Pourquoi s'en priver, je vous le demande ?

Dernière mise à jour - 29 octobre 2004

 Fonctionnement standard d'un processeur.

Nous avons fait connaissance avec "i4", brave petite puce laborieuse et méritante quoique un tantinet glandeuse. En effet, archétype du processeur séquentiel, i4 se contentait d'exécuter ses instructions une par une, sans précipitation ni zèle empressé.
Bref, i4 avait deux vitesses: lent et encore plus lent.

Et puis un soir de solitude quelque part dans la Vallée du Silicone, après avoir avalé son Cheese Burger et son Prozac, un ingénieur informaticien limace jusqu'à son canapé, juste histoire de trouver le sommeil devant le Ciné-Club de minuit. A l'occasion du cycle Chaplin, on repasse "Les Temps Modernes" !
Et l'ingénieur pâteux, vif comme une souche, contemple Charlot serrer frénétiquement ses boulons. Et puis soudain, venu d'on-ne-sait-où, l'éclair du Génie tombe, fracassant, sur le plaid plucheux grouillant de chips. L'oeil légumineux s'allume, la pupille se dilate, la bouche s'entr'ouvre lentement...
"Tiens ! M'prendrais bien une Bud..."
 
L'alcool est un naufrage...
Quelques années plus tard, un ingénieur abstème profitera, lui, de la énième rediffusion du chef-d'oeuvre pour inventer le "pipeline d'exécution", procédé révolutionnaire qui équipera dès lors tous nos ordinateurs domestiques.
 

 

Dépendances
Etage du pipeline
Parallélisme par anticipation
Pipeline d'exécution
Purge de pipeline

 

Il était une fois la Révolution

De la puce-artisane...

Les premiers processeurs grand public se caractérisaient par une méthode de travail très "artisanale" car basée sur une logique séquentielle.
Pour ces derniers, en effet, les instructions se trouvaient exécutées l'une après l'autre, chaque exécution réclamant un nombre variable de cycles d'horloge.
 

   

Nous avons vu i4 en plein travail et avons découvert à cette occasion comment un processeur de son espèce procédait à l'exécution d'une instruction. Pour rappel, ce processus débutait par une suite d'allers-et-retours en mémoire afin de rassembler l'instruction et son (ses) éventuel(s) opérande(s) puis se poursuivait par l'exécution de l'instruction proprement dite pour se terminer par la mise à jour des registres de la puce ou d'une adresse en mémoire.
 

   Vous n'avez abolument rien bité de tout ce charabia ci-contre ?
i4 va vous faire un petit dessin...
 

Ainsi, pour ces vénérables processeurs-ci, un cycle d'exécution pouvait être décomposé en trois phases successives:

  • Une phase de lecture en mémoire (que nous noterons "LEC") de l'instruction et de ses éventuels opérandes
     
  • Une phase d'exécution de l'instruction ("EXE") proprement dite
     
  • Une phase de mise à jour en mémoire ("MAJ") des éventuels résultats générés

Ceci dit, nous pourrions alors illustrer très schématiquement le fonctionnement d'un processeur de type séquentiel:

 

   

 

 

 Fonctionnement d'un processeur de type séquentiel

Pour ce type de processeurs, chaque instruction est exécutée une à la fois, en passant successivement par tous les stades du cycle d'exécution

 

Ce cheminement obligatoire des instructions par chacun de ces stades implique bien évidemment que chaque instruction réclamait plusieurs cycles d'horloge pour être exécutée.
Néanmoins, les incessants progrès technologiques permirent peu à peu d'abaisser le nombre moyen de cycles d'horloge nécessaire à l'exécution des instructions.

Ainsi, le processeur 8086 de Intel nécessitait en moyenne 12 cycles d'horloge pour exécuter une instruction, mais avec le 80286, cette moyenne chutait à 4,5 cycles par instruction.


 

   Le 8086, le 80286: petite visite à l'hospuce...  

... A la puce-ouvrière

My Taylor 

Frederick Winslow Taylor [1859-1915] est ce qu'on peut appeler un obsédé du rendement, un monomaniaque de la productivité, un fétichiste du chronomètre.
Sans Monsieur Taylor et sans ses travaux de "sociologie industrielle", pas de Ford T, pas de machines-outils, pas de société de consommation, et donc, ni Elvis, ni BigMac et ni PC (la machine, pas le parti ! ...quoique...)

Bref, un monde de larmes et de ténèbres...
 

 

 Frederick Winslow Taylor

L'homme sans qui Marc et Arlette ne seraient rien...

 

En deux mots, le taylorisme, c'est "l'Organisation Scientifique du Travail", la traque et l'élimination des gestes inutiles, la quête éperdue du rendement.
La théorie se matérialise très concrètement par une chaîne de montage; un premier ouvrier place un écrou sur une pièce, un deuxième ouvrier le visse et un troisième vérifie que les deux premiers ont bien travaillé. Et bis repeta, ad lib...
Les ouvriers ont bien une légère tendance à devenir complètement dingues, mais chacune des soixante secondes de chaque minute est mise à profit, et le prix de la pièce usinée se trouve ainsi suffisamment abaissée pour que lesdits ouvriers puissent se l'offrir sans trop s'endetter, quittes à n'en avoir aucun besoin.
Il est beau, il est beau, il est beau mon rêve américain !

 

  Frédérick Taylor avait l'habitude d'uriner tous les jours à 7h23 et 19h07, c'est-à-dire en dehors de ses heures de travail...  
Pourquoi cette digression ? Parce que quoique les processeurs séquentiels donnassent entière satisfaction, n'importe quel tayloriste, même amateur, eût vite constaté que lorsqu'une instruction se trouvait à un stade de son cycle d'exécution, les stades situés en amont et en aval demeuraient désespérement inactifs.
 
  ... situation de nature à chagriner n'importe quel ingénieur, surtout de culture nord-américaine...  

Et c'est là que Charlot intervient ! En appliquant au processeur le très tayloriste concept de "travail à la chaîne", le rendement de la puce se trouve d'un coup démultiplié:

 

   

 

 

 Fonctionnement d'un processeur dit "à pipeline d'exécution"

Chaque instruction n'attend plus l'exécution de l'instruction précédente pour débuter son propre cycle d'exécution. Les différents cycles se chevauchent, avec pour conséquence que tous les stades se trouvent simultanément actifs

 

Vivent les cadences infernales !
My Taylor is speed...

 

 

   

Le pipeline d'exécution

Entrez dans la lumière (du pipeline)

Comme nous venons de la voir, un processeur à pipeline d'exécution est tout simplement une puce fonctionnant sur le très mécanique principe de la chaîne de montage.
 

  ...comme un insecte fou...  

Le principe reste effectivement le même, à savoir diviser le processus d'exécution des instructions en un nombre donné d'étapes fonctionnellement indépendantes.
A chacune de ces étapes correspond un "poste de travail" chargé d'une tâche bien définie et qui constitue alors un étage du pipeline.
 

   Cette indépendance des différents étages du pipeline est théoriquement essentielle quoique rarement respectée  

L'indépendance des différents étages du pipeline permet au processeur de traiter plusieurs instructions simultanément, chacune d'entre elles se trouvant à un stade différent du cycle d'exécution.
Les gens bien appellent ce procédé de recouvrement des tâches parallélisme par anticipation.

Il est facile de comprendre qu'un processeur à pipeline réclame une architecture bien plus complexe qu'un processeur séquentiel, de par les contraintes inhérentes à son mode de fonctionnement: synchronisation entre les différents étages, processus de contrôle, accès partagés aux unités fonctionnelles...
De même, la complexité du pipeline sera d'autant plus poussée que son nombre d'étages sera grand.
 

  ...ou "chevauchement de lecture" ou encore "préchargement d'instructions"  

Autre facteur d'efficacité: dans l'idéal, les différents étages du pipeline devront réclamer le même délai pour être traversés afin de rendre le flux des instructions le plus fluide possible. En effet, il est facile de comprendre que le "débit" d'un pipeline sera directement lié à son étage le plus "lent".


 

   

Le pipeline du 80486: un tube de légende !

En +34 après Bill Gates (1989 donc), Monsieur Intel sort son processeur 80486. La bête est séduisante et se trouve être la première puce "grand public" conçue sur le révolutionnaire principe du pipelining.
 

 

 Flash back sur le 80486

 

Très pratiquement, le pipeline du 80486 est divisé en cinq étages successifs et fonctionnellement (quasi) indépendants:

  • Etage PREFETCH (PF) correspondant à la lecture de l'instruction depuis la mémoire
     
  • Etage DECODE-1 (D1) se chargeant du décodage de l'opcode de l'instruction et de son (ses) éventuel(s) opérandes
     
  • Etage DECODE-2 (D2) terminant le décodage proprement dit en convertissant l'instruction en signaux de contrôle
     
  • Etage EXECUTE (EX) correspondant à l'exécution proprement dite de l'instruction (calcul, transferts, comparaisons...)
     
  • Etage WRITE-BACK (WB) au cours duquel sont mis à jour les différents registres et, éventuellement, la mémoire

... chacun de ces stades nécessitant un ou deux cycles d'horloge.

 

   

Bien évidemment, le nombre d'étages du pipeline n'est pas limité à cinq. Comme nous allons le voir, l'augmentation de ce nombre d'étages est d'ailleurs une évolution majeure des processeurs ultérieurs, et ce pour une raison très mathématique que nous allons voir de ce pas (si, si... nous insistons)

Pour exemples, le processeur Athlon XP dispose d'un pipeline à 10 étages, le Pentium 4 d'un pipeline à 20 (!) étages


 

   

Le pipeline, un bon tuyau ?

A vue de nez, le principe du pipeline d'exécution semble être somme toute assez efficace. Mais dans quelle mesure ?
Petite démonstration mathématique en bonne et due forme, avec des inconnues et tout et tout...
 

   

Considérons deux processeurs dont le point commun est d'exécuter, en moyenne, une instruction en K cycles d'horloge. Le premier est un processeur séquentiel classique (type i4), et le second un processeur à pipeline d'exécution à K étages.
Bien. Comparons maintenant les deux machines, comme dans une bête publicité pour une lessive...

 

  ... chaque étage nécessitant un cycle d'horloge  

 

Processeur séquentiel
Processeur à pipeline
Caractéristique
K cycles d'horloge par instruction
Pipeline à K étages
Temps nécessaire à l'exécution de la première instruction de la séquence (en cycles d'horloge)
K
K
Temps nécessaire à l'exécution de chaque instruction supplémentaire (en cycles d'horloge)
K
1
Temps nécessaire à l'exécution d'une séquence de N instructions (en cycles d'horloge)
N.K
K + (N-1)

 

 

 Comparaison des performances d'un processeur séquentiel et d'un processeur à pipeline

 

Petite explicitation pour ceux qui viennent de se lever ou qui ne sont pas encore couchés: Au coeur d'un processeur pipeliné, quand la première instruction s'apprête à quitter le pipeline (c'est-à-dire le dernier étage), l'instruction qui lui succède est déjà à l'avant-dernier stade du cycle d'exécution. Il ne lui faudra donc qu'un petit cycle pour traverser le dernier étage et quitter à son tour le pipeline.
Idem le même pour l'instruction qui lui succède.
 

  ...et ce, jusqu'au prochain crash de Windows...  

Par un habile rapport mathématique [NK / (K+N-1)], nous pouvons mesurer l'efficacité comparée des deux méthodes de fonctionnement et constater, ébahis, que lorsque N est suffisamment grand (ce qui est le cas de tout programme un tant soit peu utile), ce rapport est voisin de K.

La conclusion est immédiate et ébaubiante: le gain de temps procuré par un processeur à pipeline est directement proportionnel à son nombre d'étages.

 

 

  Remballez le Champomy...
Il y a un mais, un gros !
 

Trous, purges et dépendances

Les ravages de la dépendance

Le fait est que la belle théorie du pipeline se heurte en pratique à des aléas qui grippent cette mécanique bien huilée. Ces accidents de parcours sont appelés dépendances et surviennent quand une instruction ne peut s'exécuter avant le complet achèvement de l'instruction qui la précède.

Malheureusement, ces "trous d'air" dans le pipeline ont de multiples causes...

 

   

Dépendances de ressource

Dans notre description du processeur pipeliné idéal, nous avons précisé que les différents étages du pipeline devaient être fonctionnellement indépendants. Hélas, cette exigence était un voeu pieu.

Le problème est le suivant: un pipeline aura beau disposer d'un nombre important d'étages, les unités fonctionnelles du processeur (UAL, registres, mémoire cache, décodeur-séquenceur...) seront toujours, elles, en nombre limité.
De ce fait, il est très possible que deux instructions, même à des stades d'exécution différents, sollicitent simultanément une même unité fonctionnelle. Dans ce cas, pas si extraordinaire, la seconde instruction devra attendre que la première en ait terminé pour poursuivre son propre cheminement.

 

   Ne me dites pas que vous avez déjà oublié vos bases d'architecture matérielle ?  

Dépendances de données

Autre scénario enclin à perturber le long flux tranquille à l'intérieur du pipeline: une instruction intéragit avec un registre que l'instruction immédiatement suivante utilise également pour son propre cycle d'exécution.

Vous aurez remarqué la subtile nuance entre ce type de dépendance et la dépendance de ressource. Dans ce cas-ci, le registre n'est pas nécessairement occupé par l'instruction précédente, mais il n'est pas encore rempli avec la bonne valeur, celle qui résultera de la complète exécution de la première instruction.

 

  Si vous êtes fan, apprenez qu'on appelle RAW (Read After Write) ce genre de petit incident de parcours...  

Dépendances de contrôle (ou de procédure)

Quiconque a taquiné un tant soit peu la programmation sait que tout programme informatique qui se respecte comporte un nombre important de sauts en tous genres: appels de fonction, boucles, branchements avec ou sans tests...
Quelles que soient ces "ruptures de séquence", la conséquence est la même: le programme "saute" brutalement à un autre endroit du programme.
 

  Exemple de branchement:
IF votre_note_a_cette_page < 3
THEN GOTO
ailleurs
 

Comment mettre le doigt de manière intelligence sur le gros problèmes causé par un branchement sur un processeur à pipeline ?
Bon ! Imaginez un programme de tir au contrôleur des impôts. Vous gagnez quand vous avez blasté dix contrôleurs des impôts, et vous avez alors droit à une magnifique animation ainsi qu'à un faux passeport monégasque.
Le programme s'exécute donc paisiblement, et alors que vous venez de châtier votre dernier ennemi, le programme teste s'il s'agit du dixième. Le test est positif: vous avez droit à votre belle scène finale mais voilà, dans le pipeline, le jeu a déjà prévu l'envoi d'une autre cible !
Mais comment cesser ce carnage ?
Réponse: par une bonne purge !


 

  Ce jeu existe également avec des banquiers, des énarques ou des Marc Blondel à bretelles (version collector épuisée)  

Symptomatologie de la dépendance

Dépendances de ressource et de données ne sont que vétilles et peccadilles dans la vie d'un pipeline, car le flux des instructions ne se trouve pas rompu.

Après tout, qu'une instruction doive attendre que celle qui la précède sorte totalement du pipeline... Quoi de grave ? Le flux d'instructions stoppe une fraction d'instant. Le pipeline hoquette. Un "trou" apparait sur la ligne de montage. Et puis la puce s'en repart, tout en sifflotant...

 

  Bips...  

 

 

 Effet des dépendances sur le fonctionnement d'un pipeline

En cas de dépendance, l'instruction fautive doit attendre la complète exécution de l'instruction précédente avant de son poursuivre son propre cycle d'exécution

 

Les dépendances de procédures sont un tantinet plus fâcheuses.
Imaginez... Alors que pupuce s'est laborieusement engagée à exécuter cette séquence-ci d'instructions, contre-ordre soudain, il faut tout laisser tomber et passer à autre chose !
Les instructions postérieures à l'ordre de branchement mais déjà introduites dans le pipeline deviennent d'un coup aussi utiles qu'un string thermolactyl. Il faut se résoudre à purger le pipeline puis le recharger avec les instructions situées à l'adresse du branchement !

 

  Rappelez-vous notre shoot'em up  

 

 

 

 Effet de la survenue de branchements sur un pipeline

Lorsqu'une instruction de saut ("JMP") ou de branchement après test ("BEQ", "BNQ") est exécutée par la puce, le pipeline doit être purgé des instructions devenues non pertinentes puis rechargé avec les instructions situées à l'adresse du branchement.

 Les branchements de type "BNE" ou "BEQ" ne sont effectivement exécutés que si le test s'avère positif, à la différence de l'instruction saut ("JMP") qui implique un branchement obligatoire

 

Le pipeline, censé nous faire gagner du temps, nous en fait perdre lamentablement. Et, qui plus est, le contretemps est d'autant plus interminable que le pipeline est profond, de par le nombre d'étages à purger !

Dans les labos d'IBM et confrères, on organisa très vite un séminaire de travail sur le thème: "Traque et élimination des sauts de nos puces".
Compte-rendu du brainstorming dans une page à venir...


 

  Mettez vous ça dans la tête: alors qu'on l'y contraint depuis des siècles comme s'il s'agissait pour elle d'une seconde nature, LA PUCE DETESTE LES SAUTS !  
   

 
   
 

En concevant le pipeline d'exécution, les ingénieurs-architectes avaient boosté d'un coup les performances de leurs drôles de machine. L'idée était simple, restait pour eux à la concrétiser en circuits imprimés et interconnexions silicées et multiplier les étages de leurs chaînes de montage miniaturisées. Ce qu'ils firent zèlement.
Que pouvait-on faire de mieux ? Quel mécanisme pourrait être plus efficace qu'un pipeline ?

Deux pipelines, bien sûr ! L'ingénierie informatique est si simple !
L'ordinateur entrait fièvreusement dans l'ère prometteuse des processeurs superscalaires.

 Architecture superscalaire (ça vient, ça vient...)

 

 

 

Cette page, comme toutes les pages de Arcana Percipio, est destinée à aider le plus grand nombre.
Pour cela, vos commentaires, vos réflexions et vos remarques sur son contenu sont indispensables à la qualité générale de ce site. Nous tiendrons donc le plus haut intérêt à votre jugement, à vos éventuelles questions et à l'appréciation que vous donnerez à ce document par l'intermédiaire du petit formulaire situé au début de cette page.
Merci par avance de prendre quelques secondes pour le renseigner...

Tous droits réservés. © Arcana Percipio. 2004