Les prérequis
Cet article s’applique aux calculs ayant les caractéristiques suivantes :
- Un exécutable séquentiel ou multithreadé est appliqué de manière répétitive sur un ensemble de fichiers d’entrée
- Les noms des fichiers d’entrée se terminent tous par la même extension
- Il n’y a pas de dépendance entre les différents traitements
- Il n’y a donc pas de communication entre eux
- Il est possible de lancer plusieurs instances de l’exécutable simultanément.
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
L’environnement doit être initialisé :
module load chdb/1.0
La commande chdb
chdb
permet d’exécuter un programme présentant les caractéristiques ci-dessus sur un nombre arbitraire de processeurs et de nœuds.
Lire la documentation
chdb --help
On doit passer les paramètres suivants :
--in-dir
Le nom du répertoire dans lequel se trouvent les fichiers d’entrée. Ce répertoire doit exister--in-type
L’extension des fichiers que l’on considère comme fichiers d’entrée. Par exempletxt
,pdb
, etc.--out-files
Le nom du ou des fichiers créés par la commande, pour chaque exécution de la commande le nom est bien sûr différent, on utilise des "templates" qui seront remplacés avec le nom du fichier d’entrée. S’il y a plusieurs fichiers créés, leurs noms doivent être séparés par des virgules (,)--command-line
La ligne de commande utilisée. Il est possible de mettre un morceau de shell complet (une série de commandes séparée par des | par exemple). La seule restriction est que cette commande doit lire un fichier en entrée, écrire un ou plusieurs fichiers en sortie. La commande doit être mise entre guillemets, sinon elle sera interprétée par le shell--out-dir
Le nom du répertoire contenant les fichiers de sortie. Ce répertoire ne doit pas exister au démarrage de chdb
On peut passer en outre les paramètres suivants :
--work-dir
Avant d’exécuter la commande, chdb fera un chdir dans ce répertoire. Ce répertoire est souvent le même que --outdir
, et les mêmes "templates" peuvent être utilisés.--create-environment
Vous pouvez entrer ici un "petit morceau" de code shell, qui sera exécuté après le chdir précédent et avant l’appel de la commande : cela vous permet par exemple de copier des fichiers d’entrée qui seraient obligatoirement présents dans le répertoire courant.--sort-by-size
Les fichiers présentés en entrée sont triés du plus gros au plus petit, si l’on fait l’hypothèse que le temps de traitement est proportionnel à la charge cela devrait permettre un meilleur équilibrage de la charge--block-size=10
Si on met 10 par exemple, cela signifie que les process mpi traitent les fichiers par blocs de 10. Cela permet de minimiser les communications lorsque le nombre de fichiers est important. S’il y a peu de fichiers, cette option risque par contre de générer un déséquilibrage de la charge.--in-files
Permet de ne traiter qu’une partie des fichiers du répertoire d’entrée
En cas d’erreur dans la commande exécutée :
- Si la commande exécutée renvoie un code d’erreur (c’est-à -dire un statut différent de zéro), le comportement par défaut de chdb est d’arrêter tout traitement.
- On peut toutefois modifier ce comportement en spécifiant le paramètre
--on-error
: le nom des fichiers ayant provoqué une erreur est conservé, cela permet de relancer chdb (avec des paramètres différents). - Pour cela, le paramètre
--in-files
sera utile car il permettra de ne relancer le programme que sur les fichiers d’entrée qui ont provoqué l’erreur.
Insérer chdb dans un script slurm
Le script suivant permet de lancer chdb sur 1 nœud, en utilisant 36 cœurs par nœud:
#!/bin/bash
#SBATCH -J chbd
#SBATCH -N 1
#SBATCH -n 36
#SBATCH --ntasks-per-node=36
#SBATCH --ntasks-per-core=1
#SBATCH --mail-user=toto [at] mail [dot] com
#SBATCH --mail-type=ALL
srun chdb --in-dir input --in-type txt --out-files %out-dir%/%path% --command "./mon_programme <%path% >%out-dir%/%path%"