Comment Compiler un programme ?
Pour un programme écrit en langage C, vous avez le choix entre deux compilateurs. Avec la version de GNU, la compilation se fait par la commande suivante:
$gcc programme.c -o nom_programme_executable
Par le compilateur d’Intel la commande est la suivante
$icc programme.c -o nom_programme_executable
Pour les programmes en Fortran, la compilation se fait de la manière suivante:
$ifort programme.f -o nom_programme_executable
Pour les programmes C parallélisés:
$mpicc programme.c -o nom_programme_executable
De la même manière, les programmes en Fortran parallélisés (selon la version du Fortan) :
$mpif90 programme.f -o nom_programme_executable
$mpif77 programme.f -o nom_programme_executable
Avant de procéder à la compilation, il faut penser à charger les modules d’environnement correspondant. voir FAQ: Manipulation des modules?
Comment connaître les ressources disponibles pour mon job?
Pour connaître les ressources disponibles à utiliser pour son job sur la partition extra par exemple, on utilise la commande suivante:
$sinfo -Nel -t idle -p extra
| Explication (Wake Forest University) (en) |
Comment démarrer et arrêter mon job?
Pour lancer un job, il faut créer un script bash dans lequel il faut demander des ressources (voir les exemples plus loin). Ce script est ensuite soumi au gestionnaire de file d’attente avec la commande sbatch de la manière suivante :
$sbatch mon_script
Si votre script est bien conçu, le gestionnaire de fil d’attente vous répondra de la manière suivante:
Submitted batch job XXX
XXX est l’identificateur de votre job. Suivant les ressources disponibles et vos priorités, votre job peut s’exécuter directement et avoir le status R ou bien rester en attente avec le status PD. Pour visualiser le status de votre job, on utilise la commande suivante:
$squeue
S’il existe une erreur dans votre script, le gestionnaire de fil d’attente vous transmettra un message d’erreur.
Pour arrêter un job, il faut lancer la commande suivante:
$scancel XXX
XXX étant l’identificateur de votre job
| Avant de lancer un job, il faut s’assurer que votre espace disque permet de stocker vos fichiers de résultats et que vous avez assez temps de calcul pour terminer votre job. |
Comment connaître mes accounts (mes comptes) sur le cluster al-farabi?
Pour connaître les accounts auxquels vous avez accès, taper la commande :
$sacctmgr list user withassoc name=[votre_login] format=user,account,defaultaccount
Comment demander des ressources pour mon job?
Vos besoins en terme de ressources sont décrits dans l’en-tête d’un fichier script via des directives Slurm. Vous devez en premier mentionner la partition et le compte (account) sur laquelle vous allez exécuter votre application. Ces informations vous seront fournies par administrateur.
#!/bin/bash
#SBATCH --partition=public
#SBATCH --account=areo
...
Par la suite dans le même script, vous devez mentionner les ressources nécessaires à votre job de la manière suivante:
...
#SBATCH -N 5
#SBATCH --tasks-per-node=16
...
Ces directives, demanderont une allocation de 5 nœuds à 16 cœurs chacun (par défaut, 1 tâche demande 1 cœur). Cela contraindra le gestionnaire de files d’attente à choisir les nœuds disposant de 16 cœurs.
| Attention, ces paramètres doivent correspondre aux ressources de la partition utilisée et allouées à votre compte. |
D’autres critères peuvent être spécifié via ces directives, comme la taille mémoire souhaitée ou la durée pendant laquelle les ressources seront attribuées. En règle générale, plus on sera parcimonieux dans la demande d’allocation, plus on aura de chance de voir rapidement son job passer de l’état en attente à l’état en exécution.
Par exemple, s’il est possible d’estimer précisément la durée nécessaire à une exécution, il peut être profitable de réduire au minimum la durée demandée pour la réservation. Ainsi une exécution se faisant en 3h30 pourra se faire au sein d’un job demandant 4h00 (marge de 30mn par précaution), avec la directive suivante:
#SBATCH -t 04:00:00
| Prendre un temps suffisant, car au-delà du temps demandé, l’exécution est stoppée automatiquement par Slurm. |
| Tous les arguments de la directive #SBATCH peuvent également être utilisées en arguments des commandes srun et salloc. | |
| Explication (Wake Forest University) (en) |
Exemples de script
Ce script demande 36 cœurs répartis sur 3 nœuds au minimum et 6 nœuds au maximum, les autres détails sont mentionnés comme commentaires dans le script
#! /bin/bash
#SBATCH --partition=public # Utilisation de la partition public
#SBATCH -A thermo # Utilisation du compte thermo
#SBATCH -n 36 # Utilisation de 36 coeurs
#SBATCH --job-name= myjob # myjob est le nom donné au Job
#SBATCH -N 3-6 # Utilisation d'au minimum 3 noeuds, au maximum 6
#SBATCH -t 12:00:00 # Le job sera tué au bout de 12h
#SBATCH --mem=1024 # Quantité mémoire demandée par noeud en Mo
#SBATCH --output=log-%j.out # Fichier de sortie du programme
#SBATCH --error=log-%j.err # Fichier d'erreur du programme
mpirun hello # Execution du programme hello
Si vous avez besoin d’indiquer exactement la répartition des tâches sur les noeuds, vous pouvez utiliser tout ou une partie des paramètres suivant:
...
#SBATCH -N 3 # Utilisation de 3 noeuds
#SBATCH --tasks-per-node=4 # Utilisation 4 coeurs par noeud
#SBATCH --distribution=cyclic # Utilisation cyclique
...
Répartition cyclique des tâches sur les nœuds, c’est-à-dire la 1ère tâche sur le nœud 1, la deuxième tâche sur le second nœud, la 3ème sur le 3ème nœud, puis la 4ème sur le 1er nœud et ainsi de suite.
#! /bin/bash
#SBATCH -p public # Utilisation de la partition public
#SBATCH -A turbo # Utilisation du compte turbo<
#SBATCH -N 3 # Utilisation de 3 noeuds
#SBATCH --tasks-per-node=6 # 6 tâches par noeud (par défaut 1 tâche = 1 coeur)
...
La répartition par défaut des tâches est de type block, c’est-à-dire toutes les tâches du début sur le 1er nœud, les tâches restantes sur le 2nd, etc..
...
#SBATCH --cpu_bind=verbose # produira un état donnant la correspondance tâche/noeud/coeur
...
Les commandes srun, salloc peuvent prendre les même paramètres que ceux de la directive #SBATCH. Par exemple, la commande suivante demandera 4 cœurs et lancera 1 fois par cœur la commande hostname.
$srun -n 4 hostname
farabi11
farabi11
farabi11
farabi11
Autre exemple en précisant la répartition :
$srun -n 4 --tasks-per-node=2 hostname
farabi11
farabi11
farabi12
farabi12
Comment avoir les détails sur mon job?
Il est possible d’obtenir les détails de l’état d’un job, qu’il soit en attente ou en exécution, avec les commandes scontrol ou squeue. La commande sview permet également en partie d’obtenir ces informations. Par exemple pour obtenir les détails d’un job ayant comme identificateur le numéro 32, on procède de la manière suivante:
$scontrol show job 32
Dans le cas ou mon job est en attente, quand est-ce que son exécution démarrera-t-elle?
Pour les jobs en attente, Slurm calcul périodiquement un temps probable de démarrage. pour savoir le redémarrage. Deux commandes s’offrent à vous:
$scontrol show job | grep StartTime=
$squeue -o "%S" -j
Quelles sont les partitions disponibles sur al-farabi ?
Les partitions de calcul disponibles sur le cluster sont les suivantes :
| Partitions | Priorité | Public concerné | Nbre de cores disponibles | Nbre de cores attribués | Temps de calcul Max | Default |
| vip | Haute | Chefs de laboratoire (ENPO-MA) | 264 | Selon affectation | Illimité | Non |
| enpo | Moyenne | Enseignants, doctorants (ENPO-MA) | 264 | Selon affectation | 15 jours | Non |
| extra | Basse | Enseignants, chercheurs, doctorants (extra-ENPO-MA) | 264 | Selon affectation | 15 jours | Oui |
| long | Basse | Enseignants, chercheurs, doctorants | 264 | 264 | 1 jour | Non |
Pour afficher les partitions disponibles:
$sinfo
Comment connaître le temps d’exécution maximale d’une partition?
On peut connaître le temps limite d’une partition en tapant la commande suivante:
$sinfo -o "%10P %.11L %.11l"
Quelles sont les variables d’environnement Slurm disponibles?
Dans certains cas, vos programmes ont besoin de connaître plus précisément les ressources que Slurm à mis à leur disposition. Pour cela, Slurm fourni un certain nombre de variables d’environnement, qui sont utilisables dans le script qui appelle le programme.
SLURM_NPROCS : nombre de cœurs alloués
SLURM_NNODES : nombre de nœuds alloués
SLURM_JOB_ID : job id
SLURM_JOB_NODELIST : liste des nœuds alloués, sous une forme synthétique.
Pour obtenir une liste détaillée consulter le chapitre « INPUT ENVIRONMENT VARIABLES » sur le lien suivant
Quelle est la priorité de mon job dans la file d’attente?
Quand plusieurs jobs sont en même temps en attente dans une file, Slurm calcule une priorité entre ces jobs. Le job ayant la priorité la plus élevée sera le prochain à passer en exécution. La priorité des jobs peut être vue avec la commande
$sprio -l
Le calcul de la priorité dépend de plusieurs facteurs:
- le temps d’attente déjà écoulé (AGE);
- la taille du job en nombre de cœurs : les gros jobs sont favorisés (JOBSIZE) ;
- la consommation en heures CPU sur le passé récent : plus la consommation a été faible, plus la priorité augmentera (FAIRSHARE).
- le type de partition utilisée.
Est-ce que je peux faire tourner mon programme séquentiel sur le cluster al-farabi?
Oui, toutefois vous n’allez pas bénéficier de toute la puissance de calcul de l’architecture parallèle du cluster. La demande en ressources de calcul pour un programme séquentiel devra se faire de la manière suivante:
...
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
...
Est-il possible d’être notifié par e-mail des phases d’exécution de mon job?
Oui c’est possible. Pour cela, il faut ajouter dans votre script la directive suivante:
#SBATCH --mail-type=END
#SBATCH --mail-user=toto@enp-oran.dz
On peut demander aussi une notification de l’utilisateur pour tout les changements de statuts de l’exécution du programme en utilisant la directive suivante:
...
#SBATCH --mail-type=ALL
...
| Certaines boites mail placent le mail envoyé par notre serveur dans le répertoire spam |
Comment faire tourner un programme avec OpenMP ?
Pour faire tourner un programme avec OpenMP utilisant 8 tâches parallèles en utilisant l’entête suivante:
#SBATCH --partition=public
#SBATCH --job-name=OMP_hello
#SBATCH --output=slurm.out
#SBATCH --error=slurm.err
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
export OMP_NUM_THREADS=8
./hello_openmp
La variable OMP_NUM_THREADS définit le nombre de threads par défaut à utiliser lors de l’exécution. Le programme hello se présente de la manière suivante:
#include <omp.h>
#include <stdio.h>
int main (int argc, char *argv[])
{ int nthreads, thread_id;
/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, thread_id)
{ /* Obtain thread number */
thread_id = omp_get_thread_num();
printf("Thread %d says: Hello World\n", thread_id);
/* Only master thread does this */
if (thread_id == 0)
{
nthreads = omp_get_num_threads();
printf("Thread %d reports: the number of threads are %d\n",
thread_id, nthreads);
}
}
return 0;
}
Quelles sont les erreurs courantes lors de l’exécution de la commande sbatch ?
Lorsque votre script comporte des erreurs ou bien des incohérences, la commande sbatch retournera un message qui peut vous renseigner sur le type de l’erreur. Voici une liste non exhaustive des différentes messages.
sbatch: error: Batch job submission failed: More processors requested than permitted
Le nombre de processeur demandé dans votre script est supérieur à celui disponible sur votre partition.
sbatch: error: Batch job submission failed: Requested node configuration is not available
La configuration du nœud de calcul demandée n’est pas adéquate à la configuration existante. Vérifier les ressources demandées (la quantité de mémoire, le nombre de tâche par nœud,…).
sbatch: error: Batch job submission failed: Invalid partition name specified
Le nom de la partition mentionné dans votre script est incorrect.
sbatch: error: Batch job submission failed: Invalid account or account/partition combination specified
L’association Partition/Account est incorrecte ou bien votre Account n’est pas correct. Verifiez que vos paramètres slurm fournis par l’administrateur sont bien renseignés dans votre script.
sbatch: error: Batch job submission failed: Job violates accounting policy (job submit limit, user's size and/or time limits)
Les ressources demandées ne correspondent pas aux quotas qui vous ont été attribués par l’administrateur du cluster. Vérifier les ressources demandées (Nombre de noeud de calcul, Taille de la mémoire allouée, Temps d’exécution….)
