De quoi est fait une infrastructure [1] ? De circuits…

par Jean-Luc Dormoy

Nous entamons ici un long tunnel passant à travers les huit ou dix articles qui suivent montrant toutes les dimensions des infrastructures modernes en technologie de l’information. Celles-ci vont du tout petit objet digital à des infrastructures comprenant des centaines de millions de noeuds sur l’Internet. L’universalité de l’ordinateur est bien sûr le fondement rendant possible la construction de ces infrastructures les unes au-dessus des autres, et la loi de Moore fournit les ressources en puissance de calcul, mémoire, et connectivité réseau à coût acceptable.

De circuits

Comme déjà mentionné, nous ne reprenons pas la vue habituelle qui sépare les systèmes informatiques en hardware d’un côté et software de l’autre. Cette vision considère que tout ce qui est sur la puce est du hardware, et tout ce qui hors de la puce, relevant du logiciel et de la programmation, est du software. Il y a de vraies raisons scientifiques et techniques justifiant cette catégorisation; ainsi, les disciplines universitaires sont considérées comme différentes, entre les départements (aux Etats-Unis et dans beaucoup d’autres endroits dans le monde) « d’Electrical Engineering » et de « Computer Science ». Cependant, ces deux disciplines sont tellement liées, et les concepts se déplaçant souvent de l’une à l’autre, on a souvent créé des départements mixtes « EE & CS » pour « Electrical Engineering & Computer Science ».

Le hardware peut être vu comme composé de deux parties : l’une consiste à mettre au point la physique et la technologie de mise en œuvre d’une fonction élémentaire sur la puce – par exemple un transistor – ainsi que les procédés de fabrication collective et contrôlée de ces éléments; l’autre conçoit la fonction globale souhaitée, en général via un circuit[1]. Concevoir un circuit n’est pas tout à fait indépendant de la connaissance du substrat physique qui doit l’accueillir, cependant on fait tout pour que cela le soit au maximum. C’est une différence avec le logiciel, où l’on peut pratiquement tout ignorer de l’architecture des processeurs tout en étant un concepteur et développeur compétent. Néanmoins, cette seconde partie de conception de circuit relève « moralement » de la logique, et donc d’une activité très semblable à la conception du logiciel. Ainsi, on a la notion de porte logique, qui réalise en assemblant quelques transistors une fonction logique élémentaire comme un « ET », un « OU » ou un « NON »[2]. Pour autant les langages utilisés pour spécifier un circuit, et les outils de mise en œuvre dans le silicium sont distincts des langages et outils du logiciel – encore qu’ils s’en rapprochent de plus en plus par une montée en abstraction des outils de l’EDA – Electronic Design Automation.

Historiquement, l’EDA est née au début des années 80 avec les circuits hautement intégrés, les VLSI. Les pionniers se faisaient d’ailleurs les avocats de l’utilisation des langages de programmation usuels, et d’une forme de « compilation silicium » pour faire face à la complexité de la conception de ces circuits. Les choses ne se sont pas tout à fait déroulées ainsi, et on a aujourd’hui deux principaux langages de description de circuits, Verilog et VHDL. Un circuit exprimé dans un de ces langages peut être simulé avant sa réalisation, et compilé en un assemblage de cellules, qui constituent des fonctions logiques élémentaires. On parle de flot de design. Les fabricants de chips fournissent une bibliothèque d’outils correspondant à ces cellules, pour la simulation et pour la mise en œuvre dans le silicium. Il reste aujourd’hui trois fournisseurs principaux d’outils d’EDA, plus de nombreuses startups qui proposent des innovations sur des étapes du flot, et sont ensuite souvent rachetées par une des majors.

L’architecture du circuit, s’il s’agit d’un processeur, est de plus en plus liée aux couches logicielles qui vont s’exécuter dessus, et aux outils de développement du logiciel – compilateurs notamment. Au fur et à mesure des évolutions technologiques, tel ou tel concept « passe » ainsi du hardware au software, ou l’inverse. Il y a donc toute raison pour les considérer ensemble.

Donc, nous rangeons la partie « physique » du hardware du côté du premier versant de la loi de Moore, et la partie « circuit logique » du côté du second versant. Nous rangeons aussi la mémoire du côté du second versant, d’ailleurs les processeurs modernes incluent sur la puce de grandes quantités de mémoire.

Une fois cela dit, que fait-on avec ces circuits ? Bien sûr on fait des processeurs, mais pas seulement. En réalité, il est tout à fait possible – et il s’agit de tout un pan de l’industrie – de réaliser des circuits spécifiques, qui mettent en œuvre une fonction particulière – c’est-à-dire que l’on met en œuvre un service directement dans le hardware.

On « comprime » donc en quelque sorte, comme une sculpture de César, le logiciel applicatif et la machine universelle en un circuit unique. C’est ce que l’on appelle un ASIC – Application Specific Integrated Circuit. Cela a du sens économique lorsqu’un nouveau domaine d’application s’ouvre juste, et alors que les performances des processeurs universels sont encore insuffisantes ou les coûts trop élevés. Les conditions économiques changeantes de la loi de Moore obligent au fur et à mesure du temps à avoir des marchés d’application pour cette fonction exigeant un nombre de pièces grandissant.

