calcul "embarrassingly parallel": codes mpi

Les prérequis

Les mêmes que ceux décrits ici, mais en plus L’exécutable qui est lancé par chdb est lui-même un programme mpi

Les précautions à pendre

ATTENTION - chdb est un outil très puissant : s’il y a une erreur dans votre exécutable produisant des effets néfastes pour le système, en particulier des entrées-sorties intensives, ceux-ci seront démultipliés. La règle d’or est donc la suivante :

AVANT DE LANCER UN EXÉCUTABLE AVEC chdb, VÉRIFIEZ QUE CELUI-CI FONCTIONNE CORRECTEMENT EN LE LANÇANT en "STANDALONE". Si le comportement de votre exécutable est correct, alors seulement vous pouvez envisager de l’utiliser avec chdb.

Initialiser l’environnement


Intel mpi

Intel mpi

Si votre code utilise intelmpi, vous devez utiliser la version intelmpi de chdb, et votre script ressemblera à cela :

module purge
module load intel/18.2 intelmpi/18.2 chdb
...

openmpi

openmpi

Si votre code utilise openmpi, vous devez utiliser la version openmpi de chdb, et votre script ressemblera à cela :

module purge
module load intel openmpi/icc/3.0.3 chdb/1.0-ompi
...

La commande chdb

Tout ce qui est expliqué ici reste valable, mais il est nécessaire de spécifier aussi le switch --mpi-slaves XX où XX représente le nombre de processes mpi qui seront lancés par chaque esclave (exemple: 4)

Les switchs suivants seront probablement également utiles :

  • --work-dir workdir Un chdir est effectué par chdb avant de lancer l’exécutable.
  • --create-environment Permet de recréer dans le répertoire de travail de chaque exécutable l’environnement dont il a besoin [1].

Vous pouvez aussi utiliser des répertoires pour l'entrée et pour la sortie (--in-type dir), cela est souvent le plus commode car ce switch remplace --work-dir et --create-environment

Limitations

Les exécutables lancés par chdb doivent actuellement respecter les limitations suivantes :

  • Ne pas se déployer sur plus d’un nœud de calcul, donc ne pas prendre plus de 36 cœurs (ou 72 si on utilise l’hyperthreading). Par contre, le job mpi peut parfaitement utiliser moins de 36 cœurs, et dans ce cas il est possible de lancer plusieurs esclaves chdb par nœud. Voir ci-dessous pour un exemple de script d’appel dans le cas d’un exécutable mpi utilisant 18 cœurs.
  • Ne pas utiliser de variables d’environnements autres que les variables définies par les modules : en effet les exécutables mpi seront exécutés dans un environnement reconstitué à partir de la liste des modules, mais pas à partir des variables d’environnement.

Un exemple de script sbatch

Le script suivant peut être utilisé pour lancer chdb sur 2 nœuds, et déclencher l’utilisation d’un programme mpi utilisant 18 cœurs.

#!/bin/bash
#SBATCH -N 2
#SBATCH -n 5

NSLAVES=$(( SLURM_NTASKS - 1 ))
NTASKS_PER_SLAVE=18

module purge
module load intel chdb/intelmpi un-autre-module

srun chdb   
  --in-dir input \
  --out-dir output \
  --on-error errors.${SLURM_JOBID}.txt \
  --report report.${SLURM_JOBID}.txt \
  --in-type txt \
  --mpi-slaves $NTASKS_PER_SLAVE \
  --work-dir %basename% \
  --create-environment '/chemin/vers/vos/inputs/*.in .' \
  --verbose \
  --command-line "progmpi >progmpi.out"
  • L2,3: Réservation de 2 nœuds et 2 esclaves par nœud ( plus le master chdb)
  • L4,5; Calcul du nombre d’esclaves et déclaration du nombre de processes mpi par esclave
    L6,7: Chargement des modules qui vont bien :
  • L8: Appel de chdb

S’il y a dans le répertoire input les fichiers : 1.txt 2.txt ... 100.txt, il va se passer les choses suivantes :

  1. Création du répertoire output
  2. Pour le fichier d’entrée 1.txt création du répertoire output/1, puis chdir dans ce répertoire
  3. Copie dans le répertoire courant des fichiers *.in se trouvant dans /chemin/vers/vos/inputs/
  4. Exécution du programme mpi progmpi avec une commande du style :
    ssh localhost "mpirun -np 18 -host localhost progmpi"

Voir aussi

calcul "embarrassingly parallel": codes non mpi

Cet article explique comment exécuter un programme unique sur un jeu de fichiers en entrée.

The chdb tutorial

In this tutorial, you’ll learn how to use chdb to run your embarassingly parallel computations. All the usecases supported by chdb will be described here.