Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Comment augmenter la puissance des ordinateurs :
Les processeurs de Kalray, les propositions de Hennessy et Patterson
Article mis en ligne le 6 juin 2020
dernière modification le 8 juin 2020

par Laurent Bloch

Ce texte a été inspiré par un article de John Hennessy et David Patterson publié dans le numéro de février 2019 des Communications of the ACM après leur réception du Turing Award, A New Golden Age for Computer Architecture, et par la leçon inaugurale de Thomas Ebbesen au Collège de France.

Les processeurs Kalray à la pointe de l’informatique contemporaine

Kalray est une société française qui conçoit des microprocesseurs d’avant-garde. Elle a été créée en 2008 à l’initiative du CEA sur le polygone scientifique de Grenoble, principal pôle français (et sans doute européen) de micro-électronique. Grenoble est en effet un des lieux de naissance de l’informatique française, avec le laboratoire de Jean Kuntzmann, un important laboratoire IBM à l’origine (avec celui de Cambridge) de la notion de machine virtuelle, puis le Laboratoire d’électronique et de technologie de l’information (Leti) du CEA, l’usine STMicro de Crolles, sans compter de nombreuses entreprises plus petites et des laboratoires de recherche qui travaillent dans ce domaine.

Kalray a créé l’architecture MPPA (Massively Parallel Processor Array), qui met en œuvre l’exécution parallèle de programmes afin d’augmenter la puissance de traitement tout en maintenant la consommation d’énergie dans des limites raisonnables et en assurant des temps d’exécution prévisibles.

Les processeurs Kalray les plus récents (gamme Coolidge) comportent 80 cœurs (c’est-à-dire en fait 80 processeurs 64 bits VLIW à 1,2 GHz indépendants sur un même composant, ce qui permet des échanges à haut débit) réalisés en technologie 16nm par le fondeur taïwanais TSMC. Chaque cœur de calcul est doté d’un co-processeur de traitement de tenseur destiné aux applications d’apprentissage profond requises par les derniers développements de l’intelligence artificielle.

Malgré ces caractéristiques à la pointe des réalisations et des attentes de l’informatique contemporaine, Kalray reste cantonné à un marché de niche qui a du mal à décoller. Les lignes qui suivent montrent qu’ils ne sont pas les premiers dans cette situation, et tentent d’en expliquer les raisons.

Augmenter la puissance des ordinateurs par la vitesse du processeur

Les premiers facteurs d’amélioration des performances des ordinateurs viennent des progrès de l’électronique et de sa meilleure utilisation par le logiciel. Ainsi le premier embryon de ce qui n’était pas encore le système d’exploitation est apparu pour permettre la poursuite des calculs pendant les opérations d’impression, très lentes mais très peu consommatrices de calcul : c’était le début du multitraitement.

Progrès de la micro-électronique

Le microprocesseur est apparu au début des années 1970, et depuis le milieu des années 1990 tous les ordinateurs sont construits à partir de microprocesseurs, c’est-à-dire d’unités centrales sur un seul composant électronique. Aujourd’hui (2020) un tel composant peut comporter sur deux ou trois cm2 quatre milliards de transistors dont la grille mesure 7nm (nanomètres), pour une fréquence d’horloge qui peut dépasser 4GHz. La quantité de transistors disponible permet d’implanter sur ce composant par exemple 32 cœurs (cores), qui sont en fait des unités centrales indépendantes, plus de la mémoire, ainsi que des circuits auxiliaires pour l’accès au réseau et aux périphériques, et pour les téléphones les circuits radio, voix, vidéo, etc. (on parle alors de System on Chip, SoC).

L’accélération brute des micro-processeurs résulte de leur miniaturisation. Les progrès de la micro-électronique ont longtemps obéi à la loi de Moore, formulée en 1965 et révisée par son auteur, le fondateur d’Intel Gordon Moore, en 1975, qui énonce que la densité en transistors des composants double tous les deux ans. Elle est associée à une proposition de Robert Dennard, qui énonce qu’au fur et à mesure de l’accroissement de la densité des composants, la consommation électrique par transistor diminue de sorte que la consommation par mm2 reste constante.