Entre le circuit spécialisé (ASIC) et le processeur générique s’est glissé depuis 30 ans une nouvelle catégorie de processeurs, appelés reconfigurables, ou FPGA – Field Programmable Gate Array. Il s’agit de matrices de portes logiques que l’on peut configurer par un logiciel particulier. Celui-ci a la forme de la description d’un circuit acceptée par un outil d’EDA. « Compiler » ce circuit sur un FPGA consiste à organiser les relations entre les portes de la matrice de façon à ce que le FPGA ainsi configuré se comporte comme le circuit compilé. Un FPGA agit donc comme un processeur universel, mais dont le langage de programmation repose sur des descriptions de circuit !

Les FPGA sont très utiles dans plusieurs circonstances. Par exemple ils permettent de tester un circuit « virtuellement » avant de le « fondre » dans le silicium, ce qui coûte cher. On évite ainsi des allers-retours coûteux dans la phase de conception et de mise au point. Ils peuvent également être utilisés directement dans des applications lorsqu’au lieu d’un ASIC on préfère mettre en œuvre un FPGA avec le circuit correspondant, par exemple lorsque le nombre de pièces n’est pas suffisant pour justifier le coût de développement et de production d’un ASIC, lorsque le circuit en question dépend de conditions de marché changeantes ou connues peu de temps avant la mise sur le marché (standards en évolution), ou lorsque l’on souhaite rendre un circuit unique adaptable à plusieurs marchés par « reprogrammation » d’un sous-circuit reconfigurable.

Plus généraux que les FPGA, on fait donc des processeurs génériques, aussi appelés CPU – pour Computing Processing Unit – permettant d’exécuter du « vrai » logiciel. Ceux-ci sont en réalité variés, couvrant un vaste domaine de coûts, de performances, de consommation énergétique, d’adaptation à des conditions physiques d’utilisation, etc. Cela va des microcontrôleurs, c’est-à-dire de processeurs aussi simples que possible, utilisés dans les applications embarquées notamment, aux monstres pour les applications les plus exigeantes en performance, qui mettent en œuvre désormais plusieurs milliards de transistors sur une même puce[3]. On fait des processeurs sur une puce unique depuis une trentaine d’années – auparavant les divers composants des processeurs étaient réalisés sur des puces séparées placées ensuite sur une carte électronique pour réaliser une machine universelle.

Il est à noter que l’industrie des circuits s’est en partie « déverticalisée ». On a ainsi des acteurs qui réalisent dans leurs fabs les circuits qu’ils conçoivent pour les vendre par leurs réseaux commerciaux. Mais d’autres se limitent à concevoir des circuits ou des composants de circuits, vendant ensuite ces composants, appelés IP pour Intellectual Property, comme on vend des composants logiciels. Un des plus célèbres industriels « fabless » (sans usine de fabrication) est l’anglais ARM, dont les processeurs équipent une grande partie des systèmes embarqués ou mobiles.

Le bestiaire des circuits s’est agrémenté depuis deux décennies des System on Chip – SoC – qui regroupent sur une même puce plusieurs circuits différents, connectés de façon ad hoc. Il s’agit d’un des débouchés pour les vendeurs d’IP. Très souvent ces systèmes sont constitués d’un processeur universel entouré de circuits spécifiques – ASIC – ou reconfigurables mais adaptés à un traitement particulier. En réalité beaucoup de systèmes sont maintenant des SoCs, car ils permettent d’utiliser les transistors « gratuits » fournis par la loi de Moore : on met sur une même puce des circuits auparavant séparés, et assemblés via une carte électronique. Ainsi les processeurs généraux sont-ils souvent accompagnés d’un circuit de réseau ou vidéo. L’interconnexion des composants d’un SoC se fait via des IP qui y sont spécifiquement destinés, comme des bus, ou plus récemment via des réseaux sur puce[4]. Ces réseaux sont des réseaux informatiques, mais mis en œuvre avec les circuits qu’ils connectent directement sur une puce. Vous avez ainsi tout un monde désormais sur une même puce, comme un Internet miniature !

Le monde des circuits et des processeurs entre désormais dans l’ère du parallélisme massif. Cela a été longtemps souhaité, mais jusqu’à présent techniquement très difficile et limité; cela devient obligatoire.

