Architecture des ordinateurs, avant les microprocesseurs
Jusque dans les années 1970 les concepteurs d’unités centrales (qui n’étaient pas encore des microprocesseurs) pensaient que les progrès dans cet art viendraient de jeux d’instructions machine de plus en plus riches, qui rapprocheraient le langage machine des langages dits évolués, c’est-à-dire, par rapport au langage machine, plus proches du langage humain. Il en résulta l’architecture dite (ex-post) CISC (pour Complex Instruction Set Computer), avec des instructions de plus en plus élaborées, qui effectuaient des opérations complexes.
Entre les langages évolués et le langage machine il y a le langage assembleur, dont les instructions sont, une pour une, celles du langage machine, mais écrites selon une graphie plus confortable. L’assembleur procure aussi quelques aides au programmeur, notamment des symboles pour représenter les adresses, le calcul automatique du déplacement entre deux adresses, etc. Chaque instruction machine occupe en mémoire un nombre de mots déterminé, rigide, un programme assembleur n’est pas un texte dont la composition serait laissée à la discrétion du programmeur, la disposition du texte correspond à sa disposition dans la mémoire de l’ordinateur.
Apogée des architectures CISC
Les machines CISC, qui ont connu leur apogée au début des années 1980 (VAX de Digital Equipment Corporation, 68000 de Motorola), avaient un jeu d’instructions très vaste (plus de 300 pour le VAX) et très complexe, avec des instructions de longueurs différentes, et même parfois de longueur variable selon les opérandes. La richesse du jeu d’instructions était censée faciliter la tâche des programmeurs qui utilisaient le langage assembleur et, surtout, des auteurs de compilateurs pour langages évolués, en leur fournissant des instructions machine qui ressemblaient déjà à du langage évolué, plus facile et maniable pour le programmeur. D’ailleurs le langage C, langage évolué de bas niveau (on a pu le qualifier d’assembleur portable, la notion de portabilité désignant l’aptitude à fonctionner sur des ordinateurs d’architectures différentes), est assez largement inspiré de l’assembleur des ordinateurs PDP, ancêtres des VAX.
Cette richesse et cette complexité du jeu d’instructions avaient bien sûr un coût en termes de complexité et de lenteur du processeur. Le risque était notamment que les instructions simples (chargement de registre depuis la mémoire, copie de registre vers la mémoire, addition registre à registre) soient condamnées à s’exécuter aussi lentement que les opérations complexes (copie de zone mémoire à zone mémoire de longueur variable, opérations complexes en mémoire). Le VAX notamment n’esquivait guère ce risque.
Naissance de l’idée RISC
Dans la seconde moitié des années 1970 des chercheurs ont fait des statistiques sur la composition en instructions des programmes en langage machine, soit qu’ils aient été directement écrits en assembleur, soit qu’ils aient été produits par un compilateur. Citons notamment les travaux de D.A. Fairclough, (A unique microprocessor instruction set, IEEE Micro, mai 1982). Ils constatèrent d’abord que 43 % des instructions étaient des déplacements de données d’un endroit à un autre, que le quart des instructions étaient des branchements, ensuite que pour chaque programme le nombre d’instructions utilisées était très réduit, enfin que seules les instructions les plus simples étaient largement utilisées. Une autre constatation était que les opérations de loin les plus coûteuses étaient l’appel de sous-programme (un programme lance l’exécution d’un autre programme en lui communiquant des paramètres) et le retour d’un sous-programme au programme principal.
Sur la base de ces constatations ils préconisèrent de concevoir des processeurs avec un jeu réduit d’instructions plus simples. La notion de processeur RISC (pour Reduced Instruction Set Computer) était née, et le premier processeur de ce type, l’IBM 801, fut réalisé par John Cocke en 1979. La société MIPS, fondée par John Hennessy, pionnier du RISC à l’Université Stanford, fut créée en 1985. Hewlett-Packard fut le premier grand constructeur d’ordinateurs à réaliser toute sa gamme en architecture RISC en 1986. Sun et Digital Equipment Corporation suivirent. L’histoire de cette éclosion est décrite sur le site The Chip Letter, second chapitre ici.
Avènement des microprocesseurs RISC
Le livre emblématique de la révolution RISC, Computer architecture : a quantitative approach, a été écrit par John L. Hennessy, l’architecte des processeurs MIPS, et David A. Patterson, originaire du campus de Berkeley (Université de Californie, Berkeley), l’architecte des processeurs SPARC de Sun. Les processeurs MIPS ont été les premiers à défricher la voie, et les plus hardiment innovateurs, par exemple avec l’utilisation du TLB (Translation Lookaside Buffer) pour résoudre les défauts de page en mémoire virtuelle en se passant d’un circuit spécialisé. Il faudrait ajouter à ce répertoire Richard L. Sites, l’architecte des processeurs Alpha de Digital Equipment Corporation, les processeurs les plus impressionnants que j’aie utilisés.
Le trait le plus frappant initialement des architectures RISC était le petit nombre d’instructions, avec l’absence d’instructions mémoire—mémoire : il n’y avait que des chargements de mémoire dans un registre, des copies de registre vers la mémoire et des opérations dans les registres.
D’autres traits se révélèrent bientôt aussi importants : longueur et format d’instruction fixes, usage intensif d’un pipe-line de longueur modérée. Pour tirer parti correctement d’une architecture aussi ascétique une grande part de la complexité était reportée sur les compilateurs, qui devaient produire un code capable d’utiliser efficacement les registres et le pipe-line.
La nouvelle architecture se révéla bientôt extrêmement rapide, et doublement rapide : en effet, pour tirer parti d’un progrès de la micro-électronique, il ne suffit pas de concevoir un processeur rapide, il faut aussi que le délai nécessaire à sa conception ne soit pas trop long. La simplicité du RISC était aussi un atout de ce côté. Actuellement il faut à peu près trois ans à une équipe de 200 à 400 ingénieurs pour concevoir un nouveau processeur. Une usine entièrement équipée pour le construire coûtera de l’ordre de huit milliards de dollars, et cela double tous les quatre ans (quatorze milliards pour la dernière usine Samsung). La conception d’une architecture novatrice demande une dizaine d’années.
Résistance des architectures CISC
La technologie CISC parut condamnée, ce qui fut effectivement le cas pour les gammes VAX et Motorola 68000. Tout le monde attendait la chute de l’architecture x86 d’Intel, sur laquelle reposent les dizaines de millions de PC vendus chaque année. C’était compter sans les efforts qu’Intel pouvait mobiliser grâce à la rente du PC. Les Pentium et les Core qui leur ont succédé sont en fait des processeurs constitués d’un noyau RISC autour duquel des circuits supplémentaires et du micro-code simulent l’ancienne architecture CISC afin de préserver la compatibilité avec les systèmes et les programmes existants (information fournie par François Anceau).
Quant à la gamme des grands systèmes IBM, l’immense stock de programmes existants dont la conversion exigerait des dépenses phénoménales semble la vouer à une immortalité dont l’érosion ne se fait qu’au gré du changement lent des applications.
Même si l’hégémonie de l’architecture x86 suggérait alors un demi-échec de l’architecture RISC, tous les processeurs modernes ont intégré sa leçon. Le mouvement RISC a profondément révolutionné la conception des processeurs et aussi, de façon moins spectaculaire mais aussi profonde, celle des techniques de compilation. En fait, hommage du vice à la vertu, tous les processeurs modernes comportent un cœur RISC entouré de circuits qui procurent un décor différent, Pentium par exemple. Même les grands systèmes IBM sont maintenant animés par des microprocesseurs qui implémentent leur jeu d’instructions traditionnel en RISC.
L’avenir appartient-il au RISC ?
Si le marché des ordinateurs, serveurs comme appareils personnels, est encore monopolisé par les architectures CISC d’Intel (et accessoirement d’AMD, qui produit des processeurs compatibles x86), il faut mesurer les conséquences de l’extraordinaire prolifération des téléphones mobiles et des tablettes, qui sont des ordinateurs Turing-complets propulsés par des processeurs RISC de conception ARM. Ces processeurs sont de loin les plus répandus dans le monde, et si il y a dix ans les accès au Web émanaient pour plus de 95 % d’ordinateurs x86 sous Windows, aujourd’hui pour plus de 70 % ils viennent d’appareils sous Android ou, moins, sous iOS.
Si les concepteurs de ces appareils portables ont choisi la plate-forme ARM, c’est pour de bonnes raisons : à puissance de calcul comparable, le poids et la consommation électrique sont bien moindres, d’au moins un ordre de grandeur. Il me semble que les processeurs ARM, qui ont commencé leur carrière de façon quasi-artisanale, seront au cœur des architectures de demain.