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
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
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 :
- Création du répertoire
output
- Pour le fichier d’entrée
1.txt
création du répertoireoutput/1
, puischdir
dans ce répertoire - Copie dans le répertoire courant des fichiers
*.in
se trouvant dans/chemin/vers/vos/inputs/
- Exécution du programme
mpi progmpi
avec une commande du style :
ssh localhost "mpirun -np 18 -host localhost progmpi"