Des applications et des usages toujours plus gourmands en performance
L’évolution des architectures matérielles, l’augmentation des performances dans les calculs et les accès mémoire et la réduction de la consommation énergétique ont permis le développement de nouveaux usages. La révolution des smartphones depuis l’introduction en 2007 du premier iPhone a apporté au public et concentré téléphone, accès Internet, écran tactile, localisation GPS et appareil photo dans un même objet capable de tenir dans la poche. Des applications innovantes sont apparues, profitant du modèle économique de ces nouveaux appareils, fondés sur des marchés d’applications payantes. Ces applications ont parfois transformé certains usages sociaux, à l’exemple de Twitter et Periscope, qui ont bouleversé le partage d’informations et d’actualités, ou Tinder, qui a révolutionné le monde des rencontres en ligne.
À la suite du succès de l’iPhone, Apple a introduit l’iPad en 2011, tablette tactile à michemin du smartphone et de l’ordinateur portable. Dédiées principalement au divertissement et à la consommation de contenus, les tablettes tactiles ont également connu un large succès, quoique moindre, principalement dû au grand nombre d’applications compatibles. Depuis, les smartwatches et les bracelets fitness ont annoncé l’émergence de l’Internet des objets. Les objets du quotidien, connectés, se piloteront désormais depuis le téléphone ou la tablette. Les performances des téléphones et des tablettes tactiles ont évolué en parallèle du matériel qui les compose. Les puces graphiques des téléphones actuels ont ainsi des capacités similaires à celles des consoles de salon d’il y a dix ans. Les jeux vidéos, comme Angry Birds, Candy Crush ou plus récemment Clash of Clans, se sont développés sur ces nouveaux supports. Caractérisés par leur contenu monétisé et la forte attractivité de leurs parties rapides, ces jeux ont rapporté un grand profit à leurs créateurs. Toutefois, l’usage vidéo-ludique tend à réduire l’autonomie des appareils, facteur critique de la mobilité. En réponse, les récents développements dans les processeurs centraux et graphiques évoluent vers une réduction de la consommation énergétique, et donc vers une meilleure efficacité.
Aujourd’hui, les puces graphiques des téléphones portables sont suffisamment puissantes pour proposer la réalité virtuelle (au travers par exemple du Samsung Gear VR) ou la réalité augmentée à tous. L’application phare au moment de l’écriture de ces lignes est en effet Pokémon Go, un jeu pour smartphone liant géolocalisation et réalité augmentée. Là encore, ces fonctionnalités nécessitent beaucoup d’énergie et nuisent à l’autonomie. En parallèle de ces applications grand public, les systèmes embarqués présents dans la plupart des véhicules actuels, des voitures aux sondes spatiales en passant par les avions, régissent un grand nombre de fonctions, de la fusion de capteurs aux systèmes multimédia. Dans ces systèmes, la consommation énergétique joue en général un rôle critique.
À l’autre bout du spectre, certaines disciplines scientifiques nécessitent une grande puissance de calcul afin de résoudre les équations de la chromodynamique quantique ou de la météorologie, par exemple, afin de déterminer l’impact du changement climatique. Les GAFAM (Google, Apple, Facebook, Amazon et Microsoft, grands acteurs du monde numérique actuel), les NATU (les nouveaux challengers que sont Netflix, Airbnb, Telsa et Uber) et les BATX (Baidu, Alibaba, Tencent et Xiaomi, les concurrents chinois) ont, pour gérer l’ensemble des données à leur disposition, fait construire des centres de données partout dans le monde : c’est l’informatique en nuage. Les serveurs contenus dans ces datacenters fonctionnent en continu et dégagent de la chaleur, qui doit être évacuée en permanence. Une diminution de quelques pour cent de la consommation énergétique de ces serveurs peut économiser beaucoup d’argent.
Domaine actuellement en plein essor, l’apprentissage artificiel requiert également une grande puissance de calcul, afin d’entraîner des réseaux de neurones de plus en plus profonds.
Les processeurs graphiques haut de gamme ciblent désormais ce domaine d’applications dans lequel ils excellent [38]. Les crypto-monnaies virtuelles, comme le Bitcoin [17], nécessitent, elles aussi, du matériel spécifique et de fortes quantité d’énergie pour valider les transactions et créer de la monnaie ex nihilo à travers le « minage ».
Le traitement d’images, un domaine applicatif en plein essor
L’émergence des smartphones a mis une caméra dans toutes les poches. De nombreuses applications s’appuient sur cette fonctionnalité ubiquitaire pour proposer, par exemple, des filtres Instagram ou de la reconnaissance faciale pour « tagger » ses amis sur Facebook. Les avancées modernes dans le champ de la vision par ordinateur reposent principalement sur les techniques modernes d’apprentissage artificiel et, notamment, sur les réseaux de neurones profonds, champ d’étude exacerbant la concurrence entre les grandes entités du monde numérique — Google, Microsoft et Amazon ayant récemment ouvert au public leurs logiciels de deep learning.
Ces techniques de traitement d’images permettent notamment de reconnaître des objets automatiquement, voire de proposer une description à partir d’une image. Ces travaux sont clés dans le développement des véhicules autonomes, afin notamment de pouvoir déchiffrer la signalisation routière et repérer correctement les usagers à proximité. Des applications moins futuristes, comme la reconnaissance optique de caractères ou le post-traitement d’imagerie médicale, sont déjà utilisées à l’heure actuelle. par exemple à partir d’une image issue d’un radar automatique. Couplée à un système de reconnaissance de caractères et à la base de données adéquate, cette application permet d’envoyer directement et automatiquement les amendes pour excès de vitesse à l’adresse du propriétaire du véhicule contrevenant et, par conséquent, contribue à la sécurité routière.
La compilation, entre applications, bibliothèques et matériel
La compilation consiste à convertir un langage de programmation en un autre. Les compilateurs standards, par exemple GCC [109] ou LLVM [84], transforment des applications ou des bibliothèques écrites à la main dans des langages de programmation de haut niveau, comme C ou C++, vers des langages de programmation de plus bas niveau, comme l’assembleur ou le langage machine. Les compilateurs sont capables d’optimiser le code machine généré pour différentes cibles matérielles, en s’appuyant sur des représentations internes performantes. Cependant, l’espace d’optimisation se montre habituellement trop vaste pour être complètement parcouru, et le contrôle laissé aux développeurs par les langages de la famille du C empêche parfois certaines optimisations. Les langages spécifiques à un domaine, en anglais DSLs (« Domain-Specific Languages »), sont des langages de haut niveau censément faciles à utiliser pour développer rapidement des applications dans un domaine donné, en limitant les connaissances nécessaires sur les architectures cibles. Les concepteurs de DSLs font le lien avec les cibles matérielles grâce au compilateur, qui va pouvoir implémenter des optimisations spécifiques au domaine et des optimisations spécifiques aux matériels. Certains DSLs reprennent la syntaxe d’un langage de programmation plus généraliste. On les qualifie alors de DSLs embarqués ou embedded DSLs (e-DSLs). Les interfaces de programmation de FREIA et de SMIL s’apparentent ainsi à des DSLs embarqués, le langage hôte étant C dans le cas de FREIA, et C++ ou Python pour SMIL.
|
Table des matières
1 Introduction
1.1 Microprocesseurs : vers la fin de l’évolution exponentielle ?
1.2 Des applications et des usages toujours plus gourmands en performance
1.3 Le traitement d’images, un domaine applicatif en plein essor
1.4 La compilation, entre applications, bibliothèques et matériel
1.5 Sujet
1.6 Contributions
1.7 Structure de la thèse
2 Évolutions matérielles et modèles de programmation
2.1 Des architectures innovantes
2.1.1 Les processeurs multicœurs et l’évolution vers la mobilité
2.1.2 Les processeurs graphiques : toujours plus de complexité
2.1.3 L’avènement des processeurs manycore
2.2 Modèles de programmation et architectures matérielles
2.2.1 Processeurs multicœurs et programmation parallèle explicite
2.2.2 Passage de messages et mémoire unifiée dans les architectures distribuées
2.2.3 Le flot de données : le parallélisme de tâches explicite
2.2.4 La délocalisation des calculs dans les architectures hétérogènes
2.2.5 Les interfaces de haut niveau : le confort au détriment de la flexibilité ?
2.3 Conclusion
3 Traitement d’images et bibliothèques logicielles
3.1 Le traitement d’images aujourd’hui
3.2 La morphologie mathématique, une branche du traitement d’images
3.3 Des bibliothèques pour le traitement d’images
3.3.1 FREIA, un framework pour l’analyse d’images
3.3.2 SMIL, une bibliothèque moderne d’analyse d’images
3.3.3 Des ponts entre SMIL et FREIA
3.4 Conclusion
4 Compilation d’un langage dynamique vers un langage statique
4.1 Concilier programmabilité et portabilité : le cas du traitement d’images
4.2 Application à SMIL et FREIA
4.2.1 SMIL, une bibliothèque avec une interface Python
4.2.2 FREIA, un framework pour les accélérateurs matériels
4.2.3 Comment combler le fossé ?
4.3 Manipulation et accélération de code Python
4.3.1 RedBaron, un outil pour le refactoring de code Python
4.3.2 Cython, un compilateur de Python vers C
4.4 De SMIL à FREIA
4.4.1 Génération de code C avec Cython
4.4.2 D’une API à l’autre
4.5 Évaluation de l’approche
4.6 Conclusion
5 Parallélisme multiprocesseur à mémoire partagée
5.1 Programmation parallèle sur architecture à mémoire partagée
5.1.1 Les threads, briques de base du parallélisme de bas niveau
5.1.2 Le parallélisme dans les unités de calcul
5.2 SMIL, des traitements d’images nativement parallèles
5.2.1 Le parallélisme dans le traitement d’images
5.2.2 SMIL, un parallélisme natif
5.3 Des applications SMIL parallèles sur un cluster de calcul du MPPA
5.3.1 MPPA et OpenMP
5.3.2 Compilation croisée de SMIL vers un cluster de calcul
5.3.3 Gestion des transferts d’images
5.3.4 Tests de performance
5.4 Conclusion
6 Le modèle flot de données
7 Conclusion