Directeurs de thèse : Alexandre DENIS et Raymond NAMYST

 

Courriels : Alexandre.Denis@labri.fr, Raymond.Namyst@labri.fr

 

Équipe: SATANAS (Runtime)

 

 

Description synthétique du sujet

 

L'avènement des processeurs multi-coeurs a changé la physionomie des grappes de calcul qui sont désormais souvent constituées de noeuds dotés de nombreux coeurs et de plusieurs interfaces réseaux. Certaines applications et modèles de programmation placent plusieurs processus sur de tels noeuds. Au niveau du sous-système chargé des communications réseaux, il s'agit alors de gérer l'accès à N cartes réseaux par P processus simultanément.

 

Là où l'approche "classique" consiste à attribuer statiquement des cartes aux processus et à gérer les communications localement à l'intérieur de chaque processus, le sujet proposé s'intéresse aux optimisations envisageables avec une approche dynamique et globale entre tous les processus d'un noeud. En particulier on s'intéressera à l'agrégation de messages issus de plusieurs processus envoyés en un seul paquet, aux techniques utilisant plusieurs cartes réseaux pour un seul message (multi-rail) avec une allocation dynamique du nombre de rails en fonction du trafic des autres processus, y compris le trafic prévisible par des heuristiques mettant en jeu une analyse du code ou une instrumentation des applications.

 

 

Description détaillée du sujet:

 

Depuis quelques années, l'émergence des processeurs multi-coeurs a radicalement changé la physionomie des machines courantes, ce qui a eu des repercussions sur les grappes de calcul. Alors qu'il était typique auparavant qu'une grappe soit constituée de noeuds à deux processeurs, la tendance actuelle se porte plutôt vers des noeuds dotés de deux ou quatre processeurs, dotés chacun de deux à quatre coeurs, pour un total jusqu'à seize coeurs par noeud. Cette tendance à l'augmentation du nombre de coeurs par noeud est nette et semble durable. Cette évolution du matériel a des répercussions à plusieurs niveaux, en particulier sur le modèle de programmation et sur l'accès au réseau.

 

Avec l'augmentation du nombre de coeurs par noeud, le modèle de programmation qui était standard jusque là, à savoir une programmation du parallélisme au travers de la seule interface MPI (Message Passing Interface) avec un processus de calcul par coeur, n'est plus adapté. Il conduirait à de très nombreux processus par noeud, entrainant une important consommation mémoire et un échange de nombreux messages MPI au sein d'un noeud, conduisant à des performances suboptimales car ces messages pourraient être évités étant donné que les processus tournent sur le même noeud donc pourraient partager directement de la mémoire. Pour résoudre ce problème de passage à l'échelle de MPI, une solution qui commence à être assez largement acceptée dans la communauté consiste à utiliser le langage OpenMP pour gérer le parallélisme en mémoire partagé à l'intérieur d'un noeud, et de cantonner MPI au passage de messages inter-noeud, ce qui mène à une solution hybride OpenMP+MPI.

 

Cependant, cette solution a des répercussions au niveau de l'accès au réseau. En effet, les implémentations MPI en particulier, et les bibliothèques d'accès au réseau d'une manière générale, ne sont pas conçues pour fonctionner en environnement multi-thread. Il se pose de nombreux problèmes tels qu'une concurrence entre les threads de calcul et les threads réalisant des accès au réseau menant à un problème de réactivité, ou encore des accès par plusieurs threads simultanément et de façon concurrente à une même carte réseau. Ces questions sont l'objet de la thèse de François Trahay, thèse actuellement en cours depuis 2006.

 

Pour absorber le flux de communication réseau des nombreux coeurs, il est désormais courant que les noeuds des grappes de calculs soient dotés de plusieurs cartes réseau. Par ailleurs, les modèles de programmation hybrides OpenMP+MPI tels que celui proposé dans l'équipe Runtime dans la thèse de Jérôme Clet-Ortega évoluent vers des solutions intermédiaires, avec plusieurs processus multi-threads par noeud.

 

L'objet de ce sujet de thèse est de s'intéresser aux problématiques posées à bas niveau dans les biliothèques de communication, consécutivement aux évolutions des architectures et des modèles de programmation hybrides. Il s'agira alors pour le candidat de s'intéresser aux aspects suivants :

 

Imaginer un canevas capable de gérer à bas niveau plusieurs cartes réseau, accédées simultanément par plusieurs processus, chaque processus étant lui-même composé de plusieurs threads. Il semble opportun d'envisager une optimisation et un ordonnancement des messages à un niveau inter-processus, globalement sur chaque noeud. Par exemple, notre implémentation actuelle NewMadeleine est capable d'agréger des messages consécutifs d'une application en un seul paquet émis sur le réseau ; il est attendu d'appliquer des schémas d'optimisation similaires mais à un niveau global entre plusieurs processus.

 

Tirer profit des nouvelles opportunités d'optimisation offertes par l'augmentation du nombre de ressources et du nombre de processus. Par exemple, nos stratégies actuelles de multi-rail gèrent deux cartes réseaux et découpent systématiquement les paquets pour maximiser le taux d'occupation des cartes. Avec des cartes réseaux plus nombreuses et plusieurs processus, il devient pertinent d'envisager une adaptation dynamique du nombre de cartes allouées aux communications pour garder de la bande passante disponible pour les éventuelles communications qui pourraient être issues d'autres threads ou processus. Il semble également pertinent d'explorer des stratégies d'optimisation plus poussées qui pourraient tirer profit de la connaissance du comportement de l'application, connaissance acquise par des techniques d'instrumentation du code ou extraite à la compilation.

 

Étudier le passage à l'échelle des mécanismes impliqués, aussi bien en nombre de threads qu'en nombre de processeurs et de cartes réseau. Il semble désormais acquis qu'il n'est plus approprié de ne considérer que des cas particuliers avec un ou deux processeurs et une ou des cartes réseau, mais qu'il faille au contraire considérer N ressources.

 

Valider la proposition par une implémentation, évaluer les performances par des micro-benchmarks, et évaluer le comportement global de la solution proposée avec des applications complètes. À cette occasion, l'étudiant sera amené à travailler en collaboration avec les autres membres de l'équipe s'intéressant aux modèles de programmation hybrides.