Ada : exécution MPMD d'un couplage de codes en batch

Le modèle d’exécution MPMD (Multiple Program Multiple Data) est supporté sur Ada.Différents exécutables sont lancés et communiquent entre eux en utilisant MPI. Tous les processus MPI sont inclus au sein du même communicateur MPI_COMM_WORLD.

Sur Ada ce modèle d'exécution est réalisé à l'aide d'un fichier texte (nommé ici runfile) qui contient sur chaque ligne le nom de l'exécutable d'où sera issu le processus MPI. Les processus MPI sont générés par la commande poe et son option -pgmmode. Le processus MPI de rang i correspondra à l'exécutable placé à la ligne i+1 du fichier runfile.

Couplage MPMD de codes MPI

A titre d'exemple, voici un travail batch qui réalise le couplage de 3 codes MPI, 8 processus MPI sont générés :

  • Le processus MPI de rang 0 est issu de l'exécutable ./a.out
  • Les 4 processus MPI de rang 1 à 4 sont issus de ./b.out
  • Les 3 processus MPI de rang 5 à 7 sont issus de ./c.out
mpmd_mpi.ll
# @ job_name = mpmd
# @ output   = $(job_name).$(jobid)
# @ error    = $(output)
# @ job_type = parallel
# @ total_tasks = 8
# @ wall_clock_limit = 0:30:00
# @ queue
 
# Construction d'un fichier runfile
cat > runfile << EOF
./a.out
./b.out
./b.out
./b.out
./b.out
./c.out
./c.out
./c.out
EOF
 
# Exécution MPMD à l'aide du fichier runfile
poe -pgmmodel mpmd -cmdfile ./runfile

Couplage MPMD de codes hybrides MPI/OpenMP

Le couplage MPMD de codes hybrides MPI/OpenMP se fait de la même façon que ci-dessus à l'aide d'un fichier runfile. Il faut de plus préciser le nombre de threads OpenMP de chaque processus MPI. Cela peut être réalisé sur chaque ligne du fichier runfile à l'aide de la commande env précédant chaque exécutable faisant partie du couplage.

Le travail batch mpmd_mpi_openmp.ll réalise le couplage de 3 codes MPI/OpenMP, 13 processus MPI sont générés :

  • Le processus MPI de rang 0 est issu de l'exécutable ./a.out
  • Les 4 processus MPI de rang 1 à 4 sont issus de ./b.out. Chaque processus génère 2 threads OpenMP.
  • Les 8 processus MPI de rang 5 à 12 sont issus de ./c.out. Chaque processus génère 4 threads OpenMP.

Les ressources réservées à l'aide des directives du gestionnaire de batch LoadLeveler sont les suivantes :

  • #@total_tasks=13, il y a 13 processus MPI
  • #@parallel_threads=4, nombre de threads maximum par processus MPI

On réserve ainsi 13*4= 52 coeurs, soit 2 nœuds Ada.

mpmd_mpi_openmp.ll
# @ job_name = mpmd
# @ output   = $(job_name).$(jobid)
# @ error    = $(output)
# @ job_type = parallel
# @ total_tasks = 13
# @ parallel_threads = 4
# @ wall_clock_limit = 0:30:00
# @ queue
 
# Construction d'un fichier runfile
echo "env OMP_NUM_THREADS=1 ./a_mixte.out" > runfile
 
for i in {1..4}
do
    echo "env OMP_NUM_THREADS=2 ./b_mixte.out" >> runfile
done
 
for i in {1..8}
do
    echo "env OMP_NUM_THREADS=4 ./c_mixte.out" >> runfile
done
 
# Exécution MPMD à l'aide du fichier runfile
poe -pgmmodel mpmd -cmdfile ./runfile