Conclusion#

English

Rappel de quelques concepts du parallélisme :

  • Communications et synchronisations

    • Dépendances entre processeurs

  • Scalabilité et loi d’Amdahl

    • Granularité - quantité minimale de travail à faire de manière autonome

    • Répartition de la charge

MPI dans les autres langages#

  • C et Fortran : le standard MPI est déjà défini dans ces langages.

  • C++ :

    boost::mpi::environment env(argc, argv);
    boost::mpi::communicator world;
    std::string s;
    
    if (world.rank() == 0)
        world.recv(boost::mpi::any_source, 746, s);
    

Défis de parallélisation supplémentaires#

Les codes suivants fonctionnent déjà en mode séquentiel. C’est maintenant à vous de les paralléliser avec MPI :

Pour mesurer le temps d’exécution d’un programme, la commande time srun doit être dans un script de tâche soumis avec la commande sbatch :

#!/bin/bash
#SBATCH --ntasks=4
#SBATCH … # temps, mémoire, etc.

time srun ./programme

Bonus - Notions avancées#

La bibliothèque mpi4py possède d’autres fonctionnalités :

  • Communications avec des tableaux NumPy.

  • Communications collectives avec des portions inégales.

    • Les fonctions de communication collective vues jusqu’ici envoyaient un même nombre d’éléments pour chaque processus MPI.

    • Avec mpi4py, les tableaux NumPy peuvent être divisés ou reconstruits avec un nombre différent de valeurs pour chaque processus :

      • Avec MPI.Comm.Scatterv et MPI.Comm.Gatherv.

      • Ces méthodes ne tiennent pas automatiquement compte du stockage interne des tableaux NumPy, mais seulement de la séquence contiguë de données en mémoire. Il faut donc planifier le stockage interne du tableau NumPy : en mode C, les valeurs d’une matrice 2D sont stockées ligne par ligne, alors qu’en mode Fortran elles sont stockées colonne par colonne.

        • Pour plus d’information, voir les strides.

      • Voir les exemples dans ~/cq-formation-mpi201-main/lab/scatterv.