Tout domaine technique démarre avec des équipes composées de personnes multi-expertes et très pointues. Les premiers constructeurs automobiles étaient à la fois mécaniciens, chimistes, pilotes, électriciens, etc. Dans l'informatique, c'est pareil.
Les premiers ordinateurs ont été conçus dans les années 40-50 par des chercheurs dans le cadre de projets militaires pour calculer des trajectoires balistiques. À cette époque, ces chercheurs sont à la fois physiciens, mathématiciens, électroniciens, logiciens… Ils conçoivent en même temps le problème physique, la formulation mathématique à résoudre et la machine capable de résoudre ce problème. On ne parle pas alors de logiciel : les premiers superordinateurs comme ENIAC sont conçus pour résoudre un problème et un seul. En effet, les ressources de calcul sont très limitées : n’oublions pas que le calculateur utilisé pour préparer les missions Apollo était moins puissant que la calculatrice d’un collégien d’aujourd’hui ! Tous les moyens sont donc mis en œuvre pour permettre d’exploiter au mieux ces ressources. Ainsi, certaines hypothèses physiques peuvent-elles avoir leur traduction directe dans l’architecture des composants de calcul utilisés. Pour passer à un autre problème, il faut alors changer l’architecture de la machine : la « recabler », voire la démonter et la remonter autrement… Ce qui pouvait prendre plusieurs jours.
Heureusement, les scientifiques ne repartent pas de zéro à chaque fois : certains composants, nécessaires à tous les calculs scientifiques, ont fini par se standardiser. Ainsi, la façon de représenter les nombres s’est-elle standardisée afin de permettre de réutiliser des conceptions existantes lors des mises à niveau de matériel. Ainsi, standard de fait depuis plusieurs années la représentation des nombres flottants (les « float » et les « double ») tel que nous la connaissons a été normalisée en 1985 et a été étendue en 2008. Dans un second temps, les unités de calcul elles-mêmes ont été standardisées. Par exemple, en 1967, IBM produit le co-processeur IBM System/360 Model 91, un des premiers accélérateurs de calcul flottant (Floating Point Unit ou FPU).
Cette standardisation du matériel s’est accompagné de l’émergence d’approches plus haut niveau pour décrire les problèmes à résoudre. Parmi les exemples notables, citons l’exemple de FORmula TRANslator, plus connu sous le nom FORTRAN, dont la première version a été publiée en 1954 et qui sera officiellement standardisé pour la première en 1966 par l’ANSI. Lisp, un langage ayant marqué le monde de la recherche en intelligence artificielle date également de cette période puisque la première version date de 1958. Ces standardisations sont l’occasion de spécialiser les rôles dans les équipes et permettent in fine de créer de nouveaux champs disciplinaires : certaines personnes conçoivent le matériel de calcul tandis que d’autres implémentent les logiciels utilisant ce matériel. Le lien étant fait par des logiciels spécialisés appelés compilateurs ou interpréteurs. Bien sûr, pour écrire ces compilateurs, il convient de connaître aussi bien le langage de programmation que l’architecture matérielle. Néanmoins, il n’est plus nécessaire de connaître la physique des problèmes à résoudre, ni les mathématiques associées et de l’autre côté il n’est plus nécessaire de connaître la physique des semi-conducteurs permettant de concevoir les processeurs. Les théories des langages, des graphes ou de l’information, l’intelligence artificielle ou encore l’optimisation combinatoire sont autant de domaines scientifiques qui ont beaucoup progressé pendant les années 1970-1980 grâce à ces efforts de standardisation.
Les années 1980 sont également le témoin de la démocratisation de l’outil informatique dans les centres de recherches et les entreprises les plus avancées. Cette démocratisation permet l’émergence de formations aux métiers de l’informatique : l’informatique n’est plus le pré carré des scientifiques. C’est le socle commun d’une véritable industrie impactant le cinéma (les première images de synthèses datent de 1978 dans Star Wars), les jeux qui deviennent vidéos, les services bancaires, les communications, etc. Il est alors naturel que poussée par les enjeux économiques et sociétaux, une partie de la communauté s’investisse pour proposer des outils et des méthodes permettant à la fois un apprentissage plus facile, une productivité plus élevée et une maintenance moins coûteuse. MatLab a été créé en 1984 dans le but de faciliter l’apprentissage et la mise en œuvre de logiciels mathématique : l’objectif était que des étudiants puissent l’utiliser et être opérationnels suffisamment rapidement pour l’utiliser dans le cadre de cours de mathématiques. Initié au début des années 1990, Java est un très bon exemple de langage et d’environnement tourné vers la productivité (simple d'accès car impératif, orienté objet, managé, fortement typé). C#, apparu quelques années plus tard s’inscrit dans la même dynamique.
Ces évolutions vers plus de facilité dans le développement ont naturellement un coût. En effet, ces abstractions ont un impact non négligeable sur les performances. Grâce à l’augmentation de la puissance de calcul des processeurs, cet inconvénient est progressivement devenu négligeable devant les gains en temps de développement et de maintenance. Aujourd’hui, rares sont les applications pour lesquelles un réel effort d’optimisation est nécessaire. De fait, la plupart des applications aujourd’hui utilisées pourraient consommer au moins deux fois moins de puissance de calcul ; l’effort d’optimisation n’en vaut simplement pas la peine puisque les ordinateurs (ou téléphones) sont suffisamment puissants pour permettre l’exécution de logiciels non optimisés. Pour que l’effort d’optimisation soit justifié, il faut que le coût de l’optimisation soit inférieur au coût du temps perdu. Ainsi, consacrer du temps à optimiser le code d’un jeu comme le solitaire est-il totalement absurde : la valeur des quelques millisecondes qui pourraient être gagnées ici ou là est rigoureusement nulle. A l’inverse, investir du temps dans l’optimisation des performances d’un logiciel de rendu d’images 3D est totalement justifié dans le domaine des films d’animation. En effet, le coût matériel de rendu d’un film est très élevé et les gains induisent un retour sur investissement assez rapide.
Pour optimiser les performances des logiciels, les approches les plus poussées nécessitent de travailler à la fois la modélisation, les algorithmes et l’implémentation en prenant en compte les caractéristiques de l’architecture matérielle employée. Autrement dit, elles impliquent de revenir au moins partiellement sur les abstractions qui ont été introduites au cours des dernières décennies. Les bibliothèques de calcul parmi les plus performantes à ce jour comme la bibliothèque d’algèbre linéaire GOTO BLAS sont d’ailleurs écrites en langage assembleur, le langage de plus bas niveau possible.
Aujourd’hui, de plus en plus d’applications nécessitent ce haut niveau de performances (physique, météo, exploration pétrolière, simulations de crash-tests, calcul financiers, chimie moléculaire, pharmaceutique, cosmétique, cinéma, jeux-vidéo, etc.) et de plus en plus d’efforts sont fournis afin d’obtenir des outils offrants à la fois un haut niveau d’abstraction et un niveau de performance élevé. Ainsi les évolutions récentes apportés au langages C++ ont-elles été conçues pour permettre de concilier performances et haut niveau d’abstraction. Cette tendance s’étend par ailleurs aux langages qui n’ont pas été conçus au départ pour fournir un haut niveau de performances. Par exemple, en 2015, Microsoft a étendu le langage C# pour permettre au développeur d’exploiter les unités vectorielles des processeurs.
Pour répondre à ces besoins, de plus en plus d’outils optimisent leur fonctionnement en fonction du matériel. Par exemple, dans le domaine de l’algèbre linéaire, les bibliothèques C++ Eigen et NT² permettent de se rapprocher fortement du langage mathématique tout en prenant en charge les optimisation bas niveau. Le Machine Learning est un autre exemple de domaine et est peut-être celui qui permettra de sensibiliser le plus de personnes à ces différents enjeux. En effet, les enjeux y sont tels que les géants du web ont tous développé leurs outils optimisés et le proposent tous à la communauté (TensorFlow de Google ou Cognitive Toolkit de Microsoft en sont des exemples). Ces outils répondent à la fois aux besoins de performances et aux besoins de facilité de maintenabilité des applications. Ainsi permettent-ils aux Data Scientists de se concentrer sur leur métier en se souciant moins des enjeux de performances.
Cette approche consistant à concevoir les outils spécifiques à un domaine applicatif conciliant et les enjeux de performances et les enjeux de simplicité d’utilisation fait partie des valeurs ajoutée d’ANEO. Par exemple, ce type d’outil permet à des quants d’utiliser efficacement des architectures matérielles aussi diverses que le x86 (multithreadé et vectorisé), le GPU et le Xeon Phi à partir d’un même code source métier. Elle permet à des numériciens d’exprimer leur problème d’algèbre linéaire et de cibler efficacement le x86 ou le GPU.
Nous expérimentons actuellement la généralisation de ces approches aux architectures distribuées à travers deux projets :
- Un projet visant à permettre aux utilisateurs de composer dynamiquement des flux de traitement d’image et de machine learning en ciblant à la fois CPU x86 et GPU
- Un projet visant à concevoir un code de propagation d’ondes sismiques sur architecture distribuée à base de CPU x86, ARM ou Power8
Nous vous en parlerons dans de prochaines publications qui leurs seront consacrées. Nous vous parlerons également très prochainement du FPGA et de son intérêt pour faire du calcul.