Partage de mémoire en MPI-2 Qu’est-ce que MPI-2 ? CNAM de Lorraine Applications concurrentes : conception et outils (ACCOV/NFP103) • MPI-2 est une extension de MPI-1 … • MPI-1 : envois de messages entre processeurs d’architectures distribuées (ex : clusters) • MPI-1 : conçu il y a « longtemps » et adapté aux anciennes architectures distribuées ! 5 - Ouverture : MPI-2 • MPI-2 étend MPI-1 aux nouvelles architectures : - NUMA (Non Uniform Memory Access), - clusters de SMP, clusters de NUMA. Stéphane Vialle • MPI-2 permet d’exploiter un Parallel File System • MPI-2 permet de coupler des programmes MPI différents [email protected] http://www.metz.supelec.fr/~vialle • MPI-2 permet d’exploiter une mémoire partagée non-uniforme Partage de mémoire en MPI-2 Partage de mémoire en MPI-2 Création d’une mémoire partagée Op. d’accès à la mémoire partagée • Inspirée des « shmem » (Cray – 1990+) ? • Dénomination MPI-2 : Remote Memory Access (RMA) • Chaque processeur exécute un : MPI_Win_Create et met une partie de sa RAM dans la mémoire partagée NUMA : int MPI_Win_create ( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win) Mémoire partagée NUMA // initial address of window (choice); // size of window in bytes; // local unit size for displacements, in bytes; // info argument; // communicator; // window object returned by the call; PE-0 PE-1 3 opérations d’accès seulement (simple) + des synchronisations : • PUT : dépose des données dans une window de la mémoire partagée, • GET : lit des données dans une window de la mémoire partagée, • ACCUMULATE (combine des données à celles déjà présentes) int MPI_Put ( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win) PE-# // initial address of origin buffer (choice); // number of entries in origin buffer; // datatype of each entry in origin buffer; // rank of target; // displacement from start of window to; // target buffer; // number of entries in target buffer; // datatype of each entry in target buffer; // window object used for communication; int MPI_Get (…) int MPI_Accumulate (…, MPI_Op op, …) Partage de mémoire en MPI-2 Partage de mémoire en MPI-2 3 types de synchronisations 3 types de synchronisations II – mode « actif » à grain fin : I – mode global (using « fence ») : PUT • FENCE : « j’attends que toutes les opérations sur ma zone RMA soient terminées » Tous les processus exécutent un « FENCE » Æ sorte de barrière de synchronisation (relâchée) sur les mises à jour de l’ensemble de la mémoire partagée. Une seule opération conseillée entre deux « FENCES » !! • POST : « vous pouvez modifier ma zone RMA » PUT • START : « je souhaite modifier une zone RMA une fois autorisé » GET FENCE FENCE FENCE • COMPLETE : « j’ai fini de modifier une zone RMA autorisé » • WAIT : « j’attends la fin des modifications de ma zone RMA, et je la re-vérouille » 1 Partage de mémoire en MPI-2 Partage de mémoire en MPI-2 3 types de synchronisations 3 types de synchronisations II – mode « actif » à grain fin : Le séquencement peut être plus « serré ». III – mode « passif » à grain fin : • LOCK : « j’attend de pouvoir verrouiller la zone RMA d’un processus cible » On exploite l’aspect « relâché » des synchronisations • Je lis ou j’écris (suis seul à le faire) • UNLOCK : « je dévérouille la zone RMA d’un processus cible ». Le processus « cible » ne contrôle rien! (passif) Partage de mémoire en MPI-2 FIN 2