La droite exponentielle prévue par la loi de Moore a commencé à fléchir en 2000, et l’énoncé de Dennard ne tient plus depuis 2012.

Parallélisme au niveau de l’instruction

D’un point de vue macroscopique, chaque unité centrale n’exécute qu’une instruction à la fois, mais cette limite est contournée au niveau microscopique par plusieurs procédés :

 Chaque instruction élémentaire du processeur, qui correspond à un ensemble physique de circuits électroniques, peut être décomposée en étapes distinctes, typiquement une quinzaine, ce qui permet de commencer l’exécution d’une instruction avant la terminaison de la précédente ; ainsi à un instant donné on peut avoir une quinzaine d’instructions en cours d’exécution, ce qui confère à la vitesse d’exécution un coefficient d’accélération important (mais limité par le fait que certaines instructions dépendent pour leur exécution du résultat d’une instruction précédente, ou peuvent déclencher une modification de la séquence des opérations). Cette technique, inaugurée en 1960 avec l’IBM 7030 Stretch, est appelée pipe-line.

 Il est possible d’avoir plusieurs unités d’exécution actives simultanément, c’est l’architecture super-scalaire. Combinée avec le pipe-line, cette technique permet d’avoir, par unité centrale et théoriquement, une soixantaine d’instructions en cours d’exécution.

 Le modèle à flux de données (dataflow) consiste à conserver en mémoire un certain stock d’instructions en attente, dont on déclenchera l’exécution dès que les opérandes seront disponibles, indépendamment de l’ordre du texte du programme.

 La prédiction de branchement consiste à garder la trace des résultats des tests de branchements précédents entre deux branches, disons A et B : si dans 9 cas sur 10 on a pris la branche A, on anticipe que la prochaine fois ce sera A, et on exécute à l’avance les instructions de la branche A, quitte à revenir en arrière si c’est B.

Les techniques ci-dessus opèrent au niveau microscopique, dit ILP (Instruction Level Parallelism).

Optimisations globales

La technique du cache réduit considérablement les temps d’accès aux données (cf. ici sur ce site). On peut résumer l’idée ainsi : garder dans une mémoire petite mais d’accès rapide les données qui ont été utilisées récemment, et dont on prévoit donc qu’elles seront réutilisées bientôt. Cette induction qui peut sembler simpliste est, curieusement, extrêmement bien vérifiée.

Les progrès incrémentaux de l’architecture des processeurs examinés à la section précédente ont été amplifiés par ce que l’on peut appeler sans emphase la révolution RISC (pour Reduced Instruction Set Computer), dont on trouvera une description sur ce site ici. À la toute fin des années 1970, une équipe d’IBM dirigée par John Cocke étudia la fréquence d’utilisation des différentes instructions et constata que seules les plus simples étaient réellement utilisées par les programmeurs et les compilateurs. Pour mémoire, 43 % des instructions étaient des déplacements de données d’un endroit à un autre, le quart des instructions étaient des branchements. Ces idées menèrent à des architectures beaucoup plus simples et plus efficaces que celles de la génération précédente dite (ex-post) CISC (pour Complex Instruction Set Computer), et après plus de trente ans de résistance l’architecture CISC Intel x86 a amorcé en 2011 un déclin de 10% par an, cependant que les processeurs RISC d’architecture ARM, plébiscités par les fabricants de téléphones mobiles et d’objets connectés divers pour leur faible consommation électrique, s’envolent avec une production de 20 milliards d’unités par an.

