Les clusters de Calcul Haute Performance (HPC) sont composés de multiples unités de calcul ou
de stockage mémoire, aussi appelés « nœuds », interconnectés par un réseau haut débit et basse latence. Une telle architecture est qualifiée de « distribuée ». Les calculs sont ainsi distribués sur ces nœuds qui vont chacun travailler sur une section d’une simulation, ce qui permet de réduire le temps d’exécution de simulations grâce au parallélisme. Les nœuds doivent toutefois se communiquer leurs résultats afin d’avancer dans les calculs, ce qui cause des latences. Message Passing Interface (MPI) est la solution la plus utilisée en HPC pour définir ces échanges entre nœuds de calcul. Elle définit notamment des communications point-à-point et des communications collectives. Ces communications existent en trois versions : bloquante, non-bloquante et persistante. Les communications non-bloquantes permettent une meilleure utilisation des ressources de calcul en recouvrant les communications par des calculs, ce qui permet de réduire le temps d’obtention des résultats. Cependant, ces communications non-bloquantes sont plus complexes à l’usage, et offrent moins de mécanismes de sécurité. Les développeurs sont davantage susceptibles de commettre des erreurs de programmation pouvant conduire à des blocages du programme ou corrompre les résultats. Cela conduit à une moindre popularité de ces communications pour dégager du recouvrement, en particulier de la forme collective introduite lors de la troisième révision majeure de l’interface en 2012. L’objectif de cette étude est de proposer des méthodes visant à aider les développeurs à utiliser ces communications. Premièrement, nous proposons une méthode pour associer les appels non-bloquants lors de la compilation d’un programme MPI en utilisant des informations sur le flot de contrôle et de le flot de données. Dans un deuxième temps, nous proposons une méthode pour transformer automatiquement les appels bloquants dans leur version non-bloquante. Cette méthode va ensuite réorganiser le code d’une fonction en déplaçant les dépendances des communications dans le but de maximiser la taille des intervalles de recouvrement. Cette méthode est également appliquée sur les appels non-bloquants existants en exploitant les associations trouvées par la méthode de validation. Enfin, nous exploitons les limitations de la transformation automatique afin de proposer une méthode permettant d’améliorer le potentiel de recouvrement des programmes MPI en identifiant les bornes de ces intervalles et en suggérant des modifications de code à appliquer. Les trois méthodes que nous proposons ont été implémentées via des passes LLVM, et testées sur plusieurs benchmarks, dont des miniapps et des codes CORAL.