De nos jours, les machines multiprocesseurs ont des niveaux mémoire de plus en plus hiérarchisés: les systèmes Opterons sont en fait des NUMAs, les puces bicore peuvent partager un niveau de cache, les processeurs logiques HyperThreadés partagent quasiment tout, on leur adjoint des cartes accélératrices, ... Comment ordonnancer correctement des calculs scientifiques non réguliers sur de telles machines ?!
L'idée de base que j'ai développée durant ma thèse est de fournir aux programmeurs un moyen d'exprimer comment les threads de leurs application sont reliés: des bulles. Une bulle exprime par exemple que certains threads travaillent sur le même jeu de données, qu'ils communiquent souvent ensemble, ... si bien qu'ils devraient être ordonnancés dans le même "coin" de la machine ; ceci de manière hiérarchique.
J'ai développé une API qui permet de manipuler ces bulles avec un haut niveau d'abstraction. Ainsi, on peut expérimenter différents ordonnanceurs de distributions sans avoir à se soucier des détails techniques. On peut réellement se concentrer sur les problèmes algorithmiques.
J'ai développé quelques "ordonnanceurs à bulles" qui manipulent de telles hiérarchies de bulles: étaler la charge de calcul tout en prenant en compte les affinités, gang scheduling, vol de travail. Des stagiaires ont ensuite pu expérimenter d'autres stratégies: privilégier les affinités avant tout, prendre en compte la quantité des données utilisées, leur partage et la fréquence d'accès, ... Tout cela d'une façon qui peut s'adapter automatiquement à n'importe quelle machine hiérarchisée ! La thèse de François Broquedis a alors développé ces ordonnanceurs, en les expérimentant sur des applications OpenMP.
Ma thèse est disponible en PDF.
Ceci est développé au sein de Marcel, la bibliothèque de threads à la fois efficace, portable et flexible du projet PM2.
De mes travaux sur la hiérarchie d'une machine, nous avons extrait une brique logicielle, HwLoc, qui s'occupe d'abstraire les détails de détection et représentation de la hiérarchie d'une machine, qui est modélisée sous forme d'un arbre annoté. Les applications de calculs peuvent ainsi facilement, de manière portable, manipuler explicitement des « cœurs », des « sockets », mais aussi considérer la machine comme une hiérarchie générique, sans se soucier des détails architecturaux. Cette brique est désormais utilisée dans toutes les grandes implémentations de l'interface de communication MPI, et dans de nombreux projets de calcul. Elle est ainsi présente dans la majorité des centre de calculs.
Cédric Augonnet, durant sa thèse sous ma direction, a élaboré un environnement pour ordonnancer des tâches sur des machines hétérogènes. L'idée est d'essayer d'effectuer toutes les optimisations à l'exécution: les transferts de données sont minimisés et effectués à l'avance, recouverts par les calculs, et interagissent avec les décisions d'ordonnancement de tâches. Ces dernières prennent en compte des modèles de performance des tâches, ce qui permet de capturer l'aspect hétérogène de la machine, et même d'en profiter ! StarPU est en train d'être intégré dans des bibliothèques de calcul scientifique telles que pour combiner les implémentations de référence d'algèbre linéaire PLASMA and MAGMA.