Les processeurs multi-cœurs permettent du vrai parallélisme entre des programmes qui s’exécutent concurremment, mais plus aussi. On nomme processus un programme en cours d’exécution, mais un processus unique peut engendrer plusieurs processus fils, qui vont pouvoir s’exécuter sur des processeurs (ou cœurs) différents. C’est ce qui se passe lorsque l’on ouvre plusieurs onglets dans un navigateur : à chaque onglet correspond un processus, isolé des autres, et c’est heureux parce qu’ainsi un programme mal écrit qui tourne sous l’onglet dévolu à un logiciel de jeu d’origine douteuse ne pourra pas communiquer (ou du moins pas trop facilement) avec l’onglet utilisé pour une opération sur votre compte en banque, par exemple pour subtiliser vos identifiants bancaires. Vous pouvez le vérifier en observant les processus en cours dans votre système, par exemple avec la commande Unix htop. Dans ce cas du navigateur la multiplication des processus ne pose pas de problème complexe de coordination et de synchronisation parce ce qui se passe pour un onglet est largement indépendant de ce qui se passe pour les autres.

Les progrès au niveau micro ralentissent

Les techniques d’amélioration des performances évoquées ci-dessus ont donné des résultats considérables, auxquels sont venus s’ajouter les améliorations des systèmes d’exploitation et des compilateurs. Les cinquante années de progrès ininterrompu qu’elles ont procurées sont peut-être sans précédent dans l’histoire de l’industrie, mais il semble bien que leur rendement s’infléchisse.

Par exemple, il semblait que la longueur d’onde de la lumière utilisée par les procédés photolithographiques de gravure des semi-conducteurs imposait une borne infranchissable (l’ultra-violet extrême) à leur miniaturisation : les physiciens ont découvert des procédés diaboliques [1] pour la franchir, mais lorsque le diélectrique ne fera plus que deux ou trois atomes d’épaisseur il faudra bien trouver autre chose.

Gagner en vitesse par multiplication des processeurs

En fait, depuis des décennies ingénieurs et chercheurs ont imaginé et réalisé des systèmes informatiques, matériels et logiciels, destinés à procurer de plus grandes capacités de calcul sans reposer sur le perfectionnement de la micro-électronique. Il s’agit, au lieu d’accélérer un processeur unique, d’obtenir la même accélération en faisant coopérer plusieurs processeurs moins rapides, selon le principe évoqué ci-dessus à propos de la multiplication des sous-processus du navigateur et de leur répartition sur différents processeurs ou cœurs de processeurs.

Dans le cas du navigateur nous avons vu que cet éclatement de processus principal en processus fils chargés de faire vivre chacun un onglet n’était pas trop compliqué parce que ces différents sous-processus étaient quasiment indépendants, leurs temps de réponse ne sont pas soumis à des contraintes drastiques, ils n’ont pas besoin de partager des zones de mémoire (surtout pas !), ils n’ont pas à se synchroniser. Il en va à peu près de même, par exemple, pour l’exploration d’une grande banque de données de séquences biologiques où l’on veut comparer une séquence cible à toutes celles de la banque : chaque comparaison est indépendante des autres, on peut partitionner la banque en autant de segments que l’on a de processeurs à disposition et répartir ainsi les traitements. Mais dans le cas général c’est plus compliqué et cela demande des solutions techniques savantes.

Nous allons examiner maintenant les méthodes radicales imaginées pour contourner la loi d’airain de l’architecture de von Neumann : une seule instruction à la fois.

Architectures SIMD (Single Instruction Multiple Data)

Comme le nom le suggère, il s’agit d’ordinateurs capables d’appliquer à un moment donné la même opération à un ensemble de données, ce qui postule une certaine similarité de celles-ci. Ce postulat est rarement satisfait dans le cas général, mais il s’applique bien à un cas particulier important, celui du calcul vectoriel ou matriciel, qui a de nombreuses applications pratiques en météorologie, en aérodynamique, en calcul de structures, en océanographie, en sismologie, bref dans tous les domaines pour lesquels la physique ne donne pas de solution analytique simple mais où un modèle heuristique étalonné sur des données recueillies pour des problèmes à solution connue et appliqué à un ensemble de données empiriques aussi vaste que possible permet d’atteindre une solution approchée satisfaisante. Le modèle SIMD a connu sous le nom d’ordinateur vectoriel un certain succès, qui se perpétue sous d’autres formes (proceseur graphique, dit aussi GPU, par exemple).