L’idée de base du parallélisme est d’utiliser plusieurs processeurs pour un même calcul. C’est en fait très naturel : pour accélérer un calcul, utilisons plus de ressources. Mais cela n’est pas simple. En effet, les programmes d’ordinateur sont par nature séquentiels, c’est-à-dire qu’ils indiquent la succession d’opérations à exécuter l’une après l’autre. L’ordre d’exécution est normalement strictement défini. Bien sûr on autorise des instructions qui offrent de la richesse et de la généralité, comme les branchements, les boucles, ou la récursivité[5], c’est-à-dire la possibilité d’exécuter pour obtenir un résultat intermédiaire le même programme que celui qui est en cours, mais avec des paramètres de départ différents. Les quelques opérations élémentaires que l’on s’autorise définissent d’ailleurs la classe de programmes que l’on peut écrire, et c’est le fait qu’elles sont suffisamment générales qui permettent de mettre en œuvre une machine universelle[6].

On sait définir des langages parallèles, mais la difficulté est double : il est difficile pour un esprit humain de « penser parallèle »; il serait en outre assez pratique, voire indispensable d’être capable de paralléliser automatiquement la montagne de logiciel existant dans tous les domaines de l’informatique – sinon à les réécrire « à la main », avec un coût prohibitif. Et entre les deux, il faudrait former à nouveau les dizaines de millions de développeurs de logiciel professionnels. D’ailleurs, même s’ils étaient formés miraculeusement et instantanément à des méthodes pratiques de programmation parallèle encore à découvrir, ils ne suffiraient probablement pas à la tâche de réécriture !

On est donc confronté à un problème particulièrement épineux. Cela fait des décennies que l’on essaie de progresser, sans avancées décisives.

Et pourtant, il va falloir résoudre ce problème pour pouvoir traduire en performance pour les services applicatifs la poursuite de la loi de Moore. En effet,  il est devenu pratiquement impossible de rendre plus complexe ou efficace les processeurs en utilisant les transistors supplémentaires fournis gracieusement par la loi de Moore. Le « taux de rendement » était déjà sous linéaire dans la dernière période – c’est-à-dire que doubler le nombre de transistors impliqués dans un même processeur faisait bien moins que doubler sa performance; les idées d’amélioration ont été à peu près toutes explorées et mises en œuvre; l’augmentation de la fréquence – on se rappelle de la « course aux GHz » des processeurs de PC – est devenue impossible; et la chaleur dégagée par les processeurs augmentait démesurément, jusqu’à menacer de provoquer une température à la surface du processeur égale à celle du soleil !

Bref, il faut passer à un autre mode d’exploitation de la poursuite de la loi de Moore, et il n’y a pas d’autre solution que de mettre plusieurs processeurs sur une puce. On parle alors de multicore – « core » en anglais vaut pour « cœur », ou processeur simple; et même de manycore lorsque le nombre de processeurs devient trop grand pour pouvoir les considérer individuellement dans la programmation – reprenant ainsi une numération primitive 1 cœur, 2 cœurs, 4 cœurs… beaucoup de cœurs !

De multiples possibilités architecturales sont en compétition pour la mise en œuvre précise de ces nouvelles bêtes de calcul; aucune à ce jour ne permet de résoudre simplement le problème de la programmation parallèle, encore moins celui de la parallélisation automatique. Il va falloir faire des efforts. De ce point de vue les outils logiciels de programmation vont être clé, ainsi que les premiers domaines auxquels on va destiner ces nouvelles puces. Cette histoire a à peine commencé à être écrite, c’est dans une large mesure celle du futur du calcul.

On a néanmoins su « programmer et exécuter parallèle » dans des cas particuliers. C’est notamment le cas des architecture dites SIMD – pour Single Instruction, Multiple Data. Ce sont des architectures où une même instruction d’un programme séquentiel est exécuté en parallèle sur plusieurs éléments de données. Cela sert particulièrement dans le traitement d’image, où la même instruction d’une série est exécutée par exemple sur chaque pixel de l’image. Les processeurs graphiques permettant l’affichage sur les écrans sont de ce type – on les appelle des GPU, pour Graphical Processing Unit. Il existe des tentatives pour utiliser ces processeurs parallèles particuliers pour des calculs plus généraux auxquels ils ne sont pas destinés a priori, on appelle cela le GPGPU – General ProcessingGPU.


[1] Dans le « More than Moore » on met en œuvre d’autres fonctions élémentaires, comme des systèmes électro-mécaniques (MEMS, cf. infra), et on réalise grâce à cela des systèmes très variés, allant de capteurs à des systèmes radio.

[2] On utilise plutôt en réalité les « NOR » et les « NAND ».

[3] Dont la plus grande partie est néanmoins consacrée à la mémoire sur puce – la plus rapide – et pas au calcul en tant que tel.

[4] En anglais NoC pour Network on Chip.

[5] On utilise également l’anglicisme récursion.

[6] C’est ce résultat, généralisé en 1934 par Gödel à partir d’un résultat intermédiaire dans la démonstration de son théorème de 1931, qui a constitué la base de la découverte par Turing en 1936 des machines universelles – les ordinateurs.

Licence Creative Commons
Moore’s Law and the Future of [Technology] Economy de Jean-Luc Dormoy est mis à disposition selon les termes de la licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage à l’Identique 3.0 non transposé.
Basé(e) sur une oeuvre à mooreslawblog.com.