Analyse et optimisations pour les applications HPC à mémoire distribuée et adressable globalement

par Tassadit Aitkaci

Projet de thèse en Informatique

Sous la direction de Denis Barthou et de Emmanuelle Saillard.

Thèses en préparation à Bordeaux , dans le cadre de Mathématiques et Informatique , en partenariat avec LaBRI - Laboratoire Bordelais de Recherche en Informatique (laboratoire) et de Supports et Algorithmes pour les applications numériques hautes performances (SATANAS) (equipe de recherche) depuis le 09-04-2019 .


  • Résumé

    L'échelle exaflopique implique une explosion des performances, du nombre de nœuds et de cœurs, des volumes de données et des mouvements de données. Toutes ces problématiques rendront les machines de classe exaflopique difficiles à utiliser de manière efficace. Pour répondre à cette problématique, les modèles de programmation parallèle évoluent, de MPI (Message Passing Interface) [6] pour le calcul distribué couplé à un modèle à mémoire partagée comme OpenMP[7], vers des modèles de programmation qui abstraient la nature de la machine, soit partiellement avec les espaces d'adressage partagé globaux (PGAS) qui n'abstraient que la mémoire, soit totalement avec les tâches. En particulier, les modèles PGAS existent dans le paysage de la programmation distribuée depuis les années 1990, avec le shmem[8] de Cray. Les modèles PGAS se composent de : Modèles de programmation, notamment des langages, dont Unified Parallel C (UPC)[1] et Co-Array Fortran (CAF)[9] sont des représentants notables ; Modèles mémoire, qui peuvent être symétriques (catégorie des shmem, notamment OpenSHMEM[2]) ou non-symétriques (Global Arrays[10] ou GASPI[11]) ; Modèle de communication, basé sur les communications 'one-sided', appelées MPI-RMA dans le standard MPI. Ces communications ont une sémantique asynchrone (à opposer aux sémantiques non-bloquantes définies dans les règles de progression du standard MPI depuis MPI-2[12]), i.e. une communication initiée en one-sided doit pouvoir se terminer sans aucune intervention de l'émetteur ni du récepteur de la communication. Bien qu'ayant un historique proche de celui de MPI, les PGAS ne se sont pas autant imposés dans le paysage du calcul haute performance que MPI pour deux raisons principales. La première est liée aux performances : malgré la promesse de communications plus asynchrones, ce qui devrait améliorer le recouvrement calcul/communication des applications, très peu d'applications ont actuellement bénéficié de ces performances accrues. Pour beaucoup, la maturité des supports d'exécution dédiés aux PGAS, comme GasNet[3] ou ComEX[13], comparativement à celle des implémentations MPI (OpenMPI[14], MPICH[15]) est en cause. De plus, les modèles de programmation PGAS sont souvent jugés plus difficiles à utiliser que MPI car les problématiques de la programmation parallèle en mémoire partagée s'y appliquent, notamment la gestion de la concurrence, mais dans un contexte distribué. Il est donc important pour les programmeurs d'applications d'avoir des outils leur permettant de développer plus facilement des codes corrects et efficaces en PGAS. D'après un rapport récent du DOE [17], il y a un vrai manque au niveau des outils de déverminage pour aider au mieux les développeurs à déployer leurs applications sur les futures machines. Très peu d'outils existent pour aider les développeurs à vérifier et corriger leurs applications PGAS. Objectifs et contributions de la thèse L'objectif de cette thèse est de développer une analyse ayant pour but d'aider les programmeurs à développer et optimiser les codes PGAS. Cette analyse sera mixte, c'est-à-dire à la fois statique (à la compilation) et dynamique (à l'exécution). Cette combinaison statique/dynamique permet d'exploiter les avantages des deux analyses. En effet, les analyses statiques offrent une vue globale du code avec des informations relatives au comportement général de ce code, indépendamment du jeu d'entrée, mais reposent souvent sur des théories complexes et considèrent tous les états d'exécution possibles (aspect combinatoire). A l'inverse, les analyses dynamiques raisonnent sur des exécutions concrètes mais sont limitées à un jeu d'entrée et ne peuvent donc détecter que les erreurs présentes dans l'exécution analysée. Des travaux [4] ont montré qu'une telle analyse en deux phases apporte un meilleur support dans la phase de vérification et de correction des applications parallèles. Le debug statique/dynamique a déjà fait ses preuves dans l'aide à la programmation de codes MPI, notamment en proposant une aide avancée à l'utilisateur dans la détection d'erreur lors de la programmation de collectives MPI, de communications non-bloquantes, ainsi que de l'utilisation correcte de routines MPI dans le contexte de programmes MPI+threads. La plateforme PARallel COntrol flow Anomaly CHecker (PARCOACH) se base sur une analyse statique/dynamique pour détecter la source d'éventuels blocages liés aux collectives dans les applications parallèles (MPI, OpenMP, CUDA, UPC). Cette thèse propose d'étendre l'outil PARCOACH pour permettre d'aider et de guider le programmeur dans le développement de programmes PGAS, notamment par la détection des races conditions / accès illégaux ; une aide dynamique sur la réalité de ces problématiques (avec un feedback précis à l'utilisateur) ; l'optimisation d'un programme MPI en un programme PGAS ou MPI one-sided. Pour évaluer l'applicabilité des contributions de cette thèse, cette méthode d'analyse statique/dynamique sera mise en œuvre pour aider à la transformation d'un code MPI de simulation météorologique de qualité industrielle en un code PGAS fonctionnel et performant.

  • Titre traduit

    Analysis and optimizations for partitioned global address space based HPC applications


  • Résumé

    The exaflopic scale implies an explosion in performance, number of nodes and cores, data volumes and data movements. All these issues will make exaflop-class machines difficult to use effectively. To address this issue, parallel programming models are evolving from MPI (Message Passing Interface)[6] for distributed computing coupled with a shared memory model such as OpenMP[7] to programming models that abstract the nature of the machine, either partially with global shared addressing spaces (GSPs) that abstract only memory, or totally with tasks. In particular, PGAS models have existed in the distributed programming landscape since the 1990s, with Cray's shmem[8]. The PGAS models consist of: Programming models, including languages, including Unified Parallel C (UPC)[1] and Co-Array Fortran (CAF)[9] are notable representatives; Memory models, which can be symmetrical (category of shmem, in particular OpenSHMEM[2]) or asymmetrical (Global Arrays[10] or GASPI[11]); Communication model, based on one-sided communications, called MPI-RMA in the MPI standard. These communications have asynchronous semantics (to be opposed to the non-blocking semantics defined in the MPI standard progression rules since MPI-2[12]), i.e. a communication initiated in one-sided must be able to terminate without any intervention from the sender or receiver of the communication. Although with a history close to that of MPI, the PGAS have not been as prominent in the HPC landscape as MPI for two main reasons. The first is performance-related: despite the promise of more asynchronous communications, which should improve application computation/communication recovery, very few applications have currently benefited from this increased performance. For many, the maturity of execution media dedicated to PGAS, such as GasNet[3] or ComEX[13], compared to MPI implementations (OpenMPI[14], MPICH[15]) is at stake. In addition, PGAS programming models are often considered more difficult to use than MPI because the issues of parallel programming in shared memory apply, including competition management, but in a distributed context. It is therefore important for application programmers to have tools that make it easier for them to develop correct and effective PGAS code. According to a recent DOE report[17], there is a real lack of debugging tools to best help developers deploy their applications on future machines. Very few tools exist to help developers check and fix their PGAS applications. Objectives and contributions of the thesis The objective of this thesis is to develop an analysis to help programmers develop and optimize PGAS codes. This analysis will be mixed, i.e. both static (at compilation) and dynamic (at execution). This static/dynamic combination makes it possible to exploit the advantages of both analyses. Indeed, static analyses offer an overview of the code with information about the general behaviour of the code, regardless of the input set, but are often based on complex theories and consider all possible execution states (combinatorial aspect). On the other hand, dynamic analyses reason on concrete executions but are limited to an input set and can therefore only detect errors present in the analyzed execution. Work[4] has shown that such a two-phase analysis provides better support in the verification and correction phase of parallel applications. The static/dynamic debug has already proven its worth in assisting with MPI code programming, including providing advanced user assistance in error detection when programming MPI collectives, non-locking communications, and the correct use of MPI routines in the context of MPI+threads programs. The PARallel COntrol flow Anomaly CHecker (PARCOACH) platform is based on a static/dynamic analysis to detect the source of possible collective-related blockages in parallel applications (MPI, OpenMP, CUDA, UPC). This thesis proposes to extend the PARCOACH tool to help and guide the programmer in the development of PGAS programs, in particular by detecting illegal conditions / access races; dynamic help on the reality of these problems (with precise feedback to the user); optimization of an MPI program into a PGAS or one-sided MPI program.