En réalité un processeur vectoriel ne dispose que d’un seule unité de contrôle, qui pilote de multiples unités d’exécution. La réalisation d’un tel ordinateur pose des problèmes théoriques raisonnablement solubles ; il en va de même pour la programmation.

Les super-ordinateurs Cray, Fujitsu, NEC, les mini-super Convex, les processeurs spécialisés Floating Point Systems ont connu de réels succès jusque dans les années 1980 et 1990 en employant à des degrés divers la technologie vectorielle.

Si la baisse de prix des processeurs ordinaires les a peu à peu écartées, ces architectures pourraient revenir en scène lorsque les progrès de la technologie classique rencontreront des obstacles sérieux, et s’appliquer assez bien à tous les problèmes de traitement et de création d’images. D’ailleurs le développement extraordinaire des jeux vidéo, qui sont aujourd’hui l’un des aiguillons les plus aiguisés de la recherche micro-électronique, a nécessité la conception de processeurs graphiques (GPU) époustouflants qui recyclent pas mal de technologie vectorielle et sont désormais utilisés pour quantité de problèmes avec des calculs matriciels (météorologie, dynamique des fluides, océanographie...).

Architectures cellulaires et systoliques

Le modèle SIMD poussé à son extrême donne le modèle cellulaire, conçu pour exploiter un parallélisme de données massif : on a toujours un processeur par donnée, les processeurs sont très simples mais ils se comptent par dizaines de milliers. Il y eut surtout des prototypes de laboratoire, excepté le premier modèle de la Connection Machine de l’entreprise modestement nommée Thinking Machines Corporation (créée en 1983, dissoute en 1994). Cet ordinateur, doté de 65 536 processeurs, chacun flanqué d’une mémoire locale de 65 536 bits, avait été conçu par Daniel Hillis, un étudiant en intelligence artificielle au MIT et réalisé grâce à une commande du DoD (ministère de la Défense américain). Il s’en vendit une vingtaine d’exemplaires (dont deux en France) pour un coût unitaire équivalent à une dizaine de millions de dollars.

Une variante du modèle cellulaire est l’ordinateur systolique, qui exploite en outre un parallélisme de flux de données : un vecteur de données passe par des processeurs successifs qui correspondent à des étapes successives de calcul et qui effectuent chacun un type d’opération.

Il convient également de mentionner la conception et la réalisation de processeurs systoliques spécialisés pour certaines applications, notamment la comparaison de séquences biologiques. La plupart de ces processeurs, par exemple le réseau systolique linéaire SAMBA de 256 processeurs pour la comparaison de séquences biologiques développé par Dominique Lavenier à l’IRISA de Rennes, implémentent l’algorithme classique de Smith et Waterman (un algorithme dit de « programmation dynamique »).

Architecture MIMD (Multiple Instructions Multiple Data)

Les machines MIMD sont des ordinateurs capables d’exécuter simultanément de nombreuses instructions quelconques appliquées à des données également quelconques. En fait il y a de multiples processeurs qui se partagent une mémoire unique, parfois ils ont chacun en plus une mémoire locale, quelquefois ils n’ont qu’une mémoire locale. L’architecture des machines créées par Kalray entre dans cette catégorie. L’interconnexion de tous ces processeurs, leur synchronisation et le maintien de la cohérence de la mémoire partagée posent des problèmes absolument passionnants de conception du matériel et du système d’exploitation : une fois ceux-ci résolus il reste à programmer tout ça, et c’est là qu’achoppe l’ambition de ces tentatives. La complexité de la programmation est telle que le temps qu’elle absorbe suffit aux processeurs ordinaires pour combler l’écart de performance que l’architecture MIMD était censée creuser. Ces architectures connaîtront une nouvelle faveur lorsque la courbe inexorable du progrès des processeurs de von Neumann s’infléchira, c’est-à-dire, on l’a vu, très bientôt.

Processus séquentiels communicants

Nous ne saurions terminer ce tour d’horizon des architectures multi-processeurs sans évoquer les processus séquentiels communicants (Communicating sequential processes, CSP) proposés par C. A. R. Hoare dans un article de 1978 pour la programmation dans de tels contextes. Anthony Hoare est sûrement un des chercheurs en informatique les plus créatifs depuis la naissance de la discipline. La lecture du livre qu’il a consacré au sujet est un plaisir que je ne saurais que recommander au lecteur.

