Conclusion#
Rappel de quelques concepts du parallélisme :
Communications et synchronisations
Dépendances entre processeurs
-
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++ :
MPI 3.0 a éliminé les interfaces C++.
Boost MPI : bibliothèque pratique et très puissante pour les développeurs en 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.
Ce sont les méthodes débutant par une majuscule (voir le tutoriel).
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
.