Ouessant : codes batch

Les travaux sont gérés sur l'ensemble des nœuds par le logiciel LSF. Ils sont répartis dans des “classes” principalement en fonction du temps elapsed et du nombre de cœurs.

Pour soumettre un travail en batch depuis Ouessant, il faut :

  • Créer un script de soumission :

    job
    # Nom du job
    #BSUB -J monJob_test
    # Ficher output et error
    #BSUB -e %J.err
    #BSUB -o %J.out
    # Nombre de tache MPI 
    #BSUB -n 4
    # Binding
    #BSUB -a p8aff(1,1,1,balance)
    # Nombre de gpu
    #BSUB -gpu "num=4:mode=exclusive_process:mps=no:j_exclusive=yes"
    # Nombre de tache MPI par noeud
    #BSUB -R "span[ptile=4]"
    # Durée maximum du travail 
    #BSUB -W 01:00
    #BSUB -x
     
    module load xlf smpi
    # Echo des commandes et leur sortie
    set -x
     
    mpirun /pwrlocal/ibmccmpl/bin/task_prolog.sh -devices auto ./a.out
  • Soumettre ce script via la commande bsub :

      bsub < job.sh

Mode SMT

Sur chaque nœud de Ouessant, il y a deux processeurs POWER 8, chaque processeurs a 10 cœurs. Donc il y a 20 cœurs sur chaque nœud.

Les POWER 8 ont un mode (SMT) qui permet d'avoir jusqu'à 8 cœurs logiques par cœur. Le mode SMT correspond au nombre de cœur logique par cœur, par défaut on est en mode SMTx1.

L'utilisation de plusieurs cœurs logiques n'apporte pas obligatoirement de gain de performance.

Affinité des cœurs

L'application p8aff de LSF permet de spécifier l'affinité des cœurs.

p8aff(<num_threads_per_task>,<smt>,<cpus_per_core>,<distribution_policy>)

La signification de ces arguments est :

Argument Valeur Signification
<num_threads_per_task> 1-160 Nombre de thread par tache MPI ( OMP_NUM_THREADS est valorisé a cette valeur )
<smt> 1,2,4 ou 8 mode SMT
<cpu_per_core> 1-8 Nombre de cœurs logiques dans chaque cœur physique utilisé par les threads
<distribution_policy> balance ou pack Politique de distribution MPI

La politique de distribution permet de définir comment sont distribués les processus MPI sur les POWER 8

  • pack : les processus sont distribués d'abord sur le premier POWER 8
  • balance : les processus sont distribués entre les deux POWER 8

Dans les deux exemples suivants, on est en mode SMTx1 avec 4 processus MPI.

  • Avec la politique pack :
Power 8 #1 Power 8 #2
0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152
x x x x
* Avec la politique //balance// on a :
Power 8 #1 Power 8 #2
0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152
x x x x

Exemple de configuration

Configuration d’exécution directives LSF
1 MPI #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(1,1,1,balance)
1 MPIx20 Threads #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(20,4,1,balance)
1 MPIx40 Threads #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(40,4,2,balance)
2 MPIx10 Threads #BSUB -n 2
#BSUB -R “span[ptile=2]”
#BSUB -a p8aff(10,4,1,balance)
4 MPI #BSUB -n 4
#BSUB -R “span[ptile=4]”
#BSUB -a p8aff(1,1,1,balance)
4 MPI x 5 Threads #BSUB -n 4
#BSUB -R “span[ptile=4]”
#BSUB -a p8aff(5,4,1,balance)
20 MPI #BSUB -n 20
#BSUB -R “span[ptile=20]”
#BSUB -a p8aff(1,4,1,balance)
40 MPI #BSUB -n 40
#BSUB -R “span[ptile=40]”
#BSUB -a p8aff(1,2,1,balance)
80 MPI #BSUB -n 80
#BSUB -R “span[ptile=80]”
#BSUB -a p8aff(1,4,1,balance)

Sélection des GPUs

La sélection des GPUs se fait via la directive BSUB :

#BSUB -gpu “num=<num_gpus>:mode={shared|exclusive_process}:mps={no|yes}:j_exclusive=yes”
  • num_gpus : Nombre de GPUs à utiliser sur le nœud ( maximum 4)
  • Si on réserve 1 GPU par tache MPI, il faut utiliser mode=exclusive_process et mps=no
  • Si on utilise 1 GPU pour plusieurs taches MPI avec mps, il faut mettre mode=exclusive_process et mps=yes
  • Si on utilise 1 GPU pour plusieurs taches MPI sans mps (cette méthode est déconseillée), il faut mettre mode=shared et mps=no

Pour simplifier l'attribution des GPUs aux processus, il est conseillé d'utiliser le script /pwrlocal/ibmccmpl/bin/task_prolog.sh comme indiqué dans l'exemple plus haut.

MPI Cuda-Aware

Par défaut, l'utilisation d'appels MPI avec des buffers situés sur les GPUs a un comportement non déterminé. L'option -gpu de la commande mpirun permet d'activer la version Cuda-Aware MPI (uniquement valable pour Spectrum MPI), cette version permet d'utiliser des buffers situés sur les GPUs dans les communications.