Ce qu’en pensent Hennessy et Patterson

MM. Hennessy et Patterson ne sont en aucune façon des seconds couteaux en la matière : juste après John Cocke ils furent des leaders de la révolution RISC, d’abord par leurs travaux de recherche, respectivement à Stanford et à Berkeley, puis par leurs réalisations d’ingénieurs (les gammes de processeurs MIPS et RISC-I (à l’origine de SPARC) à RISC-V sont issues de leurs travaux respectifs), par leurs activités industrielles, et enfin par l’écriture d’un livre extraordinaire qui a transformé la conception de l’architecture des ordinateurs pour plusieurs générations d’ingénieurs et d’utilisateurs.

Quels sont leurs avis sur les moyens de continuer à faire progresser les performances des ordinateurs alors que nous sommes au pied de la falaise de la miniaturisation, qui exige désormais des coûts de développement et des investissements productifs tellement déments que plus personne ne peut entrer sur ce marché ?

Spécialiser et améliorer les langages de programmation

Hennessy et Patterson mettent en exergue l’extraordinaire inefficacité des langages à la mode, généralement interprétés, tels que Python. Ils préconisent des architectures spécialisées (Domain Specific Architectures, DSA) conçues en collaboration par des spécialistes du matériel et du logiciel, avec des Domain Specific Languages (DSL), conçus pour un type particulier d’application. Est-ce que cela pourra être à la fois efficace et économiquement abordable ? Réponse ci-dessous :

Des architectures matérielles ouvertes

Si la fabrication de processeurs à usage général et à la pointe de l’état de l’art nécessite des investissements colossaux, des designs plus raisonnables peuvent se révéler « étonnamment bon marché. Un architecte [(informatique)] peut commander 100 chips d’1mm2 pour seulement 14 000 dollars. En 28nm, 1mm2 contient des millions de transistors, suffisamment pour implanter un processeur RISC-V [(une architecture complète, ouverte et librement disponible)] et un accélérateur NVDLA » (Nvidia Deep Learning Accelerator, également une architecture libre). Ce n’est pas une production industrielle, mais suffisant pour un prototype de démonstration. Incidemment, la géométrie 28nm est en production dans l’usine STMicro à quelques kilomètres du siège de Kalray...

L’architecture RISC-V, élaborée à l’origine par l’équipe de David Patterson à Berkeley et maintenue sous les auspices d’une fondation du même nom, répond à l’idée d’un « Linux des processeurs ». Elle existe en 32 et 64 bits, avec une base minimum suffisante pour exploiter les logiciels libres habituels et des extensions facultatives telles que le calcul en virgule flottante. La base minimum comporte 50 instructions, auxquelles les extensions les plus courantes viennent en ajouter 87 (contre plus de 500 pour ARMv8).

Conclusion

À un passage de leur texte Hennessy et Patterson citent Shimon Peres : « Si un problème n’a pas de solution, ce n’est peut-être pas un problème, mais un fait - qu’il ne s’agit pas de résoudre, mais dont il va falloir s’accommoder au fil du temps ». Le fait envisagé ici est la fin de la loi de Moore et de la mise à l’échelle de Dennard, le moyen de s’y adapter, proposent-ils, sera de substituer aux processeurs très rapides actuels des matrices de processeurs plus frustes mais qui procureront des performances équivalentes. Il y aura un prix à payer : la complexité de la programmation de ces multi-processeurs.

En effet, la force des évolutions techniques jusqu’à ce jour est qu’elles ont permis de contourner l’architecture de von Neumann tout en continuant à présenter au programmeur une image du processeur inchangée depuis plus d’un demi-siècle (ou peu s’en faut). Les évolutions proposées par Hennessy et Patterson rendent le multitraitement explicite, ce qui va demander aux programmeurs de programmer selon des méthodes qu’ils n’ont, pour beaucoup, pas apprises.