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
- 30 septembre 2004 |
![]() |
||||
![]() |
Très bien. Maintenant que nous avons passé en revue les différents acteurs intervenant sur cette scène "lillipucienne" qu'est un processeur on ne peut plus standard, le spectacle peut enfin commencer ! Mais avant de débuter, nous avons tenu à donner un nom à
la petite puce qui sera le théâtre de cette intrigue électronique,
juste comme ça, histoire de nous la rendre plus familière... Que cette puce n'ait sans doute jamais existé n'a aucune importance: le but de cette page est de montrer de manière simple les interactions entre les principaux éléments d'un processeur rudimentaire au cours de son fonctionnement, et, par effet tramplin, de comprendre les divers moyens d'améliorer l'architecture matérielle des processeurs. Attention donc, page prise d'élan pour grand bond en avant... |
Accumulateur |
||
|
Au théâtre ce soir... C'est vrai que le processeur i4 que nous
allons disséquer
ici ne ressemble à rien de connu. Tout juste pourrait-on le cousiner
à un Z80, processeur antédiluvien apparenté au vieil Intel
8080.
|
i4, archétype virtuel en quelque sorte... | ||||||||||||||||||||||||||||||
|
Avant tout premier pas, rappelons une fois encore ceci: tout
programme informatique, quelle que soit sa complexité, est
constitué d'une longue séquence d'instructions-machine
élémentaires attendant paisiblement en mémoire le
moment d'être
appelées dans le processeur afin d'y être exécutées. |
Non ! "Lavage à sec" ne fait pas partie de ces instructions machine... | ||||||||||||||||||||||||||||||
|
De nos jours, grâce à des
technologies hautement avancées, les processeurs
les plus récents
parviennent à exécuter simultanément plusieurs de
ces instructions, démultipliant
d'un coup
une
puissance de calcul déjà formidable. |
|||||||||||||||||||||||||||||||
| En
effet, les premiers processeurs dignes de ce nom se caractérisaient
par une logique de travail finalement très humaine, à savoir
une logique
séquentielle selon laquelle chaque
instruction est exécutée l'une après l'autre,
au fur et à mesure du déroulement du programme. Les gens très sérieux en blouse blanche qualifient ce comportement très pépère de processus SISD ("Single Instruction Single Data"). Sous-entendu: mode de fonctionnement d'un processeur exécutant une instruction à la fois, instruction ne mettant en jeu qu'une seule donnée cible. |
Les intégristes du français peuvent traduire SISD par "une Seule Instruction. une Seule Donnée" | ||||||||||||||||||||||||||||||
|
Même si les processeurs de type SISD font désormais sourire les plus jeunes, notre puce i4 n'en est pas pour autant un "sous-processeur". Et même si sa cadence de travail n'est pas des plus fulgurantes, cette relative indolence va nous permettre de bien comprendre l'ensemble des événements se déroulant au coeur d'un processeur, microseconde après microseconde, au cours de son travail répétitif.
|
...ni "sous-processeur" ni "pré-puce" ! | ||||||||||||||||||||||||||||||
|
Présentation de l'oeuvre Comme nous l'avons déjà dit, tout processeur se contente d'exécuter une séquence d'instructions dont l'ensemble constitue le logiciel en cours d'utilisation. Ces micro-instructions, avant d'être ainsi froidement exécutées, patientent sagement dans la mémoire de l'ordinateur, codées au format binaire. Ainsi, dans le cas qui nous intéresse, notre processeur i4 est
sur le point d'exécuter
la séquence suivante placée en mémoire: |
|||||||||||||||||||||||||||||||
C'est sûr que vu comme ça, on distingue mal l'intérêt
de ce bout de programme...
|
|
||||||||||||||||||||||||||||||
|
"What's New Puce i4 ?" (huis-clos en 2 actes) ACTE I. LDA Scène I. Prise d'ordre (M1) i4 débute l'exécution
de notre séquence sibylline... |
Le
projet initial de l'auteur était d'appeler cet acte "Rechargez-moi
l'accu !",
mais l'éditeur a pensé que ce pouvait être mal interprêté...
|
||||||||||||||||||||||||||||||
|
Le compteur ordinal délivre ici des valeurs hexadécimales,
mais dans l'unique but de davantage de clarté. Electroniquement
parlant, ces valeurs sont bel et bien des valeurs binaires,
valeurs codées sur 16 bits dans le cas de i4. |
Avouez que "F100", c'est quand même plus convivial que "1111000100000000" ! |
||||||||||||||||||||||||||||||
|
La mémoire centrale reçoit
l'adresse demandée
et, docile, procède immédiatement à la
recherche de la case mémoire correspondante. Une fois trouvée,
le contenu de celle-ci (3A) est
prestement renvoyé au processeur par l'intermédiaire du bus
de donnée. |
|||||||||||||||||||||||||||||||
|
Comme vous l'aurez constaté, les données abritées dans la mémoire sont des octets. Le bus de donnée de i4 est donc un bus de huit bits, capable de véhiculer des valeurs binaires comprises entre 00000000 et 11111111, soit, en hexadécimal, entre 00 et FF. Parvenue sur le bus, la donnée retourne benoîtement au processeur
jusque dans le tampon de donnée. |
Incrémenter: barbarisme d'informaticien pour signifier "ajouter une valeur à une variable" | ||||||||||||||||||||||||||||||
|
Le tampon de donnée convoie la valeur reçue jusque dans le registre d'instruction du décodeur. Celui-ci procède alors au décodage de l'instruction et, conformément au jeu d'instructions de i4, détermine que la valeur "3A" correspond à l'instruction machine "LDA" C'est sûr que pour vous et
moi, comme ça, a priori, "LDA" ne constitue pas une instruction
monstrueusement explicite. Mais pour i4, le message est très
clair; c'est l'ordre de charger
l'accumulateur avec une valeur située à l'adresse précisée
par les deux prochains octets lus en mémoire. |
Pour rappel, le jeu d'instructions d'une puce est l'ensemble des instructions-machine que ce processeur est apte à comprendre | ||||||||||||||||||||||||||||||
|
Bon...Petit effort supplémentaire de traduction: en décodant "LDA", notre puce comprend que les deux prochaines données qui seront lues en mémoire ne seront ni une nouvelle instruction ni des données "immédiatement utiles" mais constitueront en fait deux demi-adresses (8+8 = 16 bits) dont il faudra charger le contenu dans l'accumulateur. Nous tenons d'ores-et-déjà à rassurer le lecteur vertiginé par l'aridité et la rébarbativité de ce flot de texte très aride; un joli schéma, tout en couleurs, tentera d'illustrer l'ensemble de ce chapitre très "mécanique" plus bas sur cette page.
|
On appelle adressage indirect ce genre de "ricochet" en mémoire | ||||||||||||||||||||||||||||||
|
Scène II. Repérage de la cible (M2) Ainsi donc, le processeur a besoin du contenu des deux prochaines cellules mémoire afin de former une adresse. Qu'à cela ne tienne, le processus d'accès en mémoire se répète une première fois. L'instruction décodée, c'est au séquenceur de prendre les choses en
main en pilotant l'ensemble des événements à venir. |
|||||||||||||||||||||||||||||||
|
Contrairement à la scène précédente, la donnée stockée à cet instant dans le tampon n'est pas une instruction à décoder, mais une demi-adresse en cours de formation. Par conséquent, le séquenceur n'oriente pas ce "7C" vers le décodeur, mais le stocke au chaud dans un registre de travail.
|
|||||||||||||||||||||||||||||||
|
Scène III. Le retour du Repérage de la cible (M3) Notre première moitié d'adresse désormais à l'abri, le processus se répète à l'identique pour la seconde:
Et pendant ce temps là, devinez quoi, notre compteur ordinal progresse d'une unité.
|
Oui,
c'est vrai que l'intrigue de la pièce se répète
un petit peu à ce stade... Ce doit être le comique de répétition... |
||||||||||||||||||||||||||||||
|
Bien ! Maintenant que i4 dispose des deux demi-adresses dans ses petits registres, il est enfin possible de mettre en oeuvre notre instruction LDA. Le séquenceur accède aux registres de travail (7C et F3) et réunit leur
contenu sur le tampon d'adresse (F37C). Celui-ci délivre sa valeur vers
le bus processeur, qui transmet la requête à la mémoire centrale. |
|||||||||||||||||||||||||||||||
|
Les
esprits curieux auront noté que notre puce a formé l'adresse
en commençant par l'octet de poids faible (7C puis F3 pour former
F37C) En guise de
réponse, le tampon de donnée réceptionne la valeur souhaitée
(50) avant que, conformément à l'instruction "LDA",
le séquenceur
place celle-ci dans le registre
accumulateur. |
|
||||||||||||||||||||||||||||||
|
Petite
respiration dans cet infernal ballet électronique... En pratique, il est très fréquent qu'une instruction-machine
soit ainsi suivie de un ou plusieurs paramètre(s) permettant son exécution.
De fait, plutôt que de paramètres, on parle alors des opérandes de
l'instruction. |
Après le théâtre, l'opérande... | ||||||||||||||||||||||||||||||
|
Ceux qui ont d'ores-et-déjà compris sont priés
de sauter l'effrayante métaphore
qui va suivre...
|
Mon
Dieu mon Dieu... Mais quelle force irrésistible me pousse à conserver
sur cette page cette métaphore débilisante ? Une démence latente sans doute... |
||||||||||||||||||||||||||||||
|
Acte II. ADD Ouf ! Et d'une !
|
|||||||||||||||||||||||||||||||
|
Scène I. Une instruction (M1) Derechef, i4 fait appel au compteur ordinal afin de savoir où elle en
est dans l'exécution de son programme. Obéissant, celui-ci délivre son
contenu (F103) au tampon d'adresse, avec pour conséquence immédiate l'envoi
d'une nouvelle requête en mémoire centrale. La mémoire recherche l'adresse
indiquée et délivre le contenu de celle-ci (B1) vers le tampon de donnée,
via le bus processeur. |
La routine, quoi ! | ||||||||||||||||||||||||||||||
|
L'exécution de la précédente instruction étant terminée, le séquenceur sait que la donnée entrante est une nouvelle instruction à décoder. Celle-ci est donc convoyée jusqu'au registre d'instruction, où le décodeur entre en jeu et reconnaît l'instruction-machine "ADD", ordre d'addition entre la valeur contenue dans l'accumulateur et un opérande à venir.
|
Que ceux qui ont oublié d'incrémenter le compteur ordinal se mordent douloureusement la langue en guise de châtiment corporel | ||||||||||||||||||||||||||||||
|
Scène II. Un opérande (M2) Prochaine mission, donc: recherche de l'opérande en mémoire.
Hop !
Compteur ordinal (F104), tampon d'adresse, bus d'adresse, mémoire.
La donnée trouvée (B6) est ramenée à i4.
Hop !
Hop ! Bus de donnée, tampon du même nom, registre de
travail...
|
Un poil lassant, peut-être ? | ||||||||||||||||||||||||||||||
|
Scène III. Scénario catastrophe (M3) Bon ! Foin de va-et-vients électroniques !
Notre i4 serait-elle limitée à balader des électrons
d'un coin à l'autre
de la machine ? Non, M'sieurs Dames ! Il est tant désormais
pour i4 de nous montrer qu'elle est un processeur, un
vrai ! |
|||||||||||||||||||||||||||||||
|
Cette
fois-ci, c'est un calcul que l'on réclame à notre puce.
Le séquenceur
achemine donc le contenu de l'accumulateur (50) et la donnée
nouvellement importée (B6) jusqu'à l'Unité Arithmétique
et Logique (UAL) qui se charge du calcul
mathématique proprement dit. |
|||||||||||||||||||||||||||||||
|
Le
fait est que l'opération est ici assez sommaire puisqu'il s'agit
d'une bête addition entre deux valeurs entières. Si le calcul
avait été plus audacieux (un calcul de sinus, par exemple)
ou s'il avait mis en jeu des nombres relatifs, l'UAL aurait délégué cette
tâche à une unité dédiée spécialement
aux manipulations de virgule: le coprocesseur arithmétique. |
Rappelons
que ce coprocesseur était optionnel (voire absent) chez nombre
de processeurs très anciens. Pauvres bêtes ! |
||||||||||||||||||||||||||||||
| Très
bien ! L'UAL entre donc en scène et procède bien tranquillement à l'enfantine
addition demandée. Routine, train-train et B-A-BA... mais pourtant,
un drame se prépare... Argghhh (étranglement atroce) !!! 50+B6=106... ça dépasse ! Pas de beaucoup, mais ça dépasse ! Zut, flûte et caca boudin. |
Vous savez comment faire tenir 106 dans un registre de huit bits, vous ? | ||||||||||||||||||||||||||||||
| Bon ! Pas
de panique, i4 en a vu d'autres ! Après tout, même
fâcheuse, la situation
est tout à
fait prévue et même qu'elle porte un nom exprès
pour: un overflow. Tout en sang froid, l'UAL laisse tomber l'addition impossible et positionne à "1" le drapeau du registre d'état dédié à ce dépassement de capacité. |
|||||||||||||||||||||||||||||||
|
Le
fait est qu'après chaque exécution d'une instruction, le
séquenceur consulte
ce registre d'état afin de voir si une "alerte" particulière
s'est produite au cours du cycle d'instruction en cours. Et voilà, le rideau se referme sur ce coup de théâtre
époustouflant et truculent
!
|
|||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||
|
Critique de l'oeuvre Et voilà ! C'était court mais suffisamment répétitif
pour pouvoir dire que nous en savons désormais
assez sur i4 et sur sa manière
de lire et exécuter un programme informatique.
|
||||
|
Se secouer la puce... Nous venons de voir i4 procéder à l'exécution de
deux instructions successives: LDA puis ADD. L'expérience, intense,
nous permet d'ores-et-déjà les quelques très pertientes
remarques suivantes: |
||||
|
||||
|
||||
|
Malgré ce nombre variable de cycles machine nécessaire à l'exécution d'une instruction, nous avons remarqué que dans tous les cas, deux phases successives se répétaient pour chaque cycle d'instruction:
|
||||
|
Il
existe en fait un troisième cycle dont nous n'avons pipé mot
histoire de ne pas "surcharger le baudet"; il s'agit du cycle
d'interruption. Ce cycle, qui termine tout cycle d'instruction,
est une phase au cours de laquelle le processeur vérifie qu'aucune
demande d'interruption n'a été émise pendant l'exécution
de l'instruction en cours. |
||||
|
De cette suite d'épatantes observations, nous pouvons maintenant dresser le scénario de nos deux cycles d'instruction étudiés:
Bien ! Maintenant que nous avons brossé le
portrait type d'un cycle d'instruction, nous pouvons oser quelques pistes
de recherche afin de dynamiser un peu cette pièce parfois un poil longuette.
|
CR = Cycle de recherche |
|||
|
Augmenter la cadence ! Malin (maligne) comme vous êtes, vous avez immédiatement
percuté ! Si i4 calque si scrupuleusement son rythme de
travail sur la fréquence d'horloge de l'ordinateur, ne suffirait-il
pas d'augmenter la cadence de celle-ci pour doper d'autant les performances
de notre chère puce ? |
||||
|
Et si, bien sûr ! Les dresseurs de puces (aussi appelés "fondeurs") parviennent à régulièrement augmenter les fréquences de fonctionnement de leurs créatures, mais cette méthode "brutale" est liée à des contraintes purement technologiques. En effet, il n'est pas tout d'accélérer la cadence de travail de la chaîne de production, encore faut-il que les ouvriers puissent suivre...
|
||||
|
Augmenter la seule fréquence de fonctionnement des processeurs
ne constitue pas la solution miracle car nous nous doutons bien que certaines
actions
du processeur réclameront toujours un temps minimal et incompressible.
|
||||
|
Il y a un détail essentiel que ne montre pas notre schéma tout en couleurs, c'est que les cycles de recherche réclament à i4 énormément plus de temps que les cycles d'exécution. Vous ne serez qu'à demi-surpris(e) à la lecture
de cette phrase si vous avez déjà butiné les pages
de ce site consacrées au bus
processeur ou
à la fréquence de fonctionnement
des processeurs. Nous avions alors appris
que le processeur travaillait "en interne" beaucoup plus vite
que le reste de l'ordinateur grâce à un judicieux dispositif
appelé multiplicateur
d'horloge. |
||||
|
Ce hiatus de fréquence entre l'intérieur et l'extérieur de la puce implique qu'à chaque fois qu'il doit importer une donnée depuis la carte mère (mémoire ou périphérique), notre processeur, ultra-rapide, doit se résoudre à patienter avant d'être exaucé. Ayant constaté combien fréquentes
étaient les requêtes de i4 à destination de la mémoire centrale, nous
devons donc nous résoudre à cette navrante
conclusion: la principale tâche de i4 est bel et
bien le coinçage de bulle en bonne et due forme ! |
Au prix où on l'a payée... | |||
|
Conscients d'avoir repéré à ce niveau un terrible "goulot d'étranglement" susceptible de considérablement ralentir l'activité de leurs créatures, les ingénieurs informaticiens cherchèrent pas tous les moyens à réduire au strict minimum les requêtes du processeur à la mémoire centrale. Et sur ce point, ils se surpassèrent...
|
||||
|
Veuillez patienter, le processeur va vous recevoir... La méthode la plus primitive afin de réduire l'expectative du processeur lors des accès en mémoire porte un nom très parlant: la file d'attente. A la base de cette trouvaille, la simple constatation que lors de la
phase d'exécution de l'instruction en cours, il serait tout-à-fait possible
de rechercher l'instruction suivante en mémoire afin que celle-ci soit
déjà dans le processeur lorsqu'elle sera réclamée. |
Un peu familiers, les Anglais appellent "prefetch queue" ce dispositif somme toute assez rudimentaire | |||
|
La file d'attente fut adoptée par Monsieur Intel dès l'avènement de son processeur 8086. Elle était alors dotée d'un espace de stockage de six octets, contre quatre octets pour sa version "light" baptisée 8088.
|
||||
|
Mémoire ancienne, mémoire récente La file d'attente était évidente et simple à mettre en place
mais d'un intérêt relativement limité quand on sait qu'un programme informatique
est généralement constitué de nombreux branchements et, plus fréquentes
encore, de boucles d'exécutions itératives. Or, même dans ces situations
très communes, l'accès à la mémoire, même anticipé, restait de mise et
continuait de grever le pétulant potentiel de nos processeurs. |
||||
|
Bien sûr, il aurait été possible de munir les processeurs de mémoires
beaucoup plus rapides, mais celles-ci, beaucoup plus chères, auraient
définitivement placé les ordinateurs hors de portée du grand public. |
Cette mémoire cache est également surnommée "antémémoire" | |||
|
A
la base du procédé, une simple observation. De par la structure générale
des programmes informatiques, il s'avère extrêmement fréquent qu'une
donnée manipulée par le processeur (instruction ou opérande) soit réutilisée
par celui-ci dans un avenir proche. Par ailleurs, si une donnée est réclamée
quelque part en mémoire, il s'avère également très probable que les octets
voisins soient à leur tour requis à très brève échéance. |
||||
| Le
principe de la mémoire cache consiste simplement à intercaler
entre le processeur et la mémoire centrale de l'ordinateur une petite
quantité
de mémoire ultra-rapide dont le but est de réaliser une copie sélective
de la mémoire centrale. |
...forcément sélective puisque présente en quantité bien moins importante | |||
|
En
clair, lorsque le processeur réclame une donnée, celle-ci
est très normalement importée depuis la mémoire centrale,
comme d'habitude, mais accompagnée cette fois de ses quelques
octets immédiatement voisins. La donnée ciblée est
bien évidemment
délivrée au processeur, mais le tout est simultanément
copié dans la mémoire cache de la puce.
|
||||
|
Des bits ! Plus de bits ! Souvenons-nous de notre instruction LDA qui, péniblement,
dût rassembler deux demi-adresses afin de former l'adresse définitive
où aller chercher l'information pertinente. Souvenons-nous aussi
de notre dénouement catastrophe où tout
a bloqué pour une addition un peu trop osée... |
||||
|
Les ingénieurs, eux aussi, ont souvent regretté ce manque chronique de bits. Il n'est donc pas étonnant de constater une augmentation croissante de la taille des bus et des registres au gré des générations successives de processeurs. Ainsi, le vénérable 8088, déjà rencontré plus haut, disposait
d'un bus de donnée de huit pauvres bits, alors que le dernier-né de chez
Intel,
l'effrayant Itanium, arbore un bus de données
huit fois plus important. |
64 bits ! Ca laisse réveur... | |||
|
On vous venir de loin, vous, là, l'air faussement niais... Pourquoi
ne pas allonger indéfiniment
la largeur de tous ces bus et registres afin de gagner en rapidité d'action nous
dites-vous ? Trop de bits tue le débit... |
|
|||
|
Et du pipeline, la lumière fût ! En réalité, la dernière très
grande révolution dans le domaine de l'architecture matérielle
des processeurs tient dans un mot à la fois sombre et creux:
le pipeline d'exécution. Juste pour faire saliver, avançons d'ores-et-déjà qu'à fréquence égale,
les performances d'un processeur pipeliné"
se trouvent démultipliées d'un coup par rapport à
une puce "artisanale" telle i4. |
||||
|
Bon... Maintenant nous pouvons vous le dire... Tout ce que vous venez
d'apprendre sur la manière de fonctionner d'un processeur est complètement
dépassé. Mais alors, complètement ! Mais, mais, mais... Ne nous fâchons pas, Michalons ! Car la lecture de cette page, même effroyablement dépassée, fut une étape essentielle afin de mieux approcher les processeurs actuels, de mieux comprendre leurs foisonnantes innovations, de mieux appréhender les pistes de recherche pour les rendre demain encore plus forts et beaux. Vous allez voir, vous nous remercierez un jour...
|
||||
Cette page, comme toutes les pages de Arcana Percipio,
est destinée à aider le plus grand nombre. Tous droits réservés. © Arcana Percipio. 